diff --git a/package-lock.json b/package-lock.json index 39d8db4d2..565d41757 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,17 +9,16 @@ "version": "0.0.0", "hasInstallScript": true, "dependencies": { - "@algorandfoundation/algokit-subscriber": "^2.2.0", - "@algorandfoundation/algokit-utils": "^7.0.0", + "@algorandfoundation/algokit-subscriber": "3.0.1", + "@algorandfoundation/algokit-utils": "^8.1.0", "@auth0/auth0-react": "^2.2.4", - "@blockshake/defly-connect": "^1.1.6", - "@daffiwallet/connect": "^1.0.3", + "@blockshake/defly-connect": "^1.2.1", "@dnd-kit/core": "^6.1.0", "@dnd-kit/modifiers": "^7.0.0", "@dnd-kit/sortable": "^8.0.0", "@dnd-kit/utilities": "^3.2.2", "@hookform/resolvers": "^3.9.0", - "@perawallet/connect": "^1.3.5", + "@perawallet/connect": "^1.4.1", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dialog": "^1.0.5", @@ -44,10 +43,10 @@ "@tauri-apps/plugin-process": "^2.2.0", "@tauri-apps/plugin-shell": "^2.0.1", "@tauri-apps/plugin-updater": "^2.3.0", - "@txnlab/use-wallet": "^3.11.0", - "@txnlab/use-wallet-react": "^3.11.0", + "@txnlab/use-wallet": "^4.0.0-beta.5", + "@txnlab/use-wallet-react": "^4.0.0-beta.5", "@xstate/react": "^4.1.1", - "algosdk": "2.10.0", + "algosdk": "3.1.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", "cmdk": "^1.0.0", @@ -85,7 +84,7 @@ "@eslint/js": "^9.15.0", "@makerx/prettier-config": "^2.0.0", "@makerx/ts-config": "^1.0.1", - "@makerx/ts-dossier": "^3.0.0", + "@makerx/ts-dossier": "^3.0.1", "@tauri-apps/cli": "^2.0.0", "@testing-library/jest-dom": "^6.5.0", "@testing-library/react": "^14.2.2", @@ -118,7 +117,7 @@ "typescript-eslint": "^8.15.0", "vite": "^5.4.14", "vite-plugin-node-polyfills": "^0.22.0", - "vitest": "^2.1.3" + "vitest": "^2.1.8" } }, "node_modules/@actions/core": { @@ -168,27 +167,24 @@ "license": "MIT" }, "node_modules/@algorandfoundation/algokit-subscriber": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@algorandfoundation/algokit-subscriber/-/algokit-subscriber-2.2.0.tgz", - "integrity": "sha512-7LU/QDVUW9tRuYNKS9ogm89TyRun5ag7ud2WPcb+kRw+0SWTPZpu3b7sd12mRdar0QKlUs0eIiMSXloTZOw+Fg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@algorandfoundation/algokit-subscriber/-/algokit-subscriber-3.0.1.tgz", + "integrity": "sha512-NJ2Vasu4IUQcROUScpqMW8LBXAURGlKMOeFLpgKX6SXRW/SlmmyGNp1m+WbxKRcIhvAvLVDCARJYUGhsarSBxA==", "dependencies": { - "algorand-msgpack": "^1.0.1", - "buffer": "^6.0.3", - "hi-base32": "^0.5.1", "js-sha512": "^0.9.0" }, "engines": { "node": ">=18.0" }, "peerDependencies": { - "@algorandfoundation/algokit-utils": "^7.1.0", - "algosdk": ">=2.10.0 <3.0" + "@algorandfoundation/algokit-utils": "^8.0.0", + "algosdk": "^3.0.0" } }, "node_modules/@algorandfoundation/algokit-utils": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@algorandfoundation/algokit-utils/-/algokit-utils-7.1.0.tgz", - "integrity": "sha512-cetYNuqdxuWt3CyNcWPU1HWoPcsoCi4xkUD1u0/YTMSc+ttiEvPJBu2p6eS1MvCkVleG3h0N3ycEXpyS9Ox0bg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@algorandfoundation/algokit-utils/-/algokit-utils-8.1.0.tgz", + "integrity": "sha512-nxDhqi3UvnYOdxWuxTBufTnombtWLlqsq+KgYfP6wFUoS02uXwupvMhre5bry43XHoyrIwrn0+kQ6BJFkbdd/w==", "dependencies": { "buffer": "^6.0.3" }, @@ -196,7 +192,7 @@ "node": ">=20.0" }, "peerDependencies": { - "algosdk": ">=2.9.0 <3.0" + "algosdk": "^3.0.0" } }, "node_modules/@alloc/quick-lru": { @@ -269,20 +265,19 @@ } }, "node_modules/@blockshake/defly-connect": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@blockshake/defly-connect/-/defly-connect-1.1.6.tgz", - "integrity": "sha512-pgibHfWjTkfyjQhRVKR2mnnG7Vv/oBJGowphrIwdF62TkElRspsCrv/GcasZ2ipw+Wrqp3cdsE1W7GU0ZjgPwg==", - "license": "ISC", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@blockshake/defly-connect/-/defly-connect-1.2.1.tgz", + "integrity": "sha512-T9wAjPTFdc8iRiDzTqmeBRCIroWLgXmqZHwnpzuchjYZXXqbnj+zge+HS7UaNunpxGVjDUNK1ah7OR6hEqtJoQ==", "dependencies": { + "@likecoin/qr-code-styling": "^1.6.6", "@walletconnect/client": "^1.8.0", "@walletconnect/types": "^1.8.0", "bowser": "2.11.0", "buffer": "^6.0.3", - "lottie-web": "^5.9.6", - "qr-code-styling": "1.6.0-rc.1" + "lottie-web": "^5.12.2" }, "peerDependencies": { - "algosdk": "^2.1.0" + "algosdk": "^3.0.0" } }, "node_modules/@bundled-es-modules/cookie": { @@ -325,35 +320,6 @@ "node": ">=0.1.90" } }, - "node_modules/@daffiwallet/connect": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@daffiwallet/connect/-/connect-1.0.3.tgz", - "integrity": "sha512-H2YaVfvsAW57s23JpJD9cP97hJsO527YtoT/Iga/fBlUUe6akXGi5Uvz3q6KAI8jD7GJ4N3qQTpK4nFbTHmDyQ==", - "license": "ISC", - "dependencies": { - "@evanhahn/lottie-web-light": "5.8.1", - "@walletconnect/client": "^1.8.0", - "@walletconnect/types": "^1.8.0", - "bowser": "2.11.0", - "buffer": "^6.0.3", - "qr-code-styling": "^1.5.0" - }, - "peerDependencies": { - "algosdk": "^2.1.0" - } - }, - "node_modules/@daffiwallet/connect/node_modules/qr-code-styling": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/qr-code-styling/-/qr-code-styling-1.8.4.tgz", - "integrity": "sha512-uxykNuvXaPDK/jGDERDIdDvvocefbHu1oxVYi6K87FUdPPAezkBdcIeFJ8XVX2HSsyLFINile5uzfOMYpGu5ZA==", - "license": "MIT", - "dependencies": { - "qrcode-generator": "^1.4.4" - }, - "engines": { - "node": ">=18.18.0" - } - }, "node_modules/@dnd-kit/accessibility": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz", @@ -1266,6 +1232,14 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@likecoin/qr-code-styling": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@likecoin/qr-code-styling/-/qr-code-styling-1.6.6.tgz", + "integrity": "sha512-RbGK/+20bJhFZR70r8MeDvfyz3W7U5zXpykSTYOYxZGyo6wC+Y4QnbUpL+YdAtzT2ZIFeCNOcRs2W2FNrKPoaA==", + "dependencies": { + "qrcode-generator": "^1.4.3" + } + }, "node_modules/@makerx/prettier-config": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@makerx/prettier-config/-/prettier-config-2.0.1.tgz", @@ -1281,11 +1255,10 @@ "dev": true }, "node_modules/@makerx/ts-dossier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@makerx/ts-dossier/-/ts-dossier-3.0.0.tgz", - "integrity": "sha512-YdidhuUsHaowkgZp5GYp5jwHEFpT9ZKIkCQYrVO/effFn2zq45gP1+zOBKuGonO+3+sQnzjS/KBkIaCmon5kQA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@makerx/ts-dossier/-/ts-dossier-3.0.1.tgz", + "integrity": "sha512-Ga+YvywkOBtXXFTodMrk2Y83bxw0LDMoyzlidpQwwtLtQV9pV3E7JIbTO4V1YGRyIwPFJLj/7BJ23Nxvwad2/Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=16.0" } @@ -1531,10 +1504,9 @@ "license": "MIT" }, "node_modules/@perawallet/connect": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@perawallet/connect/-/connect-1.3.5.tgz", - "integrity": "sha512-JBaaS0tjipo3DcS2v5Q1lcQXqxYkVpKB3YiqV7okBnd1KQ54zcATvPwRXvpsbxttec1OpdHmkWymuTpxpx+2Ng==", - "license": "ISC", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@perawallet/connect/-/connect-1.4.1.tgz", + "integrity": "sha512-yXfpQ2SzblOBp0P2Xsneq4f0d1YsSuYrdpw2fSwivlTbc5a40hQfYiJMql+b3UdfSID/wcaPl9Vkb5cMSBxNwQ==", "dependencies": { "@evanhahn/lottie-web-light": "5.8.1", "@walletconnect/client": "^1.8.0", @@ -1544,7 +1516,7 @@ "qr-code-styling": "1.6.0-rc.1" }, "peerDependencies": { - "algosdk": "^2.1.0" + "algosdk": "^3.0.0" } }, "node_modules/@pkgjs/parseargs": { @@ -3560,12 +3532,12 @@ } }, "node_modules/@tanstack/react-store": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.6.1.tgz", - "integrity": "sha512-6gOopOpPp1cAXkEyTEv6tMbAywwFunvIdCKN/SpEiButUayjXU+Q5Sp5Y3hREN3VMR4OA5+RI5SPhhJoqP9e4w==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.0.tgz", + "integrity": "sha512-S/Rq17HaGOk+tQHV/yrePMnG1xbsKZIl/VsNWnNXt4XW+tTY8dTlvpJH2ZQ3GRALsusG5K6Q3unAGJ2pd9W/Ng==", "dependencies": { - "@tanstack/store": "0.6.0", - "use-sync-external-store": "^1.2.2" + "@tanstack/store": "0.7.0", + "use-sync-external-store": "^1.4.0" }, "funding": { "type": "github", @@ -3597,9 +3569,9 @@ } }, "node_modules/@tanstack/store": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.6.0.tgz", - "integrity": "sha512-+m2OBglsjXcLmmKOX6/9v8BDOCtyxhMmZLsRUDswOOSdIIR9mvv6i0XNKsmTh3AlYU8c1mRcodC8/Vyf+69VlQ==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.7.0.tgz", + "integrity": "sha512-CNIhdoUsmD2NolYuaIs8VfWM467RK6oIBAW4nPEKZhg1smZ+/CwtCdpURgp7nxSqOaV9oKkzdWD80+bC66F/Jg==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -3849,7 +3821,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.2.0.tgz", "integrity": "sha512-6bLkYK68zyK31418AK5fNccCdVuRnNpbxquCl8IqgFByOgWFivbiIlvb79wpSXi0O+8k8RCSsIpOquebusRVSg==", - "license": "MIT OR Apache-2.0", "dependencies": { "@tauri-apps/api": "^2.0.0" } @@ -3867,7 +3838,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-process/-/plugin-process-2.2.0.tgz", "integrity": "sha512-uypN2Crmyop9z+KRJr3zl71OyVFgTuvHFjsJ0UxxQ/J5212jVa5w4nPEYjIewcn8bUEXacRebwE6F7owgrbhSw==", - "license": "MIT OR Apache-2.0", "dependencies": { "@tauri-apps/api": "^2.0.0" } @@ -3882,10 +3852,9 @@ } }, "node_modules/@tauri-apps/plugin-updater": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-updater/-/plugin-updater-2.3.0.tgz", - "integrity": "sha512-qdzyZEUN69FZQ/nRx51fBub10tT6wffJl3DLVo9q922Gvw8Wk++rZhoD9eethPlZYbog/7RGgT8JkrfLh5BKAg==", - "license": "MIT OR Apache-2.0", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-updater/-/plugin-updater-2.3.1.tgz", + "integrity": "sha512-D1MOWDO1Pqy33gloq0iifny+vwHxMyTshzF0q0bJRwibjL5SXd1xSQwBX24TRug7K0QIu8yOnveQHzI3GcdmfA==", "dependencies": { "@tauri-apps/api": "^2.0.0" } @@ -4017,39 +3986,31 @@ } }, "node_modules/@txnlab/use-wallet": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@txnlab/use-wallet/-/use-wallet-3.11.0.tgz", - "integrity": "sha512-Lls2nLMXkt5X5KPwsROmhCKzlJQGmUrSHJFNw8fD/ZHkgHH75e0BxOsgb0CK9py1D0zgZ+ZFTKSEC3bhL78c6g==", + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@txnlab/use-wallet/-/use-wallet-4.0.0-beta.5.tgz", + "integrity": "sha512-XZKUA5maXYPwAkP2UXlUEBZGvjXjVkXfq8no0Yi5OrUguPjQ8Nd2eSZAbUKk01+lYnxtQCj+yVbILBJGqymKMw==", "dependencies": { - "@tanstack/store": "0.6.0" + "@tanstack/store": "0.7.0" }, "peerDependencies": { "@agoralabs-sh/avm-web-provider": "^1.7.0", - "@algorandfoundation/liquid-auth-use-wallet-client": "1.1.0", - "@blockshake/defly-connect": "^1.1.6", - "@perawallet/connect": "^1.3.5", - "@perawallet/connect-beta": "^2.0.21", + "@blockshake/defly-connect": "^1.2.1", + "@perawallet/connect": "^1.4.1", "@walletconnect/modal": "^2.7.0", - "@walletconnect/sign-client": "^2.17.2", - "algosdk": "^2.7.0", + "@walletconnect/sign-client": "^2.17.3", + "algosdk": "^3.0.0", "lute-connect": "^1.4.1" }, "peerDependenciesMeta": { "@agoralabs-sh/avm-web-provider": { "optional": true }, - "@algorandfoundation/liquid-auth-use-wallet-client": { - "optional": true - }, "@blockshake/defly-connect": { "optional": true }, "@perawallet/connect": { "optional": true }, - "@perawallet/connect-beta": { - "optional": true - }, "@walletconnect/modal": { "optional": true }, @@ -4062,23 +4023,22 @@ } }, "node_modules/@txnlab/use-wallet-react": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@txnlab/use-wallet-react/-/use-wallet-react-3.11.0.tgz", - "integrity": "sha512-jxnbhf/WNaa/GaHNv3YXLY/rVayAZosgLXkLs5ugOOaL9Ylf8wT9TXuzGhV5aLTXOtW8D45WC+hpUjsQjEk/fQ==", + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@txnlab/use-wallet-react/-/use-wallet-react-4.0.0-beta.5.tgz", + "integrity": "sha512-Daw8SV3tYVo7VBEpcWQZJrOnAJsizxa2VQj+xBmaF7+KLfDe369tVbQofbaJyaXJAdwSEy1OfqYkCpj01wUQUg==", "dependencies": { - "@tanstack/react-store": "0.6.1", - "@txnlab/use-wallet": "3.11.0" + "@tanstack/react-store": "0.7.0", + "@txnlab/use-wallet": "4.0.0-beta.5" }, "peerDependencies": { - "@blockshake/defly-connect": "^1.1.6", - "@magic-ext/algorand": "^23.18.0", - "@perawallet/connect": "^1.3.5", - "@perawallet/connect-beta": "^2.0.21", + "@blockshake/defly-connect": "^1.2.1", + "@magic-ext/algorand": "^23.20.0", + "@perawallet/connect": "^1.4.1", "@walletconnect/modal": "^2.7.0", - "@walletconnect/sign-client": "^2.17.2", - "algosdk": "^2.7.0", + "@walletconnect/sign-client": "^2.17.3", + "algosdk": "^3.0.0", "lute-connect": "^1.4.1", - "magic-sdk": "^28.19.0", + "magic-sdk": "^28.21.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0" }, @@ -4092,9 +4052,6 @@ "@perawallet/connect": { "optional": true }, - "@perawallet/connect-beta": { - "optional": true - }, "@walletconnect/modal": { "optional": true }, @@ -4446,14 +4403,13 @@ } }, "node_modules/@vitest/expect": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.5.tgz", - "integrity": "sha512-nZSBTW1XIdpZvEJyoP/Sy8fUg0b8od7ZpGDkTUcfJ7wz/VoZAFzFfLyxVxGFhUjJzhYqSbIpfMtl/+k/dpWa3Q==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz", + "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.5", - "@vitest/utils": "2.1.5", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", "chai": "^5.1.2", "tinyrainbow": "^1.2.0" }, @@ -4462,13 +4418,12 @@ } }, "node_modules/@vitest/mocker": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.5.tgz", - "integrity": "sha512-XYW6l3UuBmitWqSUXTNXcVBUCRytDogBsWuNXQijc00dtnU/9OqpXWp4OJroVrad/gLIomAq9aW8yWDBtMthhQ==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz", + "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.5", + "@vitest/spy": "2.1.8", "estree-walker": "^3.0.3", "magic-string": "^0.30.12" }, @@ -4493,17 +4448,15 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } }, "node_modules/@vitest/pretty-format": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.5.tgz", - "integrity": "sha512-4ZOwtk2bqG5Y6xRGHcveZVr+6txkH7M2e+nPFd6guSoN638v/1XQ0K06eOpi0ptVU/2tW/pIU4IoPotY/GZ9fw==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz", + "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", "dev": true, - "license": "MIT", "dependencies": { "tinyrainbow": "^1.2.0" }, @@ -4512,13 +4465,12 @@ } }, "node_modules/@vitest/runner": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.5.tgz", - "integrity": "sha512-pKHKy3uaUdh7X6p1pxOkgkVAFW7r2I818vHDthYLvUyjRfkKOU6P45PztOch4DZarWQne+VOaIMwA/erSSpB9g==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz", + "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.5", + "@vitest/utils": "2.1.8", "pathe": "^1.1.2" }, "funding": { @@ -4526,13 +4478,12 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.5.tgz", - "integrity": "sha512-zmYw47mhfdfnYbuhkQvkkzYroXUumrwWDGlMjpdUr4jBd3HZiV2w7CQHj+z7AAS4VOtWxI4Zt4bWt4/sKcoIjg==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz", + "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.5", + "@vitest/pretty-format": "2.1.8", "magic-string": "^0.30.12", "pathe": "^1.1.2" }, @@ -4541,11 +4492,10 @@ } }, "node_modules/@vitest/spy": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.5.tgz", - "integrity": "sha512-aWZF3P0r3w6DiYTVskOYuhBc7EMc3jvn1TkBg8ttylFFRqNN2XGD7V5a4aQdk6QiUzZQ4klNBSpCLJgWNdIiNw==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz", + "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", "dev": true, - "license": "MIT", "dependencies": { "tinyspy": "^3.0.2" }, @@ -4554,13 +4504,12 @@ } }, "node_modules/@vitest/utils": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.5.tgz", - "integrity": "sha512-yfj6Yrp0Vesw2cwJbP+cl04OC+IHFsuQsrsJBL9pyGeQXE56v1UAOQco+SR55Vf1nQzfV0QJg1Qum7AaWUwwYg==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz", + "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.5", + "@vitest/pretty-format": "2.1.8", "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" }, @@ -4885,15 +4834,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/algo-msgpack-with-bigint": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz", - "integrity": "sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==", - "license": "ISC", - "engines": { - "node": ">= 10" - } - }, "node_modules/algorand-msgpack": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/algorand-msgpack/-/algorand-msgpack-1.1.0.tgz", @@ -4904,12 +4844,11 @@ } }, "node_modules/algosdk": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/algosdk/-/algosdk-2.10.0.tgz", - "integrity": "sha512-fuw+HwHjGrH9BHMANTvtQmo2nuQarDH+pHAaR9wDB51aYTrIrhD2GtwPY0Sgd1KcqZjMfX1Z6xQaZqljUhTGLQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/algosdk/-/algosdk-3.1.0.tgz", + "integrity": "sha512-0mT+GKG5jmMyCVl0cj4uwvnPBnMwW1FCwCpsMk1n0tXPyb7deCGuCq1HlHtk6nf3sjE6te83BtfkOvIrdSTMXg==", "dependencies": { - "algo-msgpack-with-bigint": "^2.1.1", - "buffer": "^6.0.3", + "algorand-msgpack": "^1.1.0", "hi-base32": "^0.5.1", "js-sha256": "^0.9.0", "js-sha3": "^0.8.0", @@ -4925,8 +4864,7 @@ "node_modules/algosdk/node_modules/js-sha512": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", - "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==", - "license": "MIT" + "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==" }, "node_modules/ansi-escapes": { "version": "4.3.2", @@ -5229,7 +5167,6 @@ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" } @@ -5375,7 +5312,6 @@ "version": "9.1.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "license": "MIT", "engines": { "node": "*" } @@ -5647,7 +5583,6 @@ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -5717,7 +5652,6 @@ "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", "dev": true, - "license": "MIT", "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", @@ -5761,7 +5695,6 @@ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 16" } @@ -6629,7 +6562,6 @@ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -7203,11 +7135,10 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true, - "license": "MIT" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true }, "node_modules/es-object-atoms": { "version": "1.0.0", @@ -8360,8 +8291,7 @@ "node_modules/hi-base32": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/hi-base32/-/hi-base32-0.5.1.tgz", - "integrity": "sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==", - "license": "MIT" + "integrity": "sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==" }, "node_modules/highlight.js": { "version": "10.7.3", @@ -9311,8 +9241,7 @@ "node_modules/js-sha256": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", - "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", - "license": "MIT" + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" }, "node_modules/js-sha3": { "version": "0.8.0", @@ -9323,8 +9252,7 @@ "node_modules/js-sha512": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.9.0.tgz", - "integrity": "sha512-mirki9WS/SUahm+1TbAPkqvbCiCfOAAsyXeHxK1UkullnJVVqoJG2pL9ObvT05CN+tM7fxhfYm0NbXn+1hWoZg==", - "license": "MIT" + "integrity": "sha512-mirki9WS/SUahm+1TbAPkqvbCiCfOAAsyXeHxK1UkullnJVVqoJG2pL9ObvT05CN+tM7fxhfYm0NbXn+1hWoZg==" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -9349,7 +9277,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "license": "MIT", "dependencies": { "bignumber.js": "^9.0.0" } @@ -9655,8 +9582,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lru-cache": { "version": "10.4.3", @@ -9996,6 +9922,11 @@ } } }, + "node_modules/msw/node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==" + }, "node_modules/multiformats": { "version": "13.3.1", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.1.tgz", @@ -14204,15 +14135,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-to-regexp": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.0.0.tgz", - "integrity": "sha512-GAWaqWlTjYK/7SVpIUA6CTxmcg65SP30sbjdCvyYReosRkk7Z/LyHWwkK3Vu0FcIi0FNTADUs4eh1AsU5s10cg==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -14227,15 +14149,13 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/pathval": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 14.16" } @@ -16867,7 +16787,6 @@ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -16877,7 +16796,6 @@ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -16990,8 +16908,7 @@ "node_modules/tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "license": "Unlicense" + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" }, "node_modules/type-check": { "version": "0.4.0", @@ -17181,7 +17098,6 @@ "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz", "integrity": "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==", "dev": true, - "license": "MIT", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -17408,12 +17324,11 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", - "license": "MIT", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/util": { @@ -17487,7 +17402,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", "dev": true, - "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -17543,11 +17457,10 @@ } }, "node_modules/vite-node": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.5.tgz", - "integrity": "sha512-rd0QIgx74q4S1Rd56XIiL2cYEdyWn13cunYBIuqh9mpmQr7gGS0IxXoP8R6OaZtNQQLyXSWbd4rXKYUbhFpK5w==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz", + "integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==", "dev": true, - "license": "MIT", "dependencies": { "cac": "^6.7.14", "debug": "^4.3.7", @@ -17583,19 +17496,18 @@ } }, "node_modules/vitest": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.5.tgz", - "integrity": "sha512-P4ljsdpuzRTPI/kbND2sDZ4VmieerR2c9szEZpjc+98Z9ebvnXmM5+0tHEKqYZumXqlvnmfWsjeFOjXVriDG7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "2.1.5", - "@vitest/mocker": "2.1.5", - "@vitest/pretty-format": "^2.1.5", - "@vitest/runner": "2.1.5", - "@vitest/snapshot": "2.1.5", - "@vitest/spy": "2.1.5", - "@vitest/utils": "2.1.5", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz", + "integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==", + "dev": true, + "dependencies": { + "@vitest/expect": "2.1.8", + "@vitest/mocker": "2.1.8", + "@vitest/pretty-format": "^2.1.8", + "@vitest/runner": "2.1.8", + "@vitest/snapshot": "2.1.8", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", "chai": "^5.1.2", "debug": "^4.3.7", "expect-type": "^1.1.0", @@ -17607,7 +17519,7 @@ "tinypool": "^1.0.1", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.1.5", + "vite-node": "2.1.8", "why-is-node-running": "^2.3.0" }, "bin": { @@ -17622,8 +17534,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.5", - "@vitest/ui": "2.1.5", + "@vitest/browser": "2.1.8", + "@vitest/ui": "2.1.8", "happy-dom": "*", "jsdom": "*" }, @@ -17651,8 +17563,7 @@ "node_modules/vlq": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/vlq/-/vlq-2.0.4.tgz", - "integrity": "sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==", - "license": "MIT" + "integrity": "sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==" }, "node_modules/vm-browserify": { "version": "1.1.2", @@ -17857,7 +17768,6 @@ "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", "engines": { "node": ">=8.3.0" }, diff --git a/package.json b/package.json index a8d4eb3ad..84514e590 100644 --- a/package.json +++ b/package.json @@ -24,17 +24,16 @@ "postinstall": "patch-package" }, "dependencies": { - "@algorandfoundation/algokit-subscriber": "^2.2.0", - "@algorandfoundation/algokit-utils": "^7.0.0", + "@algorandfoundation/algokit-subscriber": "3.0.1", + "@algorandfoundation/algokit-utils": "^8.1.0", "@auth0/auth0-react": "^2.2.4", - "@blockshake/defly-connect": "^1.1.6", - "@daffiwallet/connect": "^1.0.3", + "@blockshake/defly-connect": "^1.2.1", "@dnd-kit/core": "^6.1.0", "@dnd-kit/modifiers": "^7.0.0", "@dnd-kit/sortable": "^8.0.0", "@dnd-kit/utilities": "^3.2.2", "@hookform/resolvers": "^3.9.0", - "@perawallet/connect": "^1.3.5", + "@perawallet/connect": "^1.4.1", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dialog": "^1.0.5", @@ -59,10 +58,10 @@ "@tauri-apps/plugin-process": "^2.2.0", "@tauri-apps/plugin-shell": "^2.0.1", "@tauri-apps/plugin-updater": "^2.3.0", - "@txnlab/use-wallet": "^3.11.0", - "@txnlab/use-wallet-react": "^3.11.0", + "@txnlab/use-wallet": "^4.0.0-beta.5", + "@txnlab/use-wallet-react": "^4.0.0-beta.5", "@xstate/react": "^4.1.1", - "algosdk": "2.10.0", + "algosdk": "3.1.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", "cmdk": "^1.0.0", @@ -100,7 +99,7 @@ "@eslint/js": "^9.15.0", "@makerx/prettier-config": "^2.0.0", "@makerx/ts-config": "^1.0.1", - "@makerx/ts-dossier": "^3.0.0", + "@makerx/ts-dossier": "^3.0.1", "@tauri-apps/cli": "^2.0.0", "@testing-library/jest-dom": "^6.5.0", "@testing-library/react": "^14.2.2", @@ -133,7 +132,7 @@ "typescript-eslint": "^8.15.0", "vite": "^5.4.14", "vite-plugin-node-polyfills": "^0.22.0", - "vitest": "^2.1.3" + "vitest": "^2.1.8" }, "release": { "branches": [ @@ -196,7 +195,6 @@ ] }, "overrides": { - "ws@>7.0.0 <7.5.9": "7.5.10", - "path-to-regexp@>= 0.2.0 <8.0.0": "8.0.0" + "ws@>7.0.0 <7.5.9": "7.5.10" } -} \ No newline at end of file +} diff --git a/src/features/abi-methods/components/decoded-abi-method-arguments.tsx b/src/features/abi-methods/components/decoded-abi-method-arguments.tsx index 3179cdb6d..f566061c0 100644 --- a/src/features/abi-methods/components/decoded-abi-method-arguments.tsx +++ b/src/features/abi-methods/components/decoded-abi-method-arguments.tsx @@ -28,13 +28,13 @@ export function DecodedAbiMethodArguments({ arguments: argumentsProp, multiline } else if (argument.type === DecodedAbiType.Application) { return ( - {argument.value} + {argument.value.toString()} ) } else if (argument.type === DecodedAbiType.Asset) { return ( - {argument.value} + {argument.value.toString()} ) } else if (argument.type === DecodedAbiType.Struct) { diff --git a/src/features/abi-methods/data/abi-method.test.tsx b/src/features/abi-methods/data/abi-method.test.tsx index 4ad541a09..7f6c62c9f 100644 --- a/src/features/abi-methods/data/abi-method.test.tsx +++ b/src/features/abi-methods/data/abi-method.test.tsx @@ -16,6 +16,7 @@ import { AppInterfaceEntity, dbConnectionAtom } from '@/features/common/data/ind import { upsertAppInterface } from '@/features/app-interfaces/data' import { getTestStore } from '@/tests/utils/get-test-store' import { DecodedAbiType } from '@/features/abi-methods/models' +import Arc32TestContractAppSpec from '@/tests/test-app-specs/test-contract.arc32.json' describe('resolving ABI method', () => { describe('for an app call with referenced asset', () => { @@ -27,7 +28,7 @@ describe('resolving ABI method', () => { myStore.set(transactionResultsAtom, new Map([[transaction.id, createReadOnlyAtomAndTimestamp(transaction)]])) myStore.set(assetResultsAtom, new Map([[asset.index, createReadOnlyAtomAndTimestamp(asset)]])) - const applicationId = transaction['application-transaction']!['application-id']! + const applicationId = transaction.applicationTransaction!.applicationId! const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { applicationId: applicationId, @@ -48,7 +49,7 @@ describe('resolving ABI method', () => { { name: 'asset', type: DecodedAbiType.Asset, - value: 705457144, + value: 705457144n, length: 9, multiline: false, }, @@ -61,7 +62,7 @@ describe('resolving ABI method', () => { myStore.set(transactionResultsAtom, new Map([[transaction.id, createReadOnlyAtomAndTimestamp(transaction)]])) myStore.set(assetResultsAtom, new Map([[asset.index, createReadOnlyAtomAndTimestamp(asset)]])) - const applicationId = transaction['application-transaction']!['application-id']! + const applicationId = transaction.applicationTransaction!.applicationId! const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { applicationId: applicationId, @@ -82,7 +83,7 @@ describe('resolving ABI method', () => { { name: 'asset', type: DecodedAbiType.Asset, - value: 705457144, + value: 705457144n, length: 9, multiline: false, }, @@ -97,7 +98,7 @@ describe('resolving ABI method', () => { const group = groupResultMother .groupWithTransactions([axferTransaction, appCallTransaction]) .withId('kk6u1A9C9x1roBZOci/4Ne3XtHOtxKRq2O7OLVCbKOc=') - .withRound(appCallTransaction['confirmed-round']!) + .withRound(appCallTransaction.confirmedRound!) .build() it('should resolve the correct data with arc32 appspec', async () => { @@ -105,7 +106,7 @@ describe('resolving ABI method', () => { myStore.set(groupResultsAtom, new Map([[group.id, createReadOnlyAtomAndTimestamp(group)]])) myStore.set(transactionResultsAtom, new Map([[appCallTransaction.id, createReadOnlyAtomAndTimestamp(appCallTransaction)]])) - const applicationId = appCallTransaction['application-transaction']!['application-id']! + const applicationId = appCallTransaction.applicationTransaction!.applicationId! const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { applicationId: applicationId, @@ -152,7 +153,7 @@ describe('resolving ABI method', () => { myStore.set(groupResultsAtom, new Map([[group.id, createReadOnlyAtomAndTimestamp(group)]])) myStore.set(transactionResultsAtom, new Map([[appCallTransaction.id, createReadOnlyAtomAndTimestamp(appCallTransaction)]])) - const applicationId = appCallTransaction['application-transaction']!['application-id']! + const applicationId = appCallTransaction.applicationTransaction!.applicationId! const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { applicationId: applicationId, @@ -201,7 +202,7 @@ describe('resolving ABI method', () => { const group = groupResultMother .groupWithTransactions([payTransaction, appCallTransaction]) .withId('V5t9TByjm6M6pY9B76O+myDggseVS6bZP1lgizX665w=') - .withRound(appCallTransaction['confirmed-round']!) + .withRound(appCallTransaction.confirmedRound!) .build() it('should resolve the correct data', async () => { @@ -209,7 +210,7 @@ describe('resolving ABI method', () => { myStore.set(groupResultsAtom, new Map([[group.id, createReadOnlyAtomAndTimestamp(group)]])) myStore.set(transactionResultsAtom, new Map([[appCallTransaction.id, createReadOnlyAtomAndTimestamp(appCallTransaction)]])) - const applicationId = appCallTransaction['application-transaction']!['application-id']! + const applicationId = appCallTransaction.applicationTransaction!.applicationId! const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { applicationId: applicationId, @@ -349,7 +350,7 @@ describe('resolving ABI method', () => { { name: 'asset', type: DecodedAbiType.Asset, - value: 705457144, + value: 705457144n, length: 9, multiline: false, }, @@ -363,7 +364,7 @@ describe('resolving ABI method', () => { { name: 'application', type: DecodedAbiType.Application, - value: 705410358, + value: 705410358n, length: 9, multiline: false, }, @@ -408,7 +409,7 @@ describe('resolving ABI method', () => { const myStore = getTestStore() myStore.set(transactionResultsAtom, new Map([[transaction.id, createReadOnlyAtomAndTimestamp(transaction)]])) - const applicationId = transaction['application-transaction']!['application-id']! + const applicationId = transaction.applicationTransaction!.applicationId! const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { applicationId: applicationId, @@ -512,4 +513,72 @@ describe('resolving ABI method', () => { expect(abiMethod).toBeUndefined() }) }) + + describe('for an inner app call with a reference to another transaction', () => { + const appCallTransaction = transactionResultMother['localnet-64YO3SCTIJQFVTHYFPD74GYCEH5ETU7RVZCGQ5WCXPIEZEWHRE5A']().build() + const group = groupResultMother + .groupWithTransactions([appCallTransaction.innerTxns![0], appCallTransaction.innerTxns![1]]) + .withId('8Dp0ZM4bEo4LexOu2AtAhOUBKKttkR2slT8aau9t7+E=') + .withRound(appCallTransaction.confirmedRound!) + .build() + + it('should resolve the correct data with arc32 appspec', async () => { + const myStore = getTestStore() + myStore.set(groupResultsAtom, new Map([[group.id, createReadOnlyAtomAndTimestamp(group)]])) + myStore.set(transactionResultsAtom, new Map([[appCallTransaction.id, createReadOnlyAtomAndTimestamp(appCallTransaction)]])) + + const applicationId = appCallTransaction.applicationTransaction!.applicationId! + const dbConnection = await myStore.get(dbConnectionAtom) + await upsertAppInterface(dbConnection, { + applicationId: applicationId, + name: 'test', + appSpecVersions: [ + { + standard: AppSpecStandard.ARC32, + appSpec: Arc32TestContractAppSpec as unknown as Arc32AppSpec, + }, + ], + lastModified: createTimestamp(), + } satisfies AppInterfaceEntity) + + const innerApplicationId = appCallTransaction.innerTxns![1].applicationTransaction!.applicationId! + await upsertAppInterface(dbConnection, { + applicationId: innerApplicationId, + name: 'test_1', + appSpecVersions: [ + { + standard: AppSpecStandard.ARC32, + appSpec: Arc32TestContractAppSpec as unknown as Arc32AppSpec, + }, + ], + lastModified: createTimestamp(), + } satisfies AppInterfaceEntity) + + const abiMethod = await myStore.get(abiMethodResolver(appCallTransaction, getGroupResultAtom)) + expect(abiMethod).toBeDefined() + expect(abiMethod!.name).toBe('inner_pay_appl') + expect(abiMethod!.arguments).toStrictEqual([ + { + name: 'appId', + type: DecodedAbiType.Uint, + value: 10019n, + length: 5, + multiline: false, + }, + ]) + + const innerAbiMethod = await myStore.get(abiMethodResolver(appCallTransaction.innerTxns![1], getGroupResultAtom)) + expect(innerAbiMethod).toBeDefined() + expect(innerAbiMethod!.name).toBe('get_pay_txn_amount') + expect(innerAbiMethod!.arguments).toStrictEqual([ + { + length: 60, + multiline: false, + name: 'pay_txn', + type: 'Transaction', + value: '64YO3SCTIJQFVTHYFPD74GYCEH5ETU7RVZCGQ5WCXPIEZEWHRE5A/inner/1', + }, + ]) + }) + }) }) diff --git a/src/features/abi-methods/data/abi-method.ts b/src/features/abi-methods/data/abi-method.ts index d739ba4a9..c6bfd688b 100644 --- a/src/features/abi-methods/data/abi-method.ts +++ b/src/features/abi-methods/data/abi-method.ts @@ -1,11 +1,8 @@ import { Atom, atom } from 'jotai' import algosdk, { ABIReferenceType, TransactionType } from 'algosdk' -import { uint8ArrayToBase64 } from '@/utils/uint8-array-to-base64' -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' import { Round } from '@/features/blocks/data/types' import { AppSpecVersion } from '@/features/app-interfaces/data/types' -import { TransactionId } from '@/features/transactions/data/types' -import { base64ToBytes } from '@/utils/base64-to-bytes' +import { TransactionId, TransactionResult } from '@/features/transactions/data/types' import { invariant } from '@/utils/invariant' import { createAppInterfaceAtom } from '@/features/app-interfaces/data' import { sum } from '@/utils/sum' @@ -16,6 +13,7 @@ import { asMethodDefinitions } from '@/features/applications/mappers' import { DecodedAbiMethod, DecodedAbiMethodArgument, DecodedAbiMethodReturn, DecodedAbiType } from '@/features/abi-methods/models' import { asDecodedAbiStruct, asDecodedAbiValue } from '../mappers' import { getLatestAppSpecVersion } from '@/features/app-interfaces/mappers' +import { uint8ArrayToBase64 } from '@/utils/uint8-array-to-base64' const MAX_LINE_LENGTH = 20 @@ -28,39 +26,45 @@ export const abiMethodResolver = ( return undefined } - const methodDefinition = await get(createMethodDefinitionAtom(transaction)) - if (!methodDefinition) return undefined + try { + const methodDefinition = await get(createMethodDefinitionAtom(transaction)) + if (!methodDefinition) return undefined - const methodArguments = await get(createMethodArgumentsAtom(transaction, methodDefinition, groupResolver)) - const methodReturn = getMethodReturn(transaction, methodDefinition) + const methodArguments = await get(createMethodArgumentsAtom(transaction, methodDefinition, groupResolver)) + const methodReturn = getMethodReturn(transaction, methodDefinition) - const multiline = - methodArguments.some((argument) => argument.multiline) || sum(methodArguments.map((arg) => arg.length)) > MAX_LINE_LENGTH + const multiline = + methodArguments.some((argument) => argument.multiline) || sum(methodArguments.map((arg) => arg.length)) > MAX_LINE_LENGTH - return { - name: methodDefinition.abiMethod.name, - arguments: methodArguments, - return: methodReturn, - multiline, - } satisfies DecodedAbiMethod + return { + name: methodDefinition.abiMethod.name, + arguments: methodArguments, + return: methodReturn, + multiline, + } satisfies DecodedAbiMethod + } catch (error) { + // eslint-disable-next-line no-console + console.error('Error decoding ABI method', error) + return undefined + } }) } const createMethodDefinitionAtom = (transaction: TransactionResult): Atom> => { return atom(async (get) => { - invariant(transaction['application-transaction'], 'application-transaction is not set') + invariant(transaction.applicationTransaction, 'application-transaction is not set') - const appInterface = await get(createAppInterfaceAtom(transaction['application-transaction']['application-id'])) + const appInterface = await get(createAppInterfaceAtom(transaction.applicationTransaction.applicationId!)) if (!appInterface) return undefined - const appSpecVersion = transaction['confirmed-round'] - ? appInterface.appSpecVersions.find((appSpecVersion) => isValidAppSpecVersion(appSpecVersion, transaction['confirmed-round']!)) + const appSpecVersion = transaction.confirmedRound + ? appInterface.appSpecVersions.find((appSpecVersion) => isValidAppSpecVersion(appSpecVersion, transaction.confirmedRound!)) : getLatestAppSpecVersion(appInterface.appSpecVersions) - const transactionArgs = transaction['application-transaction']['application-args'] ?? [] + const transactionArgs = transaction.applicationTransaction!.applicationArgs ?? [] if (transactionArgs.length && appSpecVersion) { const methods = asMethodDefinitions(appSpecVersion.appSpec) return methods.find((m) => { - return uint8ArrayToBase64(m.abiMethod.getSelector()) === transactionArgs[0] + return uint8ArrayToBase64(m.abiMethod.getSelector()) === uint8ArrayToBase64(transactionArgs[0]) }) } return undefined @@ -73,8 +77,8 @@ const createMethodArgumentsAtom = ( groupResolver: (groupId: GroupId, round: Round) => AsyncMaybeAtom ): Atom> => { return atom(async (get) => { - invariant(transaction['application-transaction'], 'application-transaction is not set') - invariant(transaction['application-transaction']?.['application-args'], 'application-transaction application-args is not set') + invariant(transaction.applicationTransaction, 'application-transaction is not set') + invariant(transaction.applicationTransaction.applicationArgs, 'application-transaction application-args is not set') const referencedTransactionIds = await get(getReferencedTransactionIdsAtom(transaction, methodDefinition.abiMethod, groupResolver)) const abiValues = getAbiValueArgs(transaction, methodDefinition.abiMethod) @@ -96,8 +100,8 @@ const createMethodArgumentsAtom = ( const abiValue = abiValues.shift()! if (argumentDefinition.type === ABIReferenceType.asset) { - invariant(transaction['application-transaction']?.['foreign-assets'], 'application-transaction foreign-assets is not set') - const assetId = transaction['application-transaction']['foreign-assets'][Number(abiValue)] + invariant(transaction.applicationTransaction?.foreignAssets, 'application-transaction foreign-assets is not set') + const assetId = transaction.applicationTransaction.foreignAssets[Number(abiValue)] return { name: argName, type: DecodedAbiType.Asset, @@ -107,12 +111,12 @@ const createMethodArgumentsAtom = ( } } if (argumentDefinition.type === ABIReferenceType.account) { - invariant(transaction['application-transaction']?.['accounts'], 'application-transaction accounts is not set') + invariant(transaction.applicationTransaction?.accounts, 'application-transaction accounts is not set') // Index 0 of application accounts is the sender const accountIndex = Number(abiValue) const accountAddress = - accountIndex === 0 ? transaction.sender : transaction['application-transaction']['accounts'][accountIndex - 1] + accountIndex === 0 ? transaction.sender : transaction.applicationTransaction.accounts[accountIndex - 1].toString() return { name: argName, type: DecodedAbiType.Account, @@ -122,18 +126,22 @@ const createMethodArgumentsAtom = ( } } if (argumentDefinition.type === ABIReferenceType.application) { - invariant(transaction['application-transaction']?.['foreign-apps'], 'application-transaction foreign-apps is not set') + invariant(transaction.applicationTransaction?.foreignApps, 'application-transaction foreign-apps is not set') // Index 0 of foreign apps is the called app const applicationIndex = Number(abiValue) const applicationId = - applicationIndex === 0 ? transaction.applicationId : transaction['application-transaction']['foreign-apps'][applicationIndex - 1] + applicationIndex === 0 + ? transaction.createdApplicationIndex + ? transaction.createdApplicationIndex + : transaction.applicationTransaction.applicationId + : transaction.applicationTransaction.foreignApps[applicationIndex - 1] return { name: argName, type: DecodedAbiType.Application, - value: applicationId, + value: applicationId!, multiline: false, - length: applicationId.toString().length, + length: applicationId!.toString().length, } } @@ -160,7 +168,7 @@ const getMethodReturn = (transaction: TransactionResult, methodDefinition: Metho const abiType = algosdk.ABIType.from(methodDefinition.returns.type.toString()) // The first 4 bytes are SHA512_256 hash of the string "return" - const bytes = base64ToBytes(transaction.logs.slice(-1)[0]).subarray(4) + const bytes = Uint8Array.from(transaction.logs.slice(-1)[0].subarray(4)) const abiValue = abiType.decode(bytes) if (methodDefinition.returns.struct) { @@ -172,13 +180,13 @@ const getMethodReturn = (transaction: TransactionResult, methodDefinition: Metho const isPossibleAbiAppCallTransaction = (transaction: TransactionResult): boolean => { return ( - transaction['tx-type'] === TransactionType.appl && - transaction['application-transaction'] !== undefined && - transaction['confirmed-round'] !== undefined && - Boolean(transaction['application-transaction']['application-id']) && - transaction['application-transaction']['application-args'] !== undefined && - transaction['application-transaction']['application-args'].length > 0 && - base64ToBytes(transaction['application-transaction']['application-args'][0]).length === 4 + transaction.txType === TransactionType.appl && + transaction.applicationTransaction !== undefined && + transaction.confirmedRound !== undefined && + Boolean(transaction.applicationTransaction.applicationId) && + transaction.applicationTransaction.applicationArgs !== undefined && + transaction.applicationTransaction.applicationArgs.length > 0 && + transaction.applicationTransaction.applicationArgs[0].length === 4 ) } @@ -193,9 +201,8 @@ const getReferencedTransactionIdsAtom = ( return [] } - invariant(transaction['confirmed-round'] !== undefined && transaction['group'], 'Cannot get referenced transactions without a group') - - const group = await get(groupResolver(transaction['group'], transaction['confirmed-round'])) + invariant(transaction.confirmedRound !== undefined && transaction.group, 'Cannot get referenced transactions without a group') + const group = await get(groupResolver(uint8ArrayToBase64(transaction.group), transaction.confirmedRound)) const transactionIndexInGroup = group.transactionIds.findIndex((id) => id === transaction.id) const transactionTypeArgsCount = abiMethod.args.filter((arg) => algosdk.abiTypeIsTransaction(arg.type)).length return group.transactionIds.slice(transactionIndexInGroup - transactionTypeArgsCount, transactionIndexInGroup) @@ -203,11 +210,11 @@ const getReferencedTransactionIdsAtom = ( } const getAbiValueArgs = (transaction: TransactionResult, abiMethod: algosdk.ABIMethod): algosdk.ABIValue[] => { - invariant(transaction['application-transaction'], 'application-transaction is not set') - invariant(transaction['application-transaction']?.['application-args'], 'application-transaction application-args is not set') + invariant(transaction.applicationTransaction, 'application-transaction is not set') + invariant(transaction.applicationTransaction.applicationArgs, 'application-transaction application-args is not set') // The first arg is the method selector - const transactionArgs = transaction['application-transaction']['application-args'].slice(1) + const transactionArgs = transaction.applicationTransaction.applicationArgs.slice(1) const nonTransactionTypeArgs = abiMethod.args.filter((arg) => !algosdk.abiTypeIsTransaction(arg.type)) // If there are more than 15 args, the args from 15 to the end are encoded inside a tuple @@ -224,7 +231,7 @@ const getAbiValueArgs = (transaction: TransactionResult, abiMethod: algosdk.ABIM ) ) - const bytes = base64ToBytes(transactionArgs[14]) + const bytes = transactionArgs[14] results.push(...tupleType.decode(bytes)) return results @@ -233,17 +240,23 @@ const getAbiValueArgs = (transaction: TransactionResult, abiMethod: algosdk.ABIM } } -const mapAbiArgumentToAbiValue = (type: algosdk.ABIArgumentType, value: string) => { - const bytes = base64ToBytes(value) +const mapAbiArgumentToAbiValue = (type: algosdk.ABIArgumentType, value: Uint8Array) => { if (type === ABIReferenceType.asset || type === ABIReferenceType.application || type === ABIReferenceType.account) { - return new algosdk.ABIUintType(8).decode(bytes) + return new algosdk.ABIUintType(8).decode(value) } const abiType = algosdk.ABIType.from(type.toString()) - return abiType.decode(bytes) + return abiType.decode(value) } const isValidAppSpecVersion = (appSpec: AppSpecVersion, round: Round) => { - const roundFirstValid = appSpec.roundFirstValid ?? -1 - const roundLastValid = appSpec.roundLastValid ?? Number.MAX_SAFE_INTEGER - return roundFirstValid <= round && round <= roundLastValid + if (appSpec.roundFirstValid === undefined && appSpec.roundLastValid === undefined) { + return true + } + if (appSpec.roundFirstValid === undefined) { + return round <= appSpec.roundLastValid! + } + if (appSpec.roundLastValid === undefined) { + return round >= appSpec.roundFirstValid! + } + return round >= appSpec.roundFirstValid! && round <= appSpec.roundLastValid! } diff --git a/src/features/abi-methods/mappers/form-schema-mappers.ts b/src/features/abi-methods/mappers/form-schema-mappers.ts index 7c75b079d..2ecf95ed2 100644 --- a/src/features/abi-methods/mappers/form-schema-mappers.ts +++ b/src/features/abi-methods/mappers/form-schema-mappers.ts @@ -13,8 +13,8 @@ export const abiTypeToFormFieldSchema = (type: algosdk.ABIType, isOptional: bool return bigIntSchema(isOptional ? uintSchema.optional() : uintSchema) } if (type instanceof algosdk.ABIByteType) { - const uintSchema = z.number().min(0).max(255, `Value must be less than or equal to 255`) - return numberSchema(isOptional ? uintSchema.optional() : uintSchema) + const byteSchema = z.number().min(0).max(255, `Value must be less than or equal to 255`) + return numberSchema(isOptional ? byteSchema.optional() : byteSchema) } if (type instanceof algosdk.ABIBoolType) { const boolSchema = z @@ -76,7 +76,7 @@ export const abiTypeToFormFieldSchema = (type: algosdk.ABIType, isOptional: bool export const abiReferenceTypeToFormFieldSchema = (type: algosdk.ABIReferenceType): z.ZodTypeAny => { if (type === algosdk.ABIReferenceType.asset || type === algosdk.ABIReferenceType.application) { - return numberSchema(z.number().min(0)) + return bigIntSchema(z.bigint().min(0n)) } if (type === algosdk.ABIReferenceType.account) { return addressFieldSchema diff --git a/src/features/abi-methods/models/index.ts b/src/features/abi-methods/models/index.ts index a242ca1b9..09e6ae9d5 100644 --- a/src/features/abi-methods/models/index.ts +++ b/src/features/abi-methods/models/index.ts @@ -1,4 +1,6 @@ +import { ApplicationId } from '@/features/applications/data/types' import { StructDefinition } from '@/features/applications/models' +import { AssetId } from '@/features/assets/data/types' import { AddressOrNfd } from '@/features/transaction-wizard/models' import { AVMType } from '@algorandfoundation/algokit-utils/types/app-arc56' import algosdk from 'algosdk' @@ -67,8 +69,8 @@ export type DecodedAbiValue = export type DecodedAbiReference = | ({ type: DecodedAbiType.Account; value: string } & RepresentationProps) - | ({ type: DecodedAbiType.Application; value: number } & RepresentationProps) - | ({ type: DecodedAbiType.Asset; value: number } & RepresentationProps) + | ({ type: DecodedAbiType.Application; value: ApplicationId } & RepresentationProps) + | ({ type: DecodedAbiType.Asset; value: AssetId } & RepresentationProps) export type DecodedAbiTransaction = { type: DecodedAbiType.Transaction; value: string } & RepresentationProps diff --git a/src/features/abi-methods/utils/parse-errors.ts b/src/features/abi-methods/utils/parse-errors.ts index d39b7a401..ddae40c98 100644 --- a/src/features/abi-methods/utils/parse-errors.ts +++ b/src/features/abi-methods/utils/parse-errors.ts @@ -1,7 +1,6 @@ import { getApplicationResultAtom } from '@/features/applications/data' import { dataStore } from '@/features/common/data/data-store' import { BuildableTransactionType, BuildMethodCallTransactionResult, BuildTransactionResult } from '@/features/transaction-wizard/models' -import { base64ToBytes } from '@/utils/base64-to-bytes' import { asError } from '@/utils/error' import { AppClient } from '@algorandfoundation/algokit-utils/types/app-client' import algosdk from 'algosdk' @@ -79,11 +78,11 @@ const parseErrorForTransaction = async (e: unknown, groupIndex: number, transact transaction.onComplete === algosdk.OnApplicationComplete.ClearStateOC ? { isClearStateProgram: true, - program: base64ToBytes(applicationResult.params['clear-state-program']), + program: applicationResult.params.clearStateProgram, } : { isClearStateProgram: false, - program: base64ToBytes(applicationResult.params['approval-program']), + program: applicationResult.params.approvalProgram, } ) diff --git a/src/features/accounts/components/account-applications.tsx b/src/features/accounts/components/account-applications.tsx index bb137f5a8..ef0f6b9c1 100644 --- a/src/features/accounts/components/account-applications.tsx +++ b/src/features/accounts/components/account-applications.tsx @@ -3,6 +3,7 @@ import { AccountApplicationSummary } from '../models' import { ColumnDef } from '@tanstack/react-table' import { ApplicationLink } from '@/features/applications/components/application-link' import { ApplicationSummary } from '@/features/applications/models' +import { ApplicationId } from '@/features/applications/data/types' type Props = { applications: AccountApplicationSummary[] @@ -12,7 +13,7 @@ const applicationsTableColumns: ColumnDef[] = [ { header: 'ID', accessorFn: (item) => item.id, - cell: (c) => ()} />, + cell: (c) => ()} />, }, ] diff --git a/src/features/accounts/components/account-asset-holdings-table-columns.tsx b/src/features/accounts/components/account-asset-holdings-table-columns.tsx index e57ce1c27..da3abd4f8 100644 --- a/src/features/accounts/components/account-asset-holdings-table-columns.tsx +++ b/src/features/accounts/components/account-asset-holdings-table-columns.tsx @@ -5,12 +5,13 @@ import { AssetIdLink } from '@/features/assets/components/asset-link' import { AssetSummary } from '@/features/assets/models' import { AsyncMaybeAtom } from '@/features/common/data/types' import { RenderInlineAsyncAtom } from '@/features/common/components/render-inline-async-atom' +import { AssetId } from '@/features/assets/data/types' export const accountAssetHoldingsTableColumns: ColumnDef[] = [ { header: 'ID', accessorFn: (item) => item.assetId, - cell: (c) => ()} />, + cell: (c) => ()} />, }, { header: 'Name', diff --git a/src/features/accounts/components/account-assets-created.tsx b/src/features/accounts/components/account-assets-created.tsx index fb0a6f62c..28da33bbc 100644 --- a/src/features/accounts/components/account-assets-created.tsx +++ b/src/features/accounts/components/account-assets-created.tsx @@ -5,6 +5,7 @@ import { AccountAssetSummary } from '../models' import { AssetSummary } from '@/features/assets/models' import { AsyncMaybeAtom } from '@/features/common/data/types' import { RenderInlineAsyncAtom } from '@/features/common/components/render-inline-async-atom' +import { AssetId } from '@/features/assets/data/types' type Props = { assetsCreated: AccountAssetSummary[] @@ -14,7 +15,7 @@ const assetsCreatedTableColumns: ColumnDef[] = [ { header: 'ID', accessorFn: (item) => item.assetId, - cell: (c) => ()} />, + cell: (c) => ()} />, }, { header: 'Name', diff --git a/src/features/accounts/components/account-link.tsx b/src/features/accounts/components/account-link.tsx index e9da0eb24..dbf94c757 100644 --- a/src/features/accounts/components/account-link.tsx +++ b/src/features/accounts/components/account-link.tsx @@ -5,7 +5,7 @@ import { AddressOrNfdLink, AddressOrNfdLinkProps } from './address-or-nfd-link' export type Props = Omit export const AccountLink = ({ address, ...rest }: Props) => { - const loadableNfd = useLoadableReverseLookupNfdResult(address) + const loadableNfd = useLoadableReverseLookupNfdResult(address.toString()) return ( <> diff --git a/src/features/accounts/components/account-live-transactions.tsx b/src/features/accounts/components/account-live-transactions.tsx index c49a794a4..3dda3f8e6 100644 --- a/src/features/accounts/components/account-live-transactions.tsx +++ b/src/features/accounts/components/account-live-transactions.tsx @@ -1,5 +1,5 @@ import { LiveTransactionsTable } from '@/features/transactions/components/live-transactions-table' -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' import { useCallback } from 'react' import { Address } from '../data/types' import { getAddressesForTransaction } from '../utils/get-account-address-for-transactions' diff --git a/src/features/accounts/components/address-or-nfd-link.tsx b/src/features/accounts/components/address-or-nfd-link.tsx index f09dfdebc..a98def9c8 100644 --- a/src/features/accounts/components/address-or-nfd-link.tsx +++ b/src/features/accounts/components/address-or-nfd-link.tsx @@ -7,9 +7,10 @@ import { Urls } from '@/routes/urls' import { ellipseAddress } from '@/utils/ellipse-address' import { Nfd } from '@/features/nfd/data/types' import { PropsWithChildren } from 'react' +import { Address } from 'algosdk' export type AddressOrNfdLinkProps = PropsWithChildren<{ - address: string + address: string | Address short?: boolean className?: string showCopyButton?: boolean @@ -18,10 +19,11 @@ export type AddressOrNfdLinkProps = PropsWithChildren<{ export const AddressOrNfdLink = fixedForwardRef( ( - { address, nfd, short, className, children, showCopyButton, ...rest }: AddressOrNfdLinkProps, + { address: _address, nfd, short, className, children, showCopyButton, ...rest }: AddressOrNfdLinkProps, ref?: React.LegacyRef ) => { const [selectedNetwork] = useSelectedNetwork() + const address = typeof _address === 'string' ? _address : _address.toString() const link = ( { try { @@ -12,7 +13,7 @@ const getAccountResult = async (address: Address) => { .accountInformation(address) .do() .then((result) => { - return result as AccountResult + return removeEncodableMethods(result) as AccountResult }) } catch (e: unknown) { const error = asError(e) @@ -23,7 +24,7 @@ const getAccountResult = async (address: Address) => { .exclude('all') .do() .then((result) => { - return result as AccountResult + return removeEncodableMethods(result) as AccountResult }) } throw e @@ -35,7 +36,7 @@ const syncAssociatedDataAndReturnAccountResult = async (get: Getter, set: Setter const assetResults = get(assetResultsAtom) const applicationResults = get(applicationResultsAtom) - const assetsToAdd = (accountResult['created-assets'] ?? []).filter((a) => !assetResults.has(a.index)) + const assetsToAdd = (accountResult.createdAssets ?? []).filter((a) => !assetResults.has(a.index)) if (assetsToAdd.length > 0) { set(assetResultsAtom, (prev) => { const next = new Map(prev) @@ -47,7 +48,7 @@ const syncAssociatedDataAndReturnAccountResult = async (get: Getter, set: Setter return next }) } - const applicationsToAdd = (accountResult['created-apps'] ?? []).filter((a) => !applicationResults.has(a.id)) + const applicationsToAdd = (accountResult.createdApps ?? []).filter((a) => !applicationResults.has(a.id)) if (applicationsToAdd.length > 0) { set(applicationResultsAtom, (prev) => { const next = new Map(prev) diff --git a/src/features/accounts/data/account-transaction-history.ts b/src/features/accounts/data/account-transaction-history.ts index bf04766b6..5ecf4643c 100644 --- a/src/features/accounts/data/account-transaction-history.ts +++ b/src/features/accounts/data/account-transaction-history.ts @@ -1,23 +1,24 @@ import { Address } from '../data/types' import { createReadOnlyAtomAndTimestamp } from '@/features/common/data' -import { TransactionResult, TransactionSearchResults } from '@algorandfoundation/algokit-utils/types/indexer' import { createTransactionsAtom, transactionResultsAtom } from '@/features/transactions/data' import { atomEffect } from 'jotai-effect' import { atom } from 'jotai' import { createLoadableViewModelPageAtom } from '@/features/common/data/lazy-load-pagination' import { DEFAULT_FETCH_SIZE } from '@/features/common/constants' import { indexer } from '@/features/common/data/algo-client' +import { TransactionResult } from '@/features/transactions/data/types' +import { indexerTransactionToTransactionResult } from '@/features/transactions/mappers/indexer-transaction-mappers' const getAccountTransactionResults = async (address: Address, nextPageToken?: string) => { - const results = (await indexer + const results = await indexer .searchForTransactions() .address(address) .nextToken(nextPageToken ?? '') .limit(DEFAULT_FETCH_SIZE) - .do()) as TransactionSearchResults + .do() return { - transactionResults: results.transactions, - nextPageToken: results['next-token'], + transactionResults: results.transactions.map((transaction) => indexerTransactionToTransactionResult(transaction)), + nextPageToken: results.nextToken, } as const } diff --git a/src/features/accounts/data/types.ts b/src/features/accounts/data/types.ts index 1cb240ce3..72b54b994 100644 --- a/src/features/accounts/data/types.ts +++ b/src/features/accounts/data/types.ts @@ -1,42 +1,45 @@ -import { ApplicationResult } from '@/features/applications/data/types' -import { NoStringIndex } from '@/features/common/data/types' -import { - AssetHolding as IndexerAssetHolding, - AssetResult as IndexerAssetResult, - AppLocalState as IndexerAppLocalState, - AccountResult as IndexerAccountResult, - SignatureType, -} from '@algorandfoundation/algokit-utils/types/indexer' +import { ApplicationResult, ApplicationStateSchema } from '@/features/applications/data/types' +import { AssetResult } from '@/features/assets/data/types' +import { SignatureType } from '@algorandfoundation/algokit-utils/types/indexer' +import algosdk from 'algosdk' export type Address = string -export type AppLocalState = Omit -export type AssetHoldingResult = Omit -export type AssetResult = { - index: number - params: IndexerAssetResult['params'] +export type AppLocalState = Omit< + algosdk.indexerModels.ApplicationLocalState, + 'getEncodingSchema' | 'toEncodingData' | 'closedOutAtRound' | 'deleted' | 'optedInAtRound' | 'schema' +> & { + schema: ApplicationStateSchema } +export type AssetHoldingResult = Omit< + algosdk.indexerModels.AssetHolding, + 'getEncodingSchema' | 'toEncodingData' | 'deleted' | 'optedInAtRound' | 'optedOutAtRound' +> export type AccountResult = Omit< - NoStringIndex, - | 'closed-at-round' - | 'created-at-round' + algosdk.indexerModels.Account, + | 'getEncodingSchema' + | 'toEncodingData' + | 'closedAtRound' + | 'createdAtRound' | 'deleted' - | 'apps-local-state' + | 'appsLocalState' | 'assets' - | 'created-apps' - | 'created-assets' - | 'min-balance' - | 'total-box-bytes' - | 'total-boxes' - | 'sig-type' + | 'createdApps' + | 'createdAssets' + | 'sigType' + | 'appsTotalSchema' + | 'totalBoxBytes' + | 'totalBoxes' + | 'minBalance' > & { - 'apps-local-state'?: AppLocalState[] + appsLocalState?: AppLocalState[] assets?: AssetHoldingResult[] - 'created-apps'?: ApplicationResult[] - 'created-assets'?: AssetResult[] - 'min-balance': number - 'total-box-bytes'?: number - 'total-boxes'?: number - 'sig-type'?: SignatureType + createdApps?: ApplicationResult[] + createdAssets?: AssetResult[] + sigType?: SignatureType + appsTotalSchema?: ApplicationStateSchema + totalBoxBytes?: number + totalBoxes?: number + minBalance: bigint } diff --git a/src/features/accounts/mappers/index.ts b/src/features/accounts/mappers/index.ts index 3df42d776..3bf2c5665 100644 --- a/src/features/accounts/mappers/index.ts +++ b/src/features/accounts/mappers/index.ts @@ -1,46 +1,47 @@ import { AssetSummary } from '@/features/assets/models' -import { AccountResult, AssetHoldingResult, AssetResult } from '../data/types' +import { AccountResult, AssetHoldingResult } from '../data/types' import { Account, AccountAssetSummary, AssetHolding } from '../models' import { microAlgos } from '@algorandfoundation/algokit-utils' import { AsyncMaybeAtom } from '@/features/common/data/types' -import { asJson } from '@/utils/as-json' +import { asJson, normaliseAlgoSdkData } from '@/utils/as-json' +import { AssetId, AssetResult } from '@/features/assets/data/types' -export const asAccount = (accountResult: AccountResult, assetResolver: (assetId: number) => AsyncMaybeAtom): Account => { +export const asAccount = (accountResult: AccountResult, assetResolver: (assetId: AssetId) => AsyncMaybeAtom): Account => { const [assetsHeld, assetsOpted] = asAssetHoldings(accountResult.assets ?? [], assetResolver) return { address: accountResult.address, balance: microAlgos(accountResult.amount), - minBalance: microAlgos(accountResult['min-balance']), - totalApplicationsCreated: accountResult['total-created-apps'], - applicationsCreated: (accountResult['created-apps'] ?? []).map((app) => ({ id: app.id })), - totalApplicationsOptedIn: accountResult['total-apps-opted-in'], - applicationsOpted: (accountResult['apps-local-state'] ?? []).map((app) => ({ id: app.id })), + minBalance: microAlgos(accountResult.minBalance), + totalApplicationsCreated: accountResult.totalCreatedApps, + applicationsCreated: (accountResult.createdApps ?? []).map((app) => ({ id: app.id })), + totalApplicationsOptedIn: accountResult.totalAppsOptedIn, + applicationsOpted: (accountResult.appsLocalState ?? []).map((app) => ({ id: app.id })), totalAssetsHeld: accountResult.assets !== undefined ? assetsHeld.length : undefined, assetsHeld, - totalAssetsCreated: accountResult['total-created-assets'], - assetsCreated: asAccountAssetSummaries(accountResult['created-assets'] ?? [], assetResolver), - totalAssetsOptedIn: accountResult['total-assets-opted-in'], + totalAssetsCreated: accountResult.totalCreatedAssets, + assetsCreated: asAccountAssetSummaries(accountResult.createdAssets ?? [], assetResolver), + totalAssetsOptedIn: accountResult.totalAssetsOptedIn, assetsOpted, - rekeyedTo: accountResult['auth-addr'], - json: asJson(accountResult), + rekeyedTo: accountResult.authAddr?.toString(), + json: asJson(normaliseAlgoSdkData(accountResult)), } } const asAssetHoldings = ( heldAssets: AssetHoldingResult[], - assetResolver: (assetId: number) => AsyncMaybeAtom + assetResolver: (assetId: AssetId) => AsyncMaybeAtom ): [AssetHolding[], AssetHolding[]] => heldAssets.reduce( (acc, result) => { - const assetId = result['asset-id'] + const assetId = result.assetId const asset = { assetId, asset: assetResolver(assetId), amount: result.amount, - isFrozen: result['is-frozen'], + isFrozen: result.isFrozen, } - if (result.amount === 0) { + if (result.amount === 0n) { acc[1].push(asset) } else { acc[0].push(asset) @@ -52,7 +53,7 @@ const asAssetHoldings = ( const asAccountAssetSummaries = ( createdAssets: AssetResult[], - assetResolver: (assetId: number) => AsyncMaybeAtom + assetResolver: (assetId: AssetId) => AsyncMaybeAtom ): AccountAssetSummary[] => createdAssets.map((asset) => { return { diff --git a/src/features/accounts/pages/account-page.test.tsx b/src/features/accounts/pages/account-page.test.tsx index c74aff98d..8769b85e0 100644 --- a/src/features/accounts/pages/account-page.test.tsx +++ b/src/features/accounts/pages/account-page.test.tsx @@ -78,9 +78,9 @@ describe('account-page', () => { describe('when rendering an account', () => { const accountResult = accountResultMother['mainnet-BIQXAK67KSCKN3EJXT4S3RVXUBFOLZ45IQOBTSOQWOSR4LLULBTD54S5IA']().build() const assetResults = new Map([ - [924268058, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-924268058']().build())], - [1010208883, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1010208883']().build())], - [1096015467, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1096015467']().build())], + [924268058n, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-924268058']().build())], + [1010208883n, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1010208883']().build())], + [1096015467n, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1096015467']().build())], ]) it('should be rendered with the correct data', () => { @@ -128,12 +128,12 @@ describe('account-page', () => { describe('when rendering an account with assets and applications', () => { const accountResult = accountResultMother['mainnet-ORANGESCU7XMR2TFXSFTOHCUHNP6OYEPIKZW3JZANTCDHVQYMGQFYFIDDA']().build() const assetResults = new Map([ - [1336655079, createReadOnlyAtomAndTimestamp(accountResult['created-assets']![0])], - [1284444444, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1284444444']().build())], - [1162292622, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1162292622']().build())], - [1294765516, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1294765516']().build())], - [1355858325, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1355858325']().build())], - [1355898842, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1355898842']().build())], + [1336655079n, createReadOnlyAtomAndTimestamp(accountResult.createdAssets![0])], + [1284444444n, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1284444444']().build())], + [1162292622n, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1162292622']().build())], + [1294765516n, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1294765516']().build())], + [1355858325n, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1355858325']().build())], + [1355898842n, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1355898842']().build())], ]) it('should be rendered with the correct data', () => { @@ -226,9 +226,9 @@ describe('account-page', () => { describe('when rendering an account that becomes stale', () => { const accountResult = accountResultMother['mainnet-BIQXAK67KSCKN3EJXT4S3RVXUBFOLZ45IQOBTSOQWOSR4LLULBTD54S5IA']().build() const assetResults = new Map([ - [924268058, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-924268058']().build())], - [1010208883, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1010208883']().build())], - [1096015467, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1096015467']().build())], + [924268058n, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-924268058']().build())], + [1010208883n, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1010208883']().build())], + [1096015467n, createReadOnlyAtomAndTimestamp(assetResultMother['mainnet-1096015467']().build())], ]) it('should be rendered with the refresh button', () => { diff --git a/src/features/accounts/utils/get-account-address-for-transactions.ts b/src/features/accounts/utils/get-account-address-for-transactions.ts index 73219aa58..dd124ff38 100644 --- a/src/features/accounts/utils/get-account-address-for-transactions.ts +++ b/src/features/accounts/utils/get-account-address-for-transactions.ts @@ -1,47 +1,47 @@ import algosdk from 'algosdk' -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' import { invariant } from '@/utils/invariant' import { Address } from '../data/types' +import { TransactionResult } from '@/features/transactions/data/types' export const getAddressesForTransaction = (transaction: TransactionResult): Address[] => { const addresses = new Set
() addresses.add(transaction.sender) - if (transaction['tx-type'] === algosdk.TransactionType.pay) { - invariant(transaction['payment-transaction'], 'payment-transaction is not set') + if (transaction.txType === algosdk.TransactionType.pay) { + invariant(transaction.paymentTransaction, 'payment-transaction is not set') - addresses.add(transaction['payment-transaction']['receiver']) - if (transaction['payment-transaction']['close-remainder-to']) { - addresses.add(transaction['payment-transaction']['close-remainder-to']) + addresses.add(transaction.paymentTransaction.receiver) + if (transaction.paymentTransaction.closeRemainderTo) { + addresses.add(transaction.paymentTransaction.closeRemainderTo) } - } else if (transaction['tx-type'] === algosdk.TransactionType.axfer) { - invariant(transaction['asset-transfer-transaction'], 'asset-transfer-transaction is not set') + } else if (transaction.txType === algosdk.TransactionType.axfer) { + invariant(transaction.assetTransferTransaction, 'asset-transfer-transaction is not set') - addresses.add(transaction['asset-transfer-transaction']['receiver']) - if (transaction['asset-transfer-transaction']['close-to']) { - addresses.add(transaction['asset-transfer-transaction']['close-to']) + addresses.add(transaction.assetTransferTransaction.receiver) + if (transaction.assetTransferTransaction.closeTo) { + addresses.add(transaction.assetTransferTransaction.closeTo) } - } else if (transaction['tx-type'] === algosdk.TransactionType.afrz) { - invariant(transaction['asset-freeze-transaction'], 'asset-freeze-transaction is not set') + } else if (transaction.txType === algosdk.TransactionType.afrz) { + invariant(transaction.assetFreezeTransaction, 'asset-freeze-transaction is not set') - addresses.add(transaction['asset-freeze-transaction']['address']) - } else if (transaction['tx-type'] === algosdk.TransactionType.acfg) { - invariant(transaction['asset-config-transaction'], 'asset-config-transaction is not set') - if (transaction['asset-config-transaction'].params?.manager) { - addresses.add(transaction['asset-config-transaction'].params?.manager) + addresses.add(transaction.assetFreezeTransaction.address) + } else if (transaction.txType === algosdk.TransactionType.acfg) { + invariant(transaction.assetConfigTransaction, 'asset-config-transaction is not set') + if (transaction.assetConfigTransaction.params?.manager) { + addresses.add(transaction.assetConfigTransaction.params?.manager) } - if (transaction['asset-config-transaction'].params?.reserve) { - addresses.add(transaction['asset-config-transaction'].params?.reserve) + if (transaction.assetConfigTransaction.params?.reserve) { + addresses.add(transaction.assetConfigTransaction.params?.reserve) } - if (transaction['asset-config-transaction'].params?.freeze) { - addresses.add(transaction['asset-config-transaction'].params?.freeze) + if (transaction.assetConfigTransaction.params?.freeze) { + addresses.add(transaction.assetConfigTransaction.params?.freeze) } - if (transaction['asset-config-transaction'].params?.clawback) { - addresses.add(transaction['asset-config-transaction'].params?.clawback) + if (transaction.assetConfigTransaction.params?.clawback) { + addresses.add(transaction.assetConfigTransaction.params?.clawback) } - } else if (transaction['tx-type'] === algosdk.TransactionType.appl) { - invariant(transaction['application-transaction'], 'application-transaction is not set') + } else if (transaction.txType === algosdk.TransactionType.appl) { + invariant(transaction.applicationTransaction, 'application-transaction is not set') - const innerTransactions = transaction['inner-txns'] ?? [] + const innerTransactions = transaction.innerTxns ?? [] for (const innerTxn of innerTransactions) { const innerAddresses = getAddressesForTransaction(innerTxn) for (const address of innerAddresses) { diff --git a/src/features/app-interfaces/components/create/deploy-app.tsx b/src/features/app-interfaces/components/create/deploy-app.tsx index 2f4d6de4e..dc6aae7fd 100644 --- a/src/features/app-interfaces/components/create/deploy-app.tsx +++ b/src/features/app-interfaces/components/create/deploy-app.tsx @@ -152,7 +152,7 @@ export function DeployApp({ machine }: Props) { populateAppCallResources: true, }) - send({ type: 'deploymentCompleted', applicationId: Number(result.appId), roundFirstValid: result.updatedRound }) + send({ type: 'deploymentCompleted', applicationId: result.appId, roundFirstValid: result.updatedRound }) }, [ activeAddress, @@ -182,7 +182,7 @@ export function DeployApp({ machine }: Props) { const transaction = await open({ type, transaction: { - applicationId: 0, + applicationId: 0n, ...(method && appSpec ? { methodDefinition: method, diff --git a/src/features/app-interfaces/components/create/from-app-id-card.tsx b/src/features/app-interfaces/components/create/from-app-id-card.tsx index d2e62b603..2ebb04ac0 100644 --- a/src/features/app-interfaces/components/create/from-app-id-card.tsx +++ b/src/features/app-interfaces/components/create/from-app-id-card.tsx @@ -1,6 +1,6 @@ import { useCallback, useEffect } from 'react' import { useCreateAppInterfaceStateMachine } from '../../data' -import { numberSchema } from '@/features/forms/data/common' +import { bigIntSchema } from '@/features/forms/data/common' import { zfd } from 'zod-form-data' import { z } from 'zod' import { Card, CardContent } from '@/features/common/components/card' @@ -17,7 +17,7 @@ import { useLoadableAppInterfacesAtom } from '../../data' const schema = zfd.formData({ application: z .object({ - id: numberSchema(z.number({ required_error: 'Required', invalid_type_error: 'Required' })), + id: bigIntSchema(z.bigint({ required_error: 'Required', invalid_type_error: 'Required' })), exists: z.boolean().optional(), appInterfaceExists: z.boolean().optional(), }) @@ -56,7 +56,7 @@ type FormInnerProps = { function FormInner({ helper }: FormInnerProps) { const formCtx = useFormContext>() const applicationIdFieldValue = formCtx.watch('application.id') // This actually comes back as a string value, so we convert below - const [applicationId] = useDebounce(applicationIdFieldValue ? Number(applicationIdFieldValue) : undefined, 500) + const [applicationId] = useDebounce(applicationIdFieldValue ? BigInt(applicationIdFieldValue) : undefined, 500) if (applicationId) { return diff --git a/src/features/app-interfaces/components/edit/add-app-spec-form.tsx b/src/features/app-interfaces/components/edit/add-app-spec-form.tsx index 3faf96c48..e3adf1c21 100644 --- a/src/features/app-interfaces/components/edit/add-app-spec-form.tsx +++ b/src/features/app-interfaces/components/edit/add-app-spec-form.tsx @@ -8,10 +8,11 @@ import { AppSpecStandard, AppSpecVersion, Arc32AppSpec, Arc4AppSpec } from '../. import { useAddAppSpecVersion } from '../../data/update' import { ApplicationId } from '@/features/applications/data/types' import { parseAsAppSpec } from '../../mappers' -import { isArc32AppSpec, isArc4AppSpec } from '@/features/common/utils' +import { isArc32AppSpec, isArc4AppSpec, isArc56AppSpec } from '@/features/common/utils' import { invariant } from '@/utils/invariant' import { AppSpecFormInner, appSpecSchema, supportedStandards } from './app-spec-form-inner' import { toast } from 'react-toastify' +import { Arc56Contract } from '@algorandfoundation/algokit-utils/types/app-arc56' type Props = { applicationId: ApplicationId @@ -24,8 +25,8 @@ export function AddAppSpecForm({ applicationId, onSuccess }: Props) { const addNewAppSpec = useCallback( async (values: z.infer) => { const common = { - roundFirstValid: values.roundFirstValid !== undefined ? Number(values.roundFirstValid) : undefined, - roundLastValid: values.roundLastValid !== undefined ? Number(values.roundLastValid) : undefined, + roundFirstValid: values.roundFirstValid, + roundLastValid: values.roundLastValid, } const parsedAppSpec = await parseAsAppSpec(values.file, supportedStandards) const appSpecVersion = isArc32AppSpec(parsedAppSpec) @@ -34,13 +35,19 @@ export function AddAppSpecForm({ applicationId, onSuccess }: Props) { appSpec: parsedAppSpec as Arc32AppSpec, standard: AppSpecStandard.ARC32, } satisfies AppSpecVersion) - : isArc4AppSpec(parsedAppSpec) + : isArc56AppSpec(parsedAppSpec) ? ({ ...common, - appSpec: parsedAppSpec as Arc4AppSpec, - standard: AppSpecStandard.ARC4, + appSpec: parsedAppSpec as Arc56Contract, + standard: AppSpecStandard.ARC56, } satisfies AppSpecVersion) - : undefined + : isArc4AppSpec(parsedAppSpec) + ? ({ + ...common, + appSpec: parsedAppSpec as Arc4AppSpec, + standard: AppSpecStandard.ARC4, + } satisfies AppSpecVersion) + : undefined invariant(appSpecVersion, 'App spec standard is not supported') await addAppSpecVersion(applicationId, appSpecVersion) diff --git a/src/features/app-interfaces/components/edit/app-spec-form-inner.tsx b/src/features/app-interfaces/components/edit/app-spec-form-inner.tsx index 45a104e33..9e6ae0ac9 100644 --- a/src/features/app-interfaces/components/edit/app-spec-form-inner.tsx +++ b/src/features/app-interfaces/components/edit/app-spec-form-inner.tsx @@ -26,7 +26,7 @@ type FormInnerProps = { helper: FormFieldHelper> } -export const supportedStandards = [AppSpecStandard.ARC32, AppSpecStandard.ARC4] +export const supportedStandards = [AppSpecStandard.ARC56, AppSpecStandard.ARC32, AppSpecStandard.ARC4] export function AppSpecFormInner({ helper }: FormInnerProps) { return ( diff --git a/src/features/app-interfaces/components/edit/edit-app-spec-form.tsx b/src/features/app-interfaces/components/edit/edit-app-spec-form.tsx index 6f806f758..cb02ca4be 100644 --- a/src/features/app-interfaces/components/edit/edit-app-spec-form.tsx +++ b/src/features/app-interfaces/components/edit/edit-app-spec-form.tsx @@ -8,11 +8,12 @@ import { AppSpecStandard, AppSpecVersion, Arc32AppSpec, Arc4AppSpec } from '../. import { useUpdateAppSpecVersion } from '../../data/update' import { ApplicationId } from '@/features/applications/data/types' import { asAppSpecFilename, parseAsAppSpec } from '../../mappers' -import { isArc32AppSpec, isArc4AppSpec } from '@/features/common/utils' +import { isArc32AppSpec, isArc4AppSpec, isArc56AppSpec } from '@/features/common/utils' import { invariant } from '@/utils/invariant' import { AppSpecFormInner, appSpecSchema, supportedStandards } from './app-spec-form-inner' import { asJson } from '@/utils/as-json' import { toast } from 'react-toastify' +import { Arc56Contract } from '@algorandfoundation/algokit-utils/types/app-arc56' type Props = { applicationId: ApplicationId @@ -27,8 +28,8 @@ export function EditAppSpecForm({ applicationId, appSpecIndex, appSpec, onSucces const editExistingAppSpec = useCallback( async (values: z.infer) => { const common = { - roundFirstValid: values.roundFirstValid !== undefined ? Number(values.roundFirstValid) : undefined, - roundLastValid: values.roundLastValid !== undefined ? Number(values.roundLastValid) : undefined, + roundFirstValid: values.roundFirstValid, + roundLastValid: values.roundLastValid, } const parsedAppSpec = await parseAsAppSpec(values.file, supportedStandards) const appSpecVersion = isArc32AppSpec(parsedAppSpec) @@ -37,13 +38,19 @@ export function EditAppSpecForm({ applicationId, appSpecIndex, appSpec, onSucces appSpec: parsedAppSpec as Arc32AppSpec, standard: AppSpecStandard.ARC32, } satisfies AppSpecVersion) - : isArc4AppSpec(parsedAppSpec) + : isArc56AppSpec(parsedAppSpec) ? ({ ...common, - appSpec: parsedAppSpec as Arc4AppSpec, - standard: AppSpecStandard.ARC4, + appSpec: parsedAppSpec as Arc56Contract, + standard: AppSpecStandard.ARC56, } satisfies AppSpecVersion) - : undefined + : isArc4AppSpec(parsedAppSpec) + ? ({ + ...common, + appSpec: parsedAppSpec as Arc4AppSpec, + standard: AppSpecStandard.ARC4, + } satisfies AppSpecVersion) + : undefined invariant(appSpecVersion, 'App spec standard is not supported') await updateAppSpecVersion(applicationId, appSpecIndex, appSpecVersion) @@ -58,8 +65,8 @@ export function EditAppSpecForm({ applicationId, appSpecIndex, appSpec, onSucces onSubmit={editExistingAppSpec} onSuccess={onSuccess} defaultValues={{ - roundFirstValid: appSpec.roundFirstValid !== undefined ? BigInt(appSpec.roundFirstValid) : undefined, - roundLastValid: appSpec.roundLastValid !== undefined ? BigInt(appSpec.roundLastValid) : undefined, + roundFirstValid: appSpec.roundFirstValid, + roundLastValid: appSpec.roundLastValid, file: new File([Buffer.from(asJson(appSpec.appSpec))], asAppSpecFilename(appSpec), { type: 'application/json' }), }} formAction={ diff --git a/src/features/app-interfaces/data/create.ts b/src/features/app-interfaces/data/create.ts index 3287af46b..703629d89 100644 --- a/src/features/app-interfaces/data/create.ts +++ b/src/features/app-interfaces/data/create.ts @@ -18,7 +18,11 @@ export type AppSpecDetails = { } & AppSpecVersion export const upsertAppInterface = async (dbConnection: DbConnection, appInterface: AppInterfaceEntity) => { - await dbConnection.put('app-interfaces', appInterface) + const entity = { + ...appInterface, + applicationId: appInterface.applicationId.toString(), + } + await dbConnection.put('app-interfaces', entity) } export const useCreateAppInterface = () => { diff --git a/src/features/app-interfaces/data/delete.ts b/src/features/app-interfaces/data/delete.ts index 462a8c5d2..546a11020 100644 --- a/src/features/app-interfaces/data/delete.ts +++ b/src/features/app-interfaces/data/delete.ts @@ -4,7 +4,7 @@ import { useAtomCallback } from 'jotai/utils' import { useCallback } from 'react' const deleteAppInterface = async (dbConnection: DbConnection, applicationId: ApplicationId) => { - await dbConnection.delete('app-interfaces', applicationId) + await dbConnection.delete('app-interfaces', applicationId.toString()) } export const useDeleteAppInterface = (applicationId: ApplicationId) => { diff --git a/src/features/app-interfaces/data/read.ts b/src/features/app-interfaces/data/read.ts index 242297382..8fc1048d8 100644 --- a/src/features/app-interfaces/data/read.ts +++ b/src/features/app-interfaces/data/read.ts @@ -7,10 +7,21 @@ import { invariant } from '@/utils/invariant' import { appInterfaceNotFoundMessage } from '../pages/labels' export const getAppInterface = async (dbConnection: DbConnection, applicationId: ApplicationId) => { - return await dbConnection.get('app-interfaces', applicationId) + const entity = await dbConnection.get('app-interfaces', applicationId.toString()) + if (!entity) { + return undefined + } + return { + ...entity, + applicationId: BigInt(entity.applicationId), + } } export const getAppInterfaces = async (dbConnection: DbConnection) => { - return await dbConnection.getAll('app-interfaces') + const entities = await dbConnection.getAll('app-interfaces') + return entities.map((entity) => ({ + ...entity, + applicationId: BigInt(entity.applicationId), + })) } export const createAppInterfaceAtom = (applicationId: ApplicationId) => { diff --git a/src/features/app-interfaces/data/types/index.ts b/src/features/app-interfaces/data/types/index.ts index f7f7511d5..eb0987160 100644 --- a/src/features/app-interfaces/data/types/index.ts +++ b/src/features/app-interfaces/data/types/index.ts @@ -14,20 +14,20 @@ export enum AppSpecStandard { export type AppSpecVersion = | { standard: AppSpecStandard.ARC32 - roundFirstValid?: number - roundLastValid?: number + roundFirstValid?: bigint + roundLastValid?: bigint appSpec: Arc32AppSpec } | { standard: AppSpecStandard.ARC4 - roundFirstValid?: number - roundLastValid?: number + roundFirstValid?: bigint + roundLastValid?: bigint appSpec: Arc4AppSpec } | { standard: AppSpecStandard.ARC56 - roundFirstValid?: number - roundLastValid?: number + roundFirstValid?: bigint + roundLastValid?: bigint appSpec: Arc56Contract } diff --git a/src/features/app-interfaces/mappers/index.tsx b/src/features/app-interfaces/mappers/index.tsx index db4eba25d..93bb2b84f 100644 --- a/src/features/app-interfaces/mappers/index.tsx +++ b/src/features/app-interfaces/mappers/index.tsx @@ -87,7 +87,15 @@ export const getLatestAppSpecVersion = (appSpecVersions: AppSpecVersion[]): AppS if (noRoundLastValid) { return noRoundLastValid } - const sorted = appSpecVersions.sort((a, b) => b.roundLastValid! - a.roundLastValid!) + const sorted = appSpecVersions.sort((a, b) => { + if (b.roundLastValid! > a.roundLastValid!) { + return 1 + } + if (b.roundLastValid! < a.roundLastValid!) { + return -1 + } + return 0 + }) if (sorted.length > 0) { return sorted[0] diff --git a/src/features/app-interfaces/pages/create-app-interface-page.tsx b/src/features/app-interfaces/pages/create-app-interface-page.tsx index 4ff88921a..26a2ada92 100644 --- a/src/features/app-interfaces/pages/create-app-interface-page.tsx +++ b/src/features/app-interfaces/pages/create-app-interface-page.tsx @@ -37,8 +37,8 @@ function CreateAppInterfaceInner() { const common = { applicationId: state.context.applicationId, name: state.context.name, - roundFirstValid: state.context.roundFirstValid !== undefined ? Number(state.context.roundFirstValid) : undefined, - roundLastValid: state.context.roundLastValid !== undefined ? Number(state.context.roundLastValid) : undefined, + roundFirstValid: state.context.roundFirstValid, + roundLastValid: state.context.roundLastValid, } try { diff --git a/src/features/app-interfaces/pages/edit-app-interface-page.test.tsx b/src/features/app-interfaces/pages/edit-app-interface-page.test.tsx index d9bcc28e1..ab5530822 100644 --- a/src/features/app-interfaces/pages/edit-app-interface-page.test.tsx +++ b/src/features/app-interfaces/pages/edit-app-interface-page.test.tsx @@ -14,7 +14,7 @@ import { getButton } from '@/tests/utils/get-button' describe('edit-app-interface', () => { it('can edit an existing app spec', async () => { const myStore = getTestStore() - const applicationId = 1234 + const applicationId = 1234n const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { applicationId: applicationId, @@ -60,7 +60,7 @@ describe('edit-app-interface', () => { it('can add an app spec', async () => { const myStore = getTestStore() - const applicationId = 1234 + const applicationId = 1234n const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { applicationId: applicationId, @@ -109,7 +109,7 @@ describe('edit-app-interface', () => { it('can delete an app spec', async () => { const myStore = getTestStore() - const applicationId = 1234 + const applicationId = 1234n const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { applicationId: applicationId, diff --git a/src/features/app-interfaces/pages/edit-app-interface-page.tsx b/src/features/app-interfaces/pages/edit-app-interface-page.tsx index 443edd594..a3e043cd2 100644 --- a/src/features/app-interfaces/pages/edit-app-interface-page.tsx +++ b/src/features/app-interfaces/pages/edit-app-interface-page.tsx @@ -33,7 +33,7 @@ export function EditAppInterfacePage() { const { applicationId: _applicationId } = useRequiredParam(UrlParams.ApplicationId) invariant(isInteger(_applicationId), applicationInvalidIdMessage) - const applicationId = parseInt(_applicationId, 10) + const applicationId = BigInt(_applicationId) const [loadableAppInterface, refreshAppInterface] = useAppInterface(applicationId) return ( diff --git a/src/features/applications/components/application-details.tsx b/src/features/applications/components/application-details.tsx index 3fd9a997e..46b690df0 100644 --- a/src/features/applications/components/application-details.tsx +++ b/src/features/applications/components/application-details.tsx @@ -54,7 +54,7 @@ export function ApplicationDetails({ application }: Props) { dd: (
- {application.id} + {application.id.toString()}
{application.isDeleted && Deleted} diff --git a/src/features/applications/components/application-link.tsx b/src/features/applications/components/application-link.tsx index fb71dac79..e9f5d6fb1 100644 --- a/src/features/applications/components/application-link.tsx +++ b/src/features/applications/components/application-link.tsx @@ -21,7 +21,7 @@ export function ApplicationLink({ applicationId, className, showCopyButton, chil urlTemplate={Urls.Network.Explore.Application.ById} urlParams={{ applicationId: applicationId.toString(), networkId: selectedNetwork }} > - {children ? children : applicationId} + {children ? children : applicationId.toString()} ) diff --git a/src/features/applications/components/application-live-transactions.tsx b/src/features/applications/components/application-live-transactions.tsx index c41b2725f..0ca196e1c 100644 --- a/src/features/applications/components/application-live-transactions.tsx +++ b/src/features/applications/components/application-live-transactions.tsx @@ -1,12 +1,12 @@ import { ApplicationId } from '../data/types' import { useCallback } from 'react' import { LiveTransactionsTable } from '@/features/transactions/components/live-transactions-table' -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' import { flattenTransactionResult } from '@/features/transactions/utils/flatten-transaction-result' import { TransactionType as AlgoSdkTransactionType } from 'algosdk' import { Transaction, InnerTransaction } from '@/features/transactions/models' import { getApplicationTransactionsTableSubRows } from '../utils/get-application-transactions-table-sub-rows' import { transactionsTableColumns } from '@/features/transactions/components/transactions-table-columns' +import { TransactionResult } from '@/features/transactions/data/types' type Props = { applicationId: ApplicationId @@ -17,7 +17,7 @@ export function ApplicationLiveTransactions({ applicationId }: Props) { (transactionResult: TransactionResult) => { const flattenedTransactionResults = flattenTransactionResult(transactionResult) return flattenedTransactionResults.some( - (txn) => txn['tx-type'] === AlgoSdkTransactionType.appl && txn['application-transaction']?.['application-id'] === applicationId + (txn) => txn.txType === AlgoSdkTransactionType.appl && txn.applicationTransaction?.applicationId === applicationId ) }, [applicationId] diff --git a/src/features/applications/components/application-method-definitions.test.tsx b/src/features/applications/components/application-method-definitions.test.tsx index b217d4963..32e848ef6 100644 --- a/src/features/applications/components/application-method-definitions.test.tsx +++ b/src/features/applications/components/application-method-definitions.test.tsx @@ -27,6 +27,8 @@ import { randomGuid } from '@/utils/random-guid' import { asAddressOrNfd } from '@/features/transaction-wizard/mappers/as-address-or-nfd' import { BuildableTransactionType } from '@/features/transaction-wizard/models' import { asMethodDefinitions } from '@/features/applications/mappers' +import { uint8ArrayToBase64 } from '@/utils/uint8-array-to-base64' +import { act } from 'react' describe('application-method-definitions', () => { const localnet = algorandFixture() @@ -41,8 +43,16 @@ describe('application-method-definitions', () => { beforeEach(async () => { const myStore = getTestStore() await setWalletAddressAndSigner(localnet) - const { app } = await deploySmartContract(localnet, Arc32TestContractAppSpec as AppSpec) - appId = Number(app.appId) + const { app } = await deploySmartContract(localnet.context.testAccount, localnet.algorand, Arc32TestContractAppSpec as AppSpec) + appId = app.appId + + const dispenser = await localnet.context.algorand.account.dispenserFromEnvironment() + await localnet.context.algorand.send.payment({ + sender: dispenser, + receiver: app.appAddress, + amount: algo(10), + note: 'Fund app account', + }) const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { @@ -160,12 +170,8 @@ describe('application-method-definitions', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(testAccount.addr) - expect(result.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dQAAAAAAAAAD", - ] - `) + expect(result.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(result.transaction.logs![0])).toBe('FR98dQAAAAAAAAAD') } ) }) @@ -244,12 +250,8 @@ describe('application-method-definitions', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(testAccount.addr) - expect(result.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dQACAgI=", - ] - `) + expect(result.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(result.transaction.logs![0])).toBe('FR98dQACAgI=') } ) }) @@ -393,13 +395,9 @@ describe('application-method-definitions', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(localnet.context.testAccount.addr) - expect(result.transaction.fee).toBe(0) - expect(result.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dQAAAAAAAAAD", - ] - `) + expect(result.transaction.sender).toBe(localnet.context.testAccount.addr.toString()) + expect(result.transaction.fee).toBe(0n) + expect(uint8ArrayToBase64(result.transaction.logs![0])).toBe('FR98dQAAAAAAAAAD') } ) }) @@ -479,12 +477,13 @@ describe('application-method-definitions', () => { { timeout: 10_000 } ) const paymentTransaction = await localnet.context.waitForIndexerTransaction(paymentTransactionId) - expect(paymentTransaction.transaction.sender).toBe(testAccount.addr) - expect(paymentTransaction.transaction['payment-transaction']!).toMatchInlineSnapshot(` - { - "amount": 500000, - "close-amount": 0, - "receiver": "${testAccount2.addr}", + expect(paymentTransaction.transaction.sender).toBe(testAccount.addr.toString()) + expect(paymentTransaction.transaction.paymentTransaction!).toMatchInlineSnapshot(` + TransactionPayment { + "amount": 500000n, + "closeAmount": 0n, + "closeRemainderTo": undefined, + "receiver": "${testAccount2.addr.toString()}", } `) @@ -499,13 +498,18 @@ describe('application-method-definitions', () => { { timeout: 10_000 } ) + // This is a bit hacky, we traverse the DOM to find the inner app call method name + // This is to verify that the abiMethod is resolved correctly for the app call + const innerAppCallTxnLink = within(resultsDiv) + .getAllByRole('link') + .find((a) => a.getAttribute('href')?.startsWith(`/localnet/transaction/${appCallTransactionId}`)) + expect(innerAppCallTxnLink?.parentElement?.parentElement?.parentElement?.parentElement?.nextSibling?.textContent).toBe( + '1App Callget_pay_txn_amount' + ) + const appCallTransaction = await localnet.context.waitForIndexerTransaction(appCallTransactionId) - expect(appCallTransaction.transaction.sender).toBe(testAccount.addr) - expect(appCallTransaction.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dQAAAAAAB6Eg", - ] - `) + expect(appCallTransaction.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(appCallTransaction.transaction.logs![0])).toBe('FR98dQAAAAAAB6Eg') } ) }) @@ -601,12 +605,13 @@ describe('application-method-definitions', () => { { timeout: 10_000 } ) const paymentTransaction = await localnet.context.waitForIndexerTransaction(paymentTransactionId) - expect(paymentTransaction.transaction.sender).toBe(testAccount.addr) - expect(paymentTransaction.transaction['payment-transaction']!).toMatchInlineSnapshot(` - { - "amount": 600000, - "close-amount": 0, - "receiver": "${testAccount2.addr}", + expect(paymentTransaction.transaction.sender).toBe(testAccount.addr.toString()) + expect(paymentTransaction.transaction.paymentTransaction!).toMatchInlineSnapshot(` + TransactionPayment { + "amount": 600000n, + "closeAmount": 0n, + "closeRemainderTo": undefined, + "receiver": "${testAccount2.addr.toString()}", } `) @@ -622,12 +627,8 @@ describe('application-method-definitions', () => { ) const appCallTransaction = await localnet.context.waitForIndexerTransaction(appCallTransactionId) - expect(appCallTransaction.transaction.sender).toBe(testAccount.addr) - expect(appCallTransaction.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dQAAAAAACSfA", - ] - `) + expect(appCallTransaction.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(appCallTransaction.transaction.logs![0])).toBe('FR98dQAAAAAACSfA') } ) }) @@ -727,12 +728,13 @@ describe('application-method-definitions', () => { { timeout: 10_000 } ) const paymentTransaction = await localnet.context.waitForIndexerTransaction(paymentTransactionId) - expect(paymentTransaction.transaction.sender).toBe(testAccount.addr) - expect(paymentTransaction.transaction['payment-transaction']!).toMatchInlineSnapshot(` - { - "amount": 500000, - "close-amount": 0, - "receiver": "${testAccount2.addr}", + expect(paymentTransaction.transaction.sender).toBe(testAccount.addr.toString()) + expect(paymentTransaction.transaction.paymentTransaction!).toMatchInlineSnapshot(` + TransactionPayment { + "amount": 500000n, + "closeAmount": 0n, + "closeRemainderTo": undefined, + "receiver": "${testAccount2.addr.toString()}", } `) @@ -748,8 +750,8 @@ describe('application-method-definitions', () => { ) const appCallTransaction = await localnet.context.waitForIndexerTransaction(appCallTransactionId) - expect(appCallTransaction.transaction.sender).toBe(testAccount.addr) - expect(appCallTransaction.transaction.note).toBe('aGVsbG8gd29ybGQh') + expect(appCallTransaction.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(appCallTransaction.transaction.note!)).toBe('aGVsbG8gd29ybGQh') } ) }) @@ -893,12 +895,8 @@ describe('application-method-definitions', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(testAccount.addr) - expect(result.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dQABAQ==", - ] - `) + expect(result.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(result.transaction.logs![0])).toBe('FR98dQABAQ==') } ) }) @@ -983,12 +981,8 @@ describe('application-method-definitions', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(testAccount.addr) - expect(result.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dQACAgI=", - ] - `) + expect(result.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(result.transaction.logs![0])).toBe('FR98dQACAgI=') } ) }) @@ -1096,12 +1090,8 @@ describe('application-method-definitions', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(testAccount.addr) - expect(result.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dQAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAwAAAAAAAAAE", - ] - `) + expect(result.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(result.transaction.logs![0])).toBe('FR98dQAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAwAAAAAAAAAE') } ) }) @@ -1203,12 +1193,8 @@ describe('application-method-definitions', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(testAccount.addr) - expect(result.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dQAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAwAAAAAAAAAs", - ] - `) + expect(result.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(result.transaction.logs![0])).toBe('FR98dQAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAwAAAAAAAAAs') } ) }) @@ -1284,12 +1270,8 @@ describe('application-method-definitions', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(testAccount.addr) - expect(result.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dQADAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAD", - ] - `) + expect(result.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(result.transaction.logs![0])).toBe('FR98dQADAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAD') } ) }) @@ -1391,12 +1373,8 @@ describe('application-method-definitions', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(testAccount.addr) - expect(result.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dQAEAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAADAAAAAAAAAAQ=", - ] - `) + expect(result.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(result.transaction.logs![0])).toBe('FR98dQAEAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAADAAAAAAAAAAQ=') } ) }) @@ -1489,12 +1467,10 @@ describe('application-method-definitions', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(testAccount.addr) - expect(result.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dQAEAC4AAgAEABYAAgAAAAAAAAABAAAAAAAAAAIAAgAAAAAAAAADAAAAAAAAAAQABAAWAAIAAAAAAAAABQAAAAAAAAAGAAVIZWxsbw==", - ] - `) + expect(result.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(result.transaction.logs![0])).toBe( + 'FR98dQAEAC4AAgAEABYAAgAAAAAAAAABAAAAAAAAAAIAAgAAAAAAAAADAAAAAAAAAAQABAAWAAIAAAAAAAAABQAAAAAAAAAGAAVIZWxsbw==' + ) } ) }) @@ -1625,12 +1601,10 @@ describe('application-method-definitions', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(testAccount.addr) - expect(result.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dQAEAD4AAgAEAB4AAwAAAAAAAAABAAAAAAAAAAIAAAAAAAAACwADAAAAAAAAAAMAAAAAAAAABAAAAAAAAAAWAAQAHgADAAAAAAAAAAUAAAAAAAAABgAAAAAAAAAhAAVIZWxsbw==", - ] - `) + expect(result.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(result.transaction.logs![0])).toBe( + 'FR98dQAEAD4AAgAEAB4AAwAAAAAAAAABAAAAAAAAAAIAAAAAAAAACwADAAAAAAAAAAMAAAAAAAAABAAAAAAAAAAWAAQAHgADAAAAAAAAAAUAAAAAAAAABgAAAAAAAAAhAAVIZWxsbw==' + ) } ) }) @@ -1695,12 +1669,8 @@ describe('application-method-definitions', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(testAccount.addr) - expect(result.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dYA=", - ] - `) + expect(result.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(result.transaction.logs![0])).toBe('FR98dYA=') } ) }) @@ -1787,12 +1757,122 @@ describe('application-method-definitions', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(testAccount.addr) - expect(result.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dQA=", - ] - `) + expect(result.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(result.transaction.logs![0])).toBe('FR98dQA=') + } + ) + }) + }) + + describe('when calling inner_pay_appl method', () => { + let innerAppId: ApplicationId + + beforeEach(async () => { + const myStore = getTestStore() + const testAccount2 = await localnet.context.generateAccount({ initialFunds: algo(10) }) + + const { app: innerApp } = await deploySmartContract(testAccount2, localnet.algorand, Arc32TestContractAppSpec as AppSpec, { + onUpdate: 'append', + }) + innerAppId = innerApp.appId + + const dbConnection = await myStore.get(dbConnectionAtom) + await upsertAppInterface(dbConnection, { + applicationId: innerAppId, + name: 'test_inner', + appSpecVersions: [ + { + standard: AppSpecStandard.ARC32, + appSpec: Arc32TestContractAppSpec as unknown as Arc32AppSpec, + }, + ], + lastModified: createTimestamp(), + } satisfies AppInterfaceEntity) + }) + + it('succeeds when all fields have been correctly supplied', async () => { + const myStore = getTestStore() + const { testAccount } = localnet.context + vi.mocked(useParams).mockImplementation(() => ({ applicationId: appId.toString() })) + + return executeComponentTest( + () => { + return render(, undefined, myStore) + }, + async (component, user) => { + const methodPanel = await expandMethodAccordion(component, user, 'inner_pay_appl') + + // Call the method + const callButton = await waitFor(() => { + const callButton = within(methodPanel).getByRole('button', { name: 'Call' }) + expect(callButton).not.toBeDisabled() + return callButton! + }) + await user.click(callButton) + const formDialog = component.getByRole('dialog') + + // Enter the inner app id + const arg1Input = await getArgInput(formDialog, 'Argument 1') + fireEvent.input(arg1Input, { + target: { value: innerAppId.toString() }, + }) + + await setCheckbox(formDialog, user, 'Set fee automatically', false) + const feeInput = await within(formDialog).findByLabelText(/Fee/) + fireEvent.input(feeInput, { + target: { value: '0.003' }, + }) + + // Save the transaction + await user.click(within(formDialog).getByRole('button', { name: 'Add' })) + + // Populate resources + const populateResourcesButton = await waitFor(() => { + const populateResourcesButton = component.getByRole('button', { name: 'Populate Resources' }) + expect(populateResourcesButton).not.toBeDisabled() + return populateResourcesButton! + }) + await user.click(populateResourcesButton) + + // Send the transactions + const sendButton = await waitFor(() => { + const sendButton = component.getByRole('button', { name: sendButtonLabel }) + expect(sendButton).not.toBeDisabled() + return sendButton! + }) + await user.click(sendButton) + + const resultsDiv = await waitFor( + () => { + expect(component.queryByText('Required')).not.toBeInTheDocument() + return component.getByText(groupSendResultsLabel).parentElement! + }, + { timeout: 10_000 } + ) + + // Check the app call transaction + const appCallTransactionId = await waitFor( + () => { + const transactionLink = within(resultsDiv) + .getAllByRole('link') + .find((a) => a.getAttribute('href')?.startsWith('/localnet/transaction'))! + return transactionLink.getAttribute('href')!.split('/').pop()! + }, + { timeout: 10_000 } + ) + + const appCallTransaction = await act(() => localnet.context.waitForIndexerTransaction(appCallTransactionId)) + expect(appCallTransaction.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(appCallTransaction.transaction.logs![0])).toBe('FR98dQAAAAAAAYag') + + // This is a bit hacky, we traverse the DOM to find the inner app call method name + // This is to verify that the abiMethod is resolved correctly for the inner app call + const innerAppCallTxnLink = within(resultsDiv) + .getAllByRole('link') + .find((a) => a.getAttribute('href')?.startsWith(`/localnet/transaction/${appCallTransactionId}/inner/2`)) + expect(innerAppCallTxnLink?.parentElement?.parentElement?.parentElement?.nextSibling?.nextSibling?.textContent).toBe( + '2App Callget_pay_txn_amount' + ) } ) }) @@ -1807,13 +1887,13 @@ describe('application-method-definitions', () => { const { appId: _, ...params } = await asMethodCallParams({ id: randomGuid(), - applicationId: 1988, + applicationId: 1988n, type: BuildableTransactionType.MethodCall, appSpec: Arc56TestContractAppSpec as Arc56Contract, methodDefinition: asMethodDefinitions(Arc56TestContractAppSpec).find((m) => m.name === 'createApplication')!, onComplete: 0, methodArgs: [], - sender: asAddressOrNfd(localnet.context.testAccount.addr), + sender: asAddressOrNfd(localnet.context.testAccount.addr.toString()), fee: { setAutomatically: true, }, @@ -1822,26 +1902,31 @@ describe('application-method-definitions', () => { }, }) - const { app } = await deploySmartContract(localnet, Arc56TestContractAppSpec as Arc56Contract, { - createParams: { - ...params, - method: params.method.name, - onComplete: params.onComplete, - schema: { - localInts: Arc56TestContractAppSpec.state.schema.local.ints ?? 0, - localByteSlices: Arc56TestContractAppSpec.state.schema.local.bytes ?? 0, - globalInts: Arc56TestContractAppSpec.state.schema.global.ints ?? 0, - globalByteSlices: Arc56TestContractAppSpec.state.schema.global.bytes ?? 0, + const { app } = await deploySmartContract( + localnet.context.testAccount, + localnet.algorand, + Arc56TestContractAppSpec as Arc56Contract, + { + createParams: { + ...params, + method: params.method.name, + onComplete: params.onComplete, + schema: { + localInts: Arc56TestContractAppSpec.state.schema.local.ints ?? 0, + localByteSlices: Arc56TestContractAppSpec.state.schema.local.bytes ?? 0, + globalInts: Arc56TestContractAppSpec.state.schema.global.ints ?? 0, + globalByteSlices: Arc56TestContractAppSpec.state.schema.global.bytes ?? 0, + }, }, - }, - onUpdate: 'append', - onSchemaBreak: 'append', - deployTimeParams: { - someNumber: 1000, - }, - populateAppCallResources: true, - }) - appId = Number(app.appId) + onUpdate: 'append', + onSchemaBreak: 'append', + deployTimeParams: { + someNumber: 1000, + }, + populateAppCallResources: true, + } + ) + appId = app.appId const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { @@ -1932,12 +2017,8 @@ describe('application-method-definitions', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(testAccount.addr) - expect(result.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dQAAAAAAAAADAAAAAAAAAAI=", - ] - `) + expect(result.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(result.transaction.logs![0])).toBe('FR98dQAAAAAAAAADAAAAAAAAAAI=') } ) }) @@ -2048,12 +2129,8 @@ describe('application-method-definitions', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(testAccount.addr) - expect(result.transaction['logs']!).toMatchInlineSnapshot(` - [ - "FR98dQAAAAAAAAAGAAAAAAAAAAI=", - ] - `) + expect(result.transaction.sender).toBe(testAccount.addr.toString()) + expect(uint8ArrayToBase64(result.transaction.logs![0])).toBe('FR98dQAAAAAAAAAGAAAAAAAAAAI=') } ) }) @@ -2104,12 +2181,9 @@ const addItemIntoDynamicArray = async (parentComponent: HTMLElement, user: UserE } const expandMethodAccordion = async (component: RenderResult, user: UserEvent, methodName: string) => { - return waitFor(async () => { - const accordionTrigger = component.getByRole('button', { name: methodName }) - await user.click(accordionTrigger) - - return component.getByRole('region', { name: methodName }) - }) + const accordionTrigger = await component.findByRole('button', { name: methodName }) + await user.click(accordionTrigger) + return component.getByRole('region', { name: methodName }) } const getStructArgInput = async (parentComponent: HTMLElement, argName: string, path: string[]) => { diff --git a/src/features/applications/components/application-program.test.tsx b/src/features/applications/components/application-program.test.tsx index 21a6ae800..9e23933f3 100644 --- a/src/features/applications/components/application-program.test.tsx +++ b/src/features/applications/components/application-program.test.tsx @@ -3,6 +3,7 @@ import { getByRole, render, waitFor } from '../../../tests/testing-library' import { ApplicationProgram, base64ProgramTabLabel, tealProgramTabLabel } from './application-program' import { executeComponentTest } from '@/tests/test-component' import { algod } from '@/features/common/data/algo-client' +import algosdk from 'algosdk' vi.mock('@/features/common/data/algo-client', async () => { const original = await vi.importActual('@/features/common/data/algo-client') @@ -23,7 +24,9 @@ describe('application-program', () => { const teal = '\n#pragma version 8\nint 1\nreturn\n' it('should be rendered with the correct data', () => { - vi.mocked(algod.disassemble('').do).mockImplementation(() => Promise.resolve({ result: teal })) + vi.mocked(algod.disassemble('').do).mockImplementation(() => + Promise.resolve(new algosdk.modelsv2.DisassembleResponse({ result: teal })) + ) return executeComponentTest( () => { diff --git a/src/features/applications/components/confirm-transactions-resources-form.tsx b/src/features/applications/components/confirm-transactions-resources-form.tsx index 728375c29..77e18c83c 100644 --- a/src/features/applications/components/confirm-transactions-resources-form.tsx +++ b/src/features/applications/components/confirm-transactions-resources-form.tsx @@ -3,18 +3,19 @@ import { CancelButton } from '@/features/forms/components/cancel-button' import { Form } from '@/features/forms/components/form' import { FormActions } from '@/features/forms/components/form-actions' import { SubmitButton } from '@/features/forms/components/submit-button' -import { numberSchema } from '@/features/forms/data/common' +import { bigIntSchema } from '@/features/forms/data/common' import { useCallback, useMemo } from 'react' import { z } from 'zod' import { zfd } from 'zod-form-data' import { ApplicationId } from '../data/types' import { randomGuid } from '@/utils/random-guid' import { isAddress } from '@/utils/is-address' +import { AssetId } from '@/features/assets/data/types' export type TransactionResources = { accounts: Address[] - assets: number[] - applications: number[] + assets: AssetId[] + applications: ApplicationId[] boxes: (readonly [ApplicationId, string])[] } @@ -37,10 +38,10 @@ const formSchema = zfd.formData({ ) .max(4) ), - assets: zfd.repeatable(z.array(z.object({ id: z.string(), assetId: numberSchema(z.number().min(0)) })).max(8)), - applications: zfd.repeatable(z.array(z.object({ id: z.string(), applicationId: numberSchema(z.number().min(0)) })).max(8)), + assets: zfd.repeatable(z.array(z.object({ id: z.string(), assetId: bigIntSchema(z.bigint().min(0n)) })).max(8)), + applications: zfd.repeatable(z.array(z.object({ id: z.string(), applicationId: bigIntSchema(z.bigint().min(0n)) })).max(8)), boxes: zfd.repeatable( - z.array(z.object({ id: z.string(), applicationId: numberSchema(z.number().min(0)), boxName: zfd.text(z.string().optional()) })).max(8) + z.array(z.object({ id: z.string(), applicationId: bigIntSchema(z.bigint().min(0n)), boxName: zfd.text(z.string().optional()) })).max(8) ), }) diff --git a/src/features/applications/data/application-boxes.ts b/src/features/applications/data/application-boxes.ts index c54797576..8a22e8eb2 100644 --- a/src/features/applications/data/application-boxes.ts +++ b/src/features/applications/data/application-boxes.ts @@ -12,6 +12,7 @@ import { asBoxDescriptor } from '../mappers' import { base64ToUtf8IfValid } from '@/utils/base64-to-utf8' import { base64ToBytes } from '@/utils/base64-to-bytes' import { asDecodedAbiStorageValue } from '@/features/abi-methods/mappers' +import { uint8ArrayToUtf8 } from '@/utils/uint8-array-to-utf8' const getApplicationBoxNames = async (applicationId: ApplicationId, appSpec?: Arc56Contract, nextPageToken?: string) => { const results = await indexer @@ -44,7 +45,10 @@ export const useApplicationBox = (application: Application, boxDescriptor: BoxDe return useMemo(() => { return atom(async () => { const result = await getApplicationBox(application.id, boxDescriptor.base64Name) - const box = result.get_obj_for_encoding(false) as ApplicationBox + const box = { + name: uint8ArrayToUtf8(result.name), + value: uint8ArrayToUtf8(result.value), + } as ApplicationBox if (application.appSpec && 'valueType' in boxDescriptor) { return asDecodedAbiStorageValue(application.appSpec, boxDescriptor.valueType, base64ToBytes(box.value)) diff --git a/src/features/applications/data/application-metadata.ts b/src/features/applications/data/application-metadata.ts index f24520fcf..99d7eab98 100644 --- a/src/features/applications/data/application-metadata.ts +++ b/src/features/applications/data/application-metadata.ts @@ -1,13 +1,13 @@ import { readOnlyAtomCache } from '@/features/common/data' import { ApplicationMetadataResult, ApplicationResult } from './types' import { flattenTransactionResult } from '@/features/transactions/utils/flatten-transaction-result' -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' import { TransactionType } from 'algosdk' -import { base64ToUtf8 } from '@/utils/base64-to-utf8' import { parseArc2 } from '@/features/transactions/mappers' import { parseJson } from '@/utils/parse-json' import { indexer } from '@/features/common/data/algo-client' import { Getter, Setter } from 'jotai/index' +import { uint8ArrayToUtf8 } from '@/utils/uint8-array-to-utf8' +import { indexerTransactionToTransactionResult } from '@/features/transactions/mappers/indexer-transaction-mappers' const getApplicationMetadataResult = async ( _: Getter, @@ -20,14 +20,14 @@ const getApplicationMetadataResult = async ( .applicationID(applicationResult.id) .limit(3) .do() - .then((res) => res.transactions as TransactionResult[]) + .then((res) => res.transactions.map((txn) => indexerTransactionToTransactionResult(txn))) const creationTransaction = transactionResults .flatMap((txn) => flattenTransactionResult(txn)) - .find((txn) => txn['tx-type'] === TransactionType.appl && txn['created-application-index'] === applicationResult.id) + .find((txn) => txn.txType === TransactionType.appl && txn.createdApplicationIndex === applicationResult.id) if (!creationTransaction) return null - const text = base64ToUtf8(creationTransaction.note ?? '') + const text = uint8ArrayToUtf8(creationTransaction.note ?? new Uint8Array()) const maybeArc2 = parseArc2(text) if (maybeArc2 && maybeArc2.format === 'j') { diff --git a/src/features/applications/data/application-result.ts b/src/features/applications/data/application-result.ts index 9837b1dee..3b35f90db 100644 --- a/src/features/applications/data/application-result.ts +++ b/src/features/applications/data/application-result.ts @@ -2,6 +2,7 @@ import { ApplicationId, ApplicationResult } from './types' import { readOnlyAtomCache } from '@/features/common/data' import { algod, indexer } from '@/features/common/data/algo-client' import { asError, is404 } from '@/utils/error' +import { removeEncodableMethods } from '@/utils/remove-encodable-methods' import { Getter, Setter } from 'jotai/index' const getApplicationResult = async (_: Getter, __: Setter, applicationId: ApplicationId) => { @@ -10,7 +11,7 @@ const getApplicationResult = async (_: Getter, __: Setter, applicationId: Applic return await algod .getApplicationByID(applicationId) .do() - .then((result) => result as ApplicationResult) + .then((result) => removeEncodableMethods(result) as ApplicationResult) } catch (e: unknown) { if (is404(asError(e))) { // Handle deleted applications or applications that may not be available in algod potentially due to the node type @@ -18,7 +19,12 @@ const getApplicationResult = async (_: Getter, __: Setter, applicationId: Applic .lookupApplications(applicationId) .includeAll(true) .do() - .then((result) => result.application as ApplicationResult) + .then((result) => { + if (!result.application) { + throw new Error(`Application ${applicationId} not found`) + } + return removeEncodableMethods(result.application) as ApplicationResult + }) } throw e } diff --git a/src/features/applications/data/application-transaction-history.ts b/src/features/applications/data/application-transaction-history.ts index b2a98c946..da89c9416 100644 --- a/src/features/applications/data/application-transaction-history.ts +++ b/src/features/applications/data/application-transaction-history.ts @@ -1,23 +1,24 @@ import { ApplicationId } from './types' import { createReadOnlyAtomAndTimestamp } from '@/features/common/data' -import { TransactionResult, TransactionSearchResults } from '@algorandfoundation/algokit-utils/types/indexer' import { createTransactionsAtom, transactionResultsAtom } from '@/features/transactions/data' import { atomEffect } from 'jotai-effect' import { atom } from 'jotai' import { createLoadableViewModelPageAtom } from '@/features/common/data/lazy-load-pagination' import { DEFAULT_FETCH_SIZE } from '@/features/common/constants' import { indexer } from '@/features/common/data/algo-client' +import { TransactionResult } from '@/features/transactions/data/types' +import { indexerTransactionToTransactionResult } from '@/features/transactions/mappers/indexer-transaction-mappers' const getApplicationTransactionResults = async (applicationID: ApplicationId, nextPageToken?: string) => { - const results = (await indexer + const results = await indexer .searchForTransactions() .applicationID(applicationID) .nextToken(nextPageToken ?? '') .limit(DEFAULT_FETCH_SIZE) - .do()) as TransactionSearchResults + .do() return { - transactionResults: results.transactions, - nextPageToken: results['next-token'], + transactionResults: results.transactions.map((txn) => indexerTransactionToTransactionResult(txn)), + nextPageToken: results.nextToken, } as const } diff --git a/src/features/applications/data/types.ts b/src/features/applications/data/types.ts index 5aaaa4369..4f50d63d6 100644 --- a/src/features/applications/data/types.ts +++ b/src/features/applications/data/types.ts @@ -1,16 +1,26 @@ -import { ApplicationResult as IndexerApplicationResult } from '@algorandfoundation/algokit-utils/types/indexer' +import algosdk from 'algosdk' import { AppCallMethodCall } from '@algorandfoundation/algokit-utils/types/composer' -export type ApplicationId = number +export type ApplicationId = bigint export type ApplicationMetadataResult = { name: string } | null -export type ApplicationResult = Omit & { - params: Omit & { - 'global-state'?: IndexerApplicationResult['params']['global-state'] +export type ApplicationResult = Omit< + algosdk.indexerModels.Application, + 'getEncodingSchema' | 'toEncodingData' | 'createdAtRound' | 'deletedAtRound' | 'params' +> & { + params: Omit< + algosdk.indexerModels.ApplicationParams, + 'getEncodingSchema' | 'toEncodingData' | 'globalState' | 'globalStateSchema' | 'localStateSchema' + > & { + globalState?: algosdk.indexerModels.ApplicationParams['globalState'] + globalStateSchema?: ApplicationStateSchema + localStateSchema?: ApplicationStateSchema } } export type AppClientMethodCallParamsArgs = NonNullable[number] + +export type ApplicationStateSchema = Omit diff --git a/src/features/applications/mappers/index.ts b/src/features/applications/mappers/index.ts index a3597f849..5348f2386 100644 --- a/src/features/applications/mappers/index.ts +++ b/src/features/applications/mappers/index.ts @@ -15,9 +15,8 @@ import { } from '../models' import algosdk, { encodeAddress, getApplicationAddress, modelsv2 } from 'algosdk' import isUtf8 from 'isutf8' -import { Buffer } from 'buffer' import { ApplicationMetadataResult, ApplicationResult } from '../data/types' -import { asJson } from '@/utils/as-json' +import { asJson, normaliseAlgoSdkData } from '@/utils/as-json' import { AppSpec, Arc32AppSpec } from '@/features/app-interfaces/data/types' import { isArc32AppSpec, isArc4AppSpec, isArc56AppSpec } from '@/features/common/utils' import { AppSpec as UtiltsAppSpec, arc32ToArc56 } from '@algorandfoundation/algokit-utils/types/app-spec' @@ -29,6 +28,8 @@ import { base64ToBytes } from '@/utils/base64-to-bytes' import { DecodedAbiStorageKeyType, DecodedAbiStorageValue, DecodedAbiType } from '@/features/abi-methods/models' import { asDecodedAbiStorageValue } from '@/features/abi-methods/mappers' import { uint8ArrayStartsWith } from '@/utils/uint8-array-starts-with' +import { ZERO_ADDRESS } from '@/features/common/constants' +import { uint8ArrayToBase64 } from '@/utils/uint8-array-to-base64' export const asApplicationSummary = (application: ApplicationResult): ApplicationSummary => { return { @@ -44,30 +45,30 @@ export const asApplication = ( return { id: application.id, name: metadata?.name, - creator: application.params.creator, - account: getApplicationAddress(application.id), - globalStateSchema: application.params['global-state-schema'] + creator: application.params.creator?.toString() ?? ZERO_ADDRESS, + account: getApplicationAddress(application.id).toString(), + globalStateSchema: application.params.globalStateSchema ? { - numByteSlice: application.params['global-state-schema']['num-byte-slice'], - numUint: application.params['global-state-schema']['num-uint'], + numByteSlice: application.params.globalStateSchema.numByteSlice, + numUint: application.params.globalStateSchema.numUint, } : undefined, - localStateSchema: application.params['local-state-schema'] + localStateSchema: application.params.localStateSchema ? { - numByteSlice: application.params['local-state-schema']['num-byte-slice'], - numUint: application.params['local-state-schema']['num-uint'], + numByteSlice: application.params.localStateSchema.numByteSlice, + numUint: application.params.localStateSchema.numUint, } : undefined, - approvalProgram: application.params['approval-program'], - clearStateProgram: application.params['clear-state-program'], - globalState: asGlobalStateValue(application.params['global-state'], appSpec), + approvalProgram: uint8ArrayToBase64(application.params.approvalProgram), + clearStateProgram: uint8ArrayToBase64(application.params.clearStateProgram), + globalState: asGlobalStateValue(application.params.globalState, appSpec), isDeleted: application.deleted ?? false, - json: asJson(application), + json: asJson(normaliseAlgoSdkData(application)), appSpec, } } -export const asGlobalStateValue = (globalState: ApplicationResult['params']['global-state'], appSpec?: Arc56Contract): GlobalState[] => { +export const asGlobalStateValue = (globalState: ApplicationResult['params']['globalState'], appSpec?: Arc56Contract): GlobalState[] => { if (!globalState) { return [] } @@ -81,22 +82,21 @@ export const asGlobalStateValue = (globalState: ApplicationResult['params']['glo }) } -const asRawGlobalKey = (key: string): string => { - const buffer = Buffer.from(key, 'base64') +const asRawGlobalKey = (key: Uint8Array): string => { + const buffer = Buffer.from(key) if (isUtf8(buffer)) { return buffer.toString() } else { - return key + return uint8ArrayToBase64(key) } } -const asRawGlobalValue = (bytes: string) => { - const buf = Buffer.from(bytes, 'base64') - if (buf.length === 32) { - return encodeAddress(new Uint8Array(buf)) +const asRawGlobalValue = (bytes: Uint8Array) => { + if (bytes.length === 32) { + return encodeAddress(bytes) } - return base64ToUtf8IfValid(bytes) + return base64ToUtf8IfValid(uint8ArrayToBase64(bytes)) } const getRawGlobalState = (state: modelsv2.TealKeyValue): RawGlobalState => { @@ -118,7 +118,8 @@ const getRawGlobalState = (state: modelsv2.TealKeyValue): RawGlobalState => { } const asGlobalState = (state: modelsv2.TealKeyValue, appSpec?: Arc56Contract): GlobalState => { - const { key, value } = state + const { key: keyBytes, value } = state + const key = uint8ArrayToBase64(keyBytes) if (!appSpec) { return getRawGlobalState(state) @@ -202,7 +203,7 @@ const tealValueToAbiStorageValue = (appSpec: Arc56Contract, type: string, value: } satisfies DecodedAbiStorageValue } - return asDecodedAbiStorageValue(appSpec, type, base64ToBytes(value.bytes)) + return asDecodedAbiStorageValue(appSpec, type, value.bytes) } export const asArc56AppSpec = (appSpec: AppSpec): Arc56Contract => { diff --git a/src/features/applications/pages/application-page-localnet.test.tsx b/src/features/applications/pages/application-page-localnet.test.tsx index f1c5f59f6..bbb66b4ef 100644 --- a/src/features/applications/pages/application-page-localnet.test.tsx +++ b/src/features/applications/pages/application-page-localnet.test.tsx @@ -26,8 +26,8 @@ describe('application-page on localnet', () => { }) beforeEach(async () => { - const { app } = await deploySmartContract(localnet, Arc32TestContractAppSpec as AppSpec) - appId = Number(app.appId) + const { app } = await deploySmartContract(localnet.context.testAccount, localnet.algorand, Arc32TestContractAppSpec as AppSpec) + appId = app.appId }) it('should be rendered with the correct data', async () => { diff --git a/src/features/applications/pages/application-page.test.tsx b/src/features/applications/pages/application-page.test.tsx index 7c066ff8b..9739030af 100644 --- a/src/features/applications/pages/application-page.test.tsx +++ b/src/features/applications/pages/application-page.test.tsx @@ -30,7 +30,7 @@ import { } from '../components/labels' import { descriptionListAssertion } from '@/tests/assertions/description-list-assertion' import { tableAssertion } from '@/tests/assertions/table-assertion' -import { modelsv2, indexerModels } from 'algosdk' +import algosdk, { modelsv2, indexerModels } from 'algosdk' import { transactionResultMother } from '@/tests/object-mother/transaction-result' import { refreshButtonLabel } from '@/features/common/components/refresh-button' import { algod, indexer } from '@/features/common/data/algo-client' @@ -165,7 +165,7 @@ describe('application-page', () => { ) ) vi.mocked(indexer.searchForTransactions().applicationID(applicationResult.id).limit(3).do).mockImplementation(() => - Promise.resolve({ currentRound: 123, transactions: [], nextToken: '' }) + Promise.resolve(new algosdk.indexerModels.TransactionsResponse({ currentRound: 123n, transactions: [], nextToken: '' })) ) return executeComponentTest( @@ -173,60 +173,58 @@ describe('application-page', () => { return render(, undefined, myStore) }, async (component, user) => { - await waitFor(async () => { - const detailsCard = component.getByLabelText(applicationDetailsLabel) - descriptionListAssertion({ - container: detailsCard, - items: [ - { term: applicationIdLabel, description: '80441968' }, - { term: applicationCreatorAccountLabel, description: '24YD4UNKUGVNGZ6QGXWIUPQ5L456FBH7LB5L6KFGQJ65YLQHXX4CQNPCZA' }, - { term: applicationAccountLabel, description: 'S3TLYVDRMR5VRKPACAYFXFLPNTYWQG37A6LPKERQ2DNABLTTGCXDUE2T3E' }, - { term: applicationGlobalStateByteLabel, description: '3' }, - { term: applicationLocalStateByteLabel, description: '0' }, - { term: applicationGlobalStateUintLabel, description: '12' }, - { term: applicationLocalStateUintLabel, description: '2' }, - ], - }) + const detailsCard = await component.findByLabelText(applicationDetailsLabel) + descriptionListAssertion({ + container: detailsCard, + items: [ + { term: applicationIdLabel, description: '80441968' }, + { term: applicationCreatorAccountLabel, description: '24YD4UNKUGVNGZ6QGXWIUPQ5L456FBH7LB5L6KFGQJ65YLQHXX4CQNPCZA' }, + { term: applicationAccountLabel, description: 'S3TLYVDRMR5VRKPACAYFXFLPNTYWQG37A6LPKERQ2DNABLTTGCXDUE2T3E' }, + { term: applicationGlobalStateByteLabel, description: '3' }, + { term: applicationLocalStateByteLabel, description: '0' }, + { term: applicationGlobalStateUintLabel, description: '12' }, + { term: applicationLocalStateUintLabel, description: '2' }, + ], + }) - const applicationStateTabList = component.getByRole('tablist', { name: applicationStateLabel }) - expect(applicationStateTabList).toBeTruthy() - // Only test the first 10 rows, should be enough - const globalStateTab = await component.findByRole('tabpanel', { - name: applicationGlobalStateLabel, - }) - await tableAssertion({ - container: globalStateTab, - rows: [ - { cells: ['Bids', 'Uint', '0'] }, - { cells: ['Creator', 'Bytes', '24YD4UNKUGVNGZ6QGXWIUPQ5L456FBH7LB5L6KFGQJ65YLQHXX4CQNPCZA'] }, - { cells: ['Dividend', 'Uint', '5'] }, - { cells: ['Escrow', 'Bytes', '24YD4UNKUGVNGZ6QGXWIUPQ5L456FBH7LB5L6KFGQJ65YLQHXX4CQNPCZA'] }, - { cells: ['FeesFirst', 'Uint', '250000'] }, - { cells: ['FeesSecond', 'Uint', '500000'] }, - { cells: ['Multiplier', 'Uint', '5'] }, - { cells: ['Pot', 'Uint', '0'] }, - { cells: ['Price', 'Uint', '1000000'] }, - { cells: ['RoundBegin', 'Uint', '1606905675'] }, - ], - }) + const applicationStateTabList = component.getByRole('tablist', { name: applicationStateLabel }) + expect(applicationStateTabList).toBeTruthy() + // Only test the first 10 rows, should be enough + const globalStateTab = await component.findByRole('tabpanel', { + name: applicationGlobalStateLabel, + }) + await tableAssertion({ + container: globalStateTab, + rows: [ + { cells: ['Bids', 'Uint', '0'] }, + { cells: ['Creator', 'Bytes', '24YD4UNKUGVNGZ6QGXWIUPQ5L456FBH7LB5L6KFGQJ65YLQHXX4CQNPCZA'] }, + { cells: ['Dividend', 'Uint', '5'] }, + { cells: ['Escrow', 'Bytes', '24YD4UNKUGVNGZ6QGXWIUPQ5L456FBH7LB5L6KFGQJ65YLQHXX4CQNPCZA'] }, + { cells: ['FeesFirst', 'Uint', '250000'] }, + { cells: ['FeesSecond', 'Uint', '500000'] }, + { cells: ['Multiplier', 'Uint', '5'] }, + { cells: ['Pot', 'Uint', '0'] }, + { cells: ['Price', 'Uint', '1000000'] }, + { cells: ['RoundBegin', 'Uint', '1606905675'] }, + ], + }) - await user.click(getByRole(applicationStateTabList, 'tab', { name: applicationBoxesLabel })) - const boxesTab = await component.findByRole('tabpanel', { name: applicationBoxesLabel }) - await tableAssertion({ - container: boxesTab, - rows: [ - { cells: ['AAAAAAAAAAAAAAAAABhjNpJEU5krRanhldfCDWa2Rs8='] }, - { cells: ['AAAAAAAAAAAAAAAAAB3fFPhSWjPaBhjzsx3NbXvlBK4='] }, - { cells: ['AAAAAAAAAAAAAAAAACctz98iaZ1MeSEbj+XCnD5CCwQ='] }, - { cells: ['AAAAAAAAAAAAAAAAACh7tCy49kQrUL7ykRWDmayeLKk='] }, - { cells: ['AAAAAAAAAAAAAAAAAECfyDmi7C5tEjBUI9N80BEnnAk='] }, - { cells: ['AAAAAAAAAAAAAAAAAEKTl0iZ2Q9UxPJphTgwplTfk6U='] }, - { cells: ['AAAAAAAAAAAAAAAAAEO4cIhnhmQ0qdQDLoXi7q0+G7o='] }, - { cells: ['AAAAAAAAAAAAAAAAAEVLZkp/l5eUQJZ/QEYYy9yNtuc='] }, - { cells: ['AAAAAAAAAAAAAAAAAEkbM2/K1+8IrJ/jdkgEoF/O5k0='] }, - { cells: ['AAAAAAAAAAAAAAAAAFwILIUnvVR4R/Xe9jTEV2SzTck='] }, - ], - }) + await user.click(getByRole(applicationStateTabList, 'tab', { name: applicationBoxesLabel })) + const boxesTab = await component.findByRole('tabpanel', { name: applicationBoxesLabel }) + await tableAssertion({ + container: boxesTab, + rows: [ + { cells: ['AAAAAAAAAAAAAAAAABhjNpJEU5krRanhldfCDWa2Rs8='] }, + { cells: ['AAAAAAAAAAAAAAAAAB3fFPhSWjPaBhjzsx3NbXvlBK4='] }, + { cells: ['AAAAAAAAAAAAAAAAACctz98iaZ1MeSEbj+XCnD5CCwQ='] }, + { cells: ['AAAAAAAAAAAAAAAAACh7tCy49kQrUL7ykRWDmayeLKk='] }, + { cells: ['AAAAAAAAAAAAAAAAAECfyDmi7C5tEjBUI9N80BEnnAk='] }, + { cells: ['AAAAAAAAAAAAAAAAAEKTl0iZ2Q9UxPJphTgwplTfk6U='] }, + { cells: ['AAAAAAAAAAAAAAAAAEO4cIhnhmQ0qdQDLoXi7q0+G7o='] }, + { cells: ['AAAAAAAAAAAAAAAAAEVLZkp/l5eUQJZ/QEYYy9yNtuc='] }, + { cells: ['AAAAAAAAAAAAAAAAAEkbM2/K1+8IrJ/jdkgEoF/O5k0='] }, + { cells: ['AAAAAAAAAAAAAAAAAFwILIUnvVR4R/Xe9jTEV2SzTck='] }, + ], }) } ) @@ -245,7 +243,13 @@ describe('application-page', () => { vi.mocked(useParams).mockImplementation(() => ({ applicationId: applicationResult.id.toString() })) vi.mocked(indexer.searchForTransactions().applicationID(applicationResult.id).limit(3).do).mockImplementation(() => - Promise.resolve({ currentRound: 123, transactions: [transactionResult], nextToken: '' }) + Promise.resolve( + new algosdk.indexerModels.TransactionsResponse({ + currentRound: 123n, + transactions: [transactionResult] as algosdk.indexerModels.Transaction[], + nextToken: '', + }) + ) ) return executeComponentTest( @@ -319,7 +323,13 @@ describe('application-page', () => { ) ) vi.mocked(indexer.searchForTransactions().applicationID(applicationResult.id).limit(3).do).mockImplementation(() => - Promise.resolve({ currentRound: 123, transactions: [], nextToken: '' }) + Promise.resolve( + new algosdk.indexerModels.TransactionsResponse({ + currentRound: 123n, + transactions: [], + nextToken: '', + }) + ) ) return executeComponentTest( @@ -361,7 +371,13 @@ describe('application-page', () => { const applicationResult = applicationResultMother['testnet-718348254']().build() vi.mocked(useParams).mockImplementation(() => ({ applicationId: applicationResult.id.toString() })) vi.mocked(indexer.searchForTransactions().applicationID(applicationResult.id).limit(3).do).mockImplementation(() => - Promise.resolve({ currentRound: 123, transactions: [], nextToken: '' }) + Promise.resolve( + new algosdk.indexerModels.TransactionsResponse({ + currentRound: 123n, + transactions: [], + nextToken: '', + }) + ) ) const myStore = createStore() @@ -386,38 +402,36 @@ describe('application-page', () => { return render(, undefined, myStore) }, async (component, user) => { - await waitFor(async () => { - const abiMethodsCard = component.getByLabelText(applicationAbiMethodDefinitionsLabel) - expect(abiMethodsCard).toBeTruthy() + const abiMethodsCard = await component.findByLabelText(applicationAbiMethodDefinitionsLabel) + expect(abiMethodsCard).toBeTruthy() - const echoStructAccordionTrigger = component.getByRole('button', { name: 'echo_struct' }) - await user.click(echoStructAccordionTrigger) + const echoStructAccordionTrigger = component.getByRole('button', { name: 'echo_struct' }) + await user.click(echoStructAccordionTrigger) - const echoStructAccordionPanel = component.getByRole('region', { name: 'echo_struct' }) - expect(echoStructAccordionPanel).toBeTruthy() + const echoStructAccordionPanel = component.getByRole('region', { name: 'echo_struct' }) + expect(echoStructAccordionPanel).toBeTruthy() - const argumentsDiv = within(echoStructAccordionPanel).getByText('Arguments').parentElement - expect(argumentsDiv).toBeTruthy() + const argumentsDiv = within(echoStructAccordionPanel).getByText('Arguments').parentElement + expect(argumentsDiv).toBeTruthy() - const argument1Div = within(argumentsDiv!).getByText('Argument 1').parentElement - descriptionListAssertion({ - container: argument1Div!, - items: [ - { term: 'Name', description: 'inputUser' }, - { term: 'Type', description: 'UserStruct:name: stringid: uint64' }, - ], - }) + const argument1Div = within(argumentsDiv!).getByText('Argument 1').parentElement + descriptionListAssertion({ + container: argument1Div!, + items: [ + { term: 'Name', description: 'inputUser' }, + { term: 'Type', description: 'UserStruct:name: stringid: uint64' }, + ], + }) - const returnDiv = within(echoStructAccordionPanel).getByText('Return').parentElement - expect(returnDiv).toBeTruthy() + const returnDiv = within(echoStructAccordionPanel).getByText('Return').parentElement + expect(returnDiv).toBeTruthy() - const returnTypeDiv = within(returnDiv!).getByText('Type').parentElement - expect(returnTypeDiv).toBeTruthy() + const returnTypeDiv = within(returnDiv!).getByText('Type').parentElement + expect(returnTypeDiv).toBeTruthy() - descriptionListAssertion({ - container: returnTypeDiv!, - items: [{ term: 'Type', description: 'UserStruct:name: stringid: uint64' }], - }) + descriptionListAssertion({ + container: returnTypeDiv!, + items: [{ term: 'Type', description: 'UserStruct:name: stringid: uint64' }], }) } ) @@ -444,7 +458,13 @@ describe('application-page', () => { ) ) vi.mocked(indexer.searchForTransactions().applicationID(applicationResult.id).limit(3).do).mockImplementation(() => - Promise.resolve({ currentRound: 123, transactions: [], nextToken: '' }) + Promise.resolve( + new algosdk.indexerModels.TransactionsResponse({ + currentRound: 123n, + transactions: [], + nextToken: '', + }) + ) ) const myStore = createStore() @@ -515,7 +535,13 @@ describe('application-page', () => { ) ) vi.mocked(indexer.searchForTransactions().applicationID(applicationResult.id).limit(3).do).mockImplementation(() => - Promise.resolve({ currentRound: 123, transactions: [], nextToken: '' }) + Promise.resolve( + new algosdk.indexerModels.TransactionsResponse({ + currentRound: 123n, + transactions: [], + nextToken: '', + }) + ) ) const myStore = createStore() diff --git a/src/features/applications/pages/application-page.tsx b/src/features/applications/pages/application-page.tsx index 846b7f8fe..991dfb854 100644 --- a/src/features/applications/pages/application-page.tsx +++ b/src/features/applications/pages/application-page.tsx @@ -31,7 +31,7 @@ export function ApplicationPage() { const { applicationId: _applicationId } = useRequiredParam(UrlParams.ApplicationId) invariant(isInteger(_applicationId), applicationInvalidIdMessage) - const applicationId = parseInt(_applicationId, 10) + const applicationId = BigInt(_applicationId) const [loadableApplication, refreshApplication, isStale] = useLoadableApplication(applicationId) useTitle() diff --git a/src/features/applications/utils/get-application-transactions-table-sub-rows.ts b/src/features/applications/utils/get-application-transactions-table-sub-rows.ts index 4c2b7869a..e10d7e92e 100644 --- a/src/features/applications/utils/get-application-transactions-table-sub-rows.ts +++ b/src/features/applications/utils/get-application-transactions-table-sub-rows.ts @@ -1,7 +1,8 @@ import { Transaction, InnerTransaction, TransactionType } from '@/features/transactions/models' import { flattenInnerTransactions } from '@/utils/flatten-inner-transactions' +import { ApplicationId } from '../data/types' -export const getApplicationTransactionsTableSubRows = (applicationId: number, transaction: Transaction | InnerTransaction) => { +export const getApplicationTransactionsTableSubRows = (applicationId: ApplicationId, transaction: Transaction | InnerTransaction) => { if (transaction.type !== TransactionType.AppCall || transaction.innerTransactions.length === 0) { return [] } diff --git a/src/features/assets/components/asset-details.tsx b/src/features/assets/components/asset-details.tsx index 72a4456f0..18c0d46b0 100644 --- a/src/features/assets/components/asset-details.tsx +++ b/src/features/assets/components/asset-details.tsx @@ -57,7 +57,7 @@ export function AssetDetails({ asset }: Props) { dd: (
- {asset.id} + {asset.id.toString()}
{asset.standardsUsed.map((s, i) => ( @@ -162,7 +162,7 @@ export function AssetDetails({ asset }: Props) {
- {asset.id !== 0 && ( + {asset.id !== 0n && ( <> diff --git a/src/features/assets/components/asset-link.tsx b/src/features/assets/components/asset-link.tsx index a4afc3a6a..cce7a1fbb 100644 --- a/src/features/assets/components/asset-link.tsx +++ b/src/features/assets/components/asset-link.tsx @@ -7,6 +7,7 @@ import { AsyncMaybeAtom } from '@/features/common/data/types' import { RenderInlineAsyncAtom } from '@/features/common/components/render-inline-async-atom' import { CopyButton } from '@/features/common/components/copy-button' import { useSelectedNetwork } from '@/features/network/data' +import { AssetId } from '../data/types' type CommonProps = { className?: string @@ -15,13 +16,13 @@ type CommonProps = { type AssetIdLinkProps = PropsWithChildren< { - assetId: number + assetId: AssetId } & CommonProps > type AssetIdAndNameLinkProps = PropsWithChildren< { - assetId: number + assetId: AssetId assetName?: string } & CommonProps > @@ -40,7 +41,7 @@ function Link(props: AssetIdLinkProps | AssetIdAndNameLinkProps) { urlTemplate={Urls.Network.Explore.Asset.ById} urlParams={{ assetId: props.assetId.toString(), networkId: selectedNetwork }} > - {props.children ? props.children : props.assetId} + {props.children ? props.children : props.assetId.toString()} ) diff --git a/src/features/assets/components/asset-live-transactions.tsx b/src/features/assets/components/asset-live-transactions.tsx index 2c493e78c..d57ee39ba 100644 --- a/src/features/assets/components/asset-live-transactions.tsx +++ b/src/features/assets/components/asset-live-transactions.tsx @@ -1,7 +1,7 @@ import { AssetId } from '../data/types' import { useCallback } from 'react' import { LiveTransactionsTable } from '@/features/transactions/components/live-transactions-table' -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' import { getAssetIdsForTransaction } from '@/features/transactions/utils/get-asset-ids-for-transaction' import { InnerTransaction, Transaction } from '@/features/transactions/models' import { getAssetTransactionsTableSubRows } from '../utils/get-asset-transactions-table-sub-rows' diff --git a/src/features/assets/components/asset-transaction-history.test.tsx b/src/features/assets/components/asset-transaction-history.test.tsx index 3108fe0ef..f237a4eab 100644 --- a/src/features/assets/components/asset-transaction-history.test.tsx +++ b/src/features/assets/components/asset-transaction-history.test.tsx @@ -11,6 +11,7 @@ import { transactionResultMother } from '@/tests/object-mother/transaction-resul import { getAllByRole } from '@testing-library/dom' import { ANY_NUMBER, ANY_STRING, searchTransactionsMock } from '@/tests/setup/mocks' import { RenderResult } from '@testing-library/react' +import algosdk from 'algosdk' vi.mock('@/features/common/data/algo-client', async () => { const original = await vi.importActual('@/features/common/data/algo-client') @@ -33,14 +34,23 @@ describe('asset-transaction-history', () => { vi.mocked(indexer.searchForTransactions().assetID(ANY_NUMBER).nextToken(ANY_STRING).limit(ANY_NUMBER).do).mockImplementation(() => { const args = searchTransactionsMock.args if (args.nextToken === '') { - return Promise.resolve({ - transactions: Array.from({ length: 18 }).map(() => transactionResultMother.transfer(asset).build()), - ['next-token']: '4652AgAAAAAFAAAA', - }) + return Promise.resolve( + new algosdk.indexerModels.TransactionsResponse({ + transactions: Array.from({ length: 18 }).map( + () => transactionResultMother.transfer(asset).build() as algosdk.indexerModels.Transaction + ), + nextToken: '4652AgAAAAAFAAAA', + currentRound: 1, + }) + ) } - return Promise.resolve({ - transactions: [], - }) + return Promise.resolve( + new algosdk.indexerModels.TransactionsResponse({ + transactions: [], + nextToken: undefined, + currentRound: 1, + }) + ) }) // First page should have 10 items diff --git a/src/features/assets/data/asset-metadata.ts b/src/features/assets/data/asset-metadata.ts index 363177846..269ba46df 100644 --- a/src/features/assets/data/asset-metadata.ts +++ b/src/features/assets/data/asset-metadata.ts @@ -1,4 +1,3 @@ -import { TransactionResult, TransactionSearchResults } from '@algorandfoundation/algokit-utils/types/indexer' import { flattenTransactionResult } from '@/features/transactions/utils/flatten-transaction-result' import { TransactionType } from 'algosdk' import { Arc3MetadataResult, Arc69MetadataResult, AssetMetadataResult, AssetResult } from './types' @@ -11,6 +10,10 @@ import { readOnlyAtomCache } from '@/features/common/data' import { indexer } from '@/features/common/data/algo-client' import { replaceIpfsWithGatewayIfNeeded } from '../utils/replace-ipfs-with-gateway-if-needed' import { Getter, Setter } from 'jotai/index' +import { TransactionResult } from '@/features/transactions/data/types' +import algosdk from 'algosdk' +import { uint8ArrayToBase64 } from '@/utils/uint8-array-to-base64' +import { indexerTransactionToTransactionResult } from '@/features/transactions/mappers/indexer-transaction-mappers' // Currently, we support ARC-3, 19 and 69. Their specs can be found here https://github.com/algorandfoundation/ARCs/tree/main/ARCs // ARCs are community standard, therefore, there are edge cases @@ -28,7 +31,7 @@ const createAssetMetadataResult = async ( // Get ARC-69 metadata if applicable if (latestAssetCreateOrReconfigureTransaction && latestAssetCreateOrReconfigureTransaction.note) { - const metadata = noteToArc69Metadata(latestAssetCreateOrReconfigureTransaction.note) + const metadata = noteToArc69Metadata(uint8ArrayToBase64(latestAssetCreateOrReconfigureTransaction.note)) if (metadata) { arc69MetadataResult = { metadata, @@ -108,7 +111,7 @@ const noteToArc69Metadata = (note: string | undefined) => { } const getAssetMetadataResult = async (_: Getter, __: Setter, assetResult: AssetResult) => { - if (assetResult.index === 0) { + if (assetResult.index === 0n) { return null } @@ -122,13 +125,13 @@ const getAssetMetadataResult = async (_: Getter, __: Setter, assetResult: AssetR .addressRole('sender') .limit(2) // Return 2 to cater for a destroy transaction and any potential eventual consistency delays between transactions and assets. .do() - .then((res) => res.transactions as TransactionResult[]) // Implicitly newest to oldest when filtering with an address. + .then((res) => res.transactions.map((txn) => indexerTransactionToTransactionResult(txn))) // Implicitly newest to oldest when filtering with an address. : [] if (results.length === 0) { // The asset has been destroyed, is an immutable asset, or the asset is mutable however has never been mutated. // Fetch the entire acfg transaction history and reverse the order, so it's newest to oldest. results = await executePaginatedRequest( - (res: TransactionSearchResults) => res.transactions, + (res: algosdk.indexerModels.TransactionsResponse) => res.transactions.map((txn) => indexerTransactionToTransactionResult(txn)), (nextToken) => { let s = indexer.searchForTransactions().assetID(assetResult.index).txType('acfg') if (nextToken) { @@ -140,8 +143,8 @@ const getAssetMetadataResult = async (_: Getter, __: Setter, assetResult: AssetR } const assetConfigTransactionResults = results.flatMap(flattenTransactionResult).filter((t) => { - const isAssetConfigTransaction = t['tx-type'] === TransactionType.acfg - const isDestroyTransaction = t['asset-config-transaction']?.['params'] === undefined + const isAssetConfigTransaction = t.txType === TransactionType.acfg + const isDestroyTransaction = t.assetConfigTransaction?.params === undefined return isAssetConfigTransaction && !isDestroyTransaction }) diff --git a/src/features/assets/data/asset-opt-in-out.ts b/src/features/assets/data/asset-opt-in-out.ts index afbedb153..1ac6503ba 100644 --- a/src/features/assets/data/asset-opt-in-out.ts +++ b/src/features/assets/data/asset-opt-in-out.ts @@ -12,7 +12,7 @@ export const useAssetOptInOut = (asset: Asset) => { return atom(async (get) => { const activeAccount = await get(activeWalletAccountAtom) - if (asset.id === 0 || !activeAccount) { + if (asset.id === 0n || !activeAccount) { return { hasActiveAccount: !!activeAccount, canOptIn: false, @@ -23,7 +23,7 @@ export const useAssetOptInOut = (asset: Asset) => { return { hasActiveAccount: !!activeAccount, canOptIn: !activeAccount.assetHolding.has(asset.id), - canOptOut: activeAccount.assetHolding.has(asset.id) && activeAccount.assetHolding.get(asset.id)!.amount === 0, + canOptOut: activeAccount.assetHolding.has(asset.id) && activeAccount.assetHolding.get(asset.id)!.amount === 0n, } }) }, [asset]) diff --git a/src/features/assets/data/asset-result.ts b/src/features/assets/data/asset-result.ts index b56871833..4035def05 100644 --- a/src/features/assets/data/asset-result.ts +++ b/src/features/assets/data/asset-result.ts @@ -5,19 +5,20 @@ import { readOnlyAtomCache } from '@/features/common/data' import { ZERO_ADDRESS } from '@/features/common/constants' import { algod, indexer } from '@/features/common/data/algo-client' import { Getter, Setter } from 'jotai/index' +import { removeEncodableMethods } from '@/utils/remove-encodable-methods' -export const algoAssetResult = { - index: 0, - 'created-at-round': 0, +export const algoAssetResult: AssetResult = { + index: 0n, + createdAtRound: 0n, params: { creator: ZERO_ADDRESS, decimals: 6, total: 10_000_000_000_000_000n, name: 'ALGO', - 'unit-name': 'ALGO', + unitName: 'ALGO', url: 'https://www.algorand.foundation', }, -} as AssetResult +} const getAssetResult = async (_: Getter, __: Setter, assetId: AssetId) => { try { @@ -25,7 +26,7 @@ const getAssetResult = async (_: Getter, __: Setter, assetId: AssetId) => { return await algod .getAssetByID(assetId) .do() - .then((result) => result as AssetResult) + .then((result) => removeEncodableMethods(result) as AssetResult) } catch (e: unknown) { if (is404(asError(e))) { // Handle destroyed assets or assets that may not be available in algod potentially due to the node type @@ -33,7 +34,12 @@ const getAssetResult = async (_: Getter, __: Setter, assetId: AssetId) => { .lookupAssetByID(assetId) .includeAll(true) // Returns destroyed assets .do() - .then((result) => result.asset as AssetResult) + .then((result) => { + if (!result.asset) { + throw new Error(`Asset ${assetId} not found`) + } + return removeEncodableMethods(result.asset) as AssetResult + }) } throw e } diff --git a/src/features/assets/data/asset-transaction-history.ts b/src/features/assets/data/asset-transaction-history.ts index fb9f09e2d..fe7243eb2 100644 --- a/src/features/assets/data/asset-transaction-history.ts +++ b/src/features/assets/data/asset-transaction-history.ts @@ -1,23 +1,24 @@ import { AssetId } from '../data/types' import { createReadOnlyAtomAndTimestamp } from '@/features/common/data' -import { TransactionResult, TransactionSearchResults } from '@algorandfoundation/algokit-utils/types/indexer' import { createTransactionsAtom, transactionResultsAtom } from '@/features/transactions/data' import { atomEffect } from 'jotai-effect' import { atom } from 'jotai' import { createLoadableViewModelPageAtom } from '@/features/common/data/lazy-load-pagination' import { DEFAULT_FETCH_SIZE } from '@/features/common/constants' import { indexer } from '@/features/common/data/algo-client' +import { TransactionResult } from '@/features/transactions/data/types' +import { indexerTransactionToTransactionResult } from '@/features/transactions/mappers/indexer-transaction-mappers' const getAssetTransactionResults = async (assetId: AssetId, nextPageToken?: string) => { - const results = (await indexer + const results = await indexer .searchForTransactions() .assetID(assetId) .nextToken(nextPageToken ?? '') .limit(DEFAULT_FETCH_SIZE) - .do()) as TransactionSearchResults + .do() return { - transactionResults: results.transactions, - nextPageToken: results['next-token'], + transactionResults: results.transactions.map((txn) => indexerTransactionToTransactionResult(txn)), + nextPageToken: results.nextToken, } as const } diff --git a/src/features/assets/data/types.ts b/src/features/assets/data/types.ts index cf50a747d..adc1baf92 100644 --- a/src/features/assets/data/types.ts +++ b/src/features/assets/data/types.ts @@ -1,8 +1,10 @@ -import { AssetResult as IndexerAssetResult } from '@algorandfoundation/algokit-utils/types/indexer' +import algosdk from 'algosdk' -export type AssetId = number +export type AssetId = bigint -export type AssetResult = Omit +export type AssetResult = Omit & { + params: Omit +} type Arc16MetadataProperties = { traits?: Record diff --git a/src/features/assets/mappers/asset-summary.ts b/src/features/assets/mappers/asset-summary.ts index 75e22e49d..ec971190b 100644 --- a/src/features/assets/mappers/asset-summary.ts +++ b/src/features/assets/mappers/asset-summary.ts @@ -4,9 +4,9 @@ import { AssetSummary } from '../models' export const asAssetSummary = (assetResult: AssetResult): AssetSummary => { return { id: assetResult.index, - name: assetResult.params.name ?? assetResult.params['name-b64']?.toString(), + name: assetResult.params.name ?? assetResult.params.nameB64?.toString(), decimals: Number(assetResult.params.decimals), - unitName: assetResult.params['unit-name'], + unitName: assetResult.params.unitName, creator: assetResult.params.creator, manager: assetResult.params.manager, reserve: assetResult.params.reserve, diff --git a/src/features/assets/mappers/asset.ts b/src/features/assets/mappers/asset.ts index 62990da2c..167d9998d 100644 --- a/src/features/assets/mappers/asset.ts +++ b/src/features/assets/mappers/asset.ts @@ -6,20 +6,20 @@ import { replaceIpfsWithGatewayIfNeeded } from '../utils/replace-ipfs-with-gatew import Decimal from 'decimal.js' import { getArc19Url, isArc19Url } from '../utils/arc19' import { isArc16Properties } from '../utils/arc16' -import { asJson } from '@/utils/as-json' +import { asJson, normaliseAlgoSdkData } from '@/utils/as-json' export const asAsset = (assetResult: AssetResult, metadataResult: AssetMetadataResult): Asset => { return { ...asAssetSummary(assetResult), total: assetResult.params.total, - defaultFrozen: assetResult.params['default-frozen'] ?? false, + defaultFrozen: assetResult.params.defaultFrozen ?? false, url: assetResult.params.url, type: asType(assetResult), standardsUsed: asStandardsUsed(assetResult, metadataResult), traits: asTraits(metadataResult), media: asMedia(assetResult, metadataResult), metadata: asMetadata(metadataResult), - json: asJson(assetResult), + json: asJson(normaliseAlgoSdkData(assetResult)), } } @@ -133,7 +133,7 @@ const asType = (assetResult: AssetResult): AssetType => { return AssetType.Deleted } - if (assetResult.params.total === 1 && assetResult.params.decimals === 0) { + if (assetResult.params.total === 1n && assetResult.params.decimals === 0) { return AssetType.PureNonFungible } // Check for fractional non-fungible diff --git a/src/features/assets/models/index.ts b/src/features/assets/models/index.ts index 8184e3f46..0b99c277e 100644 --- a/src/features/assets/models/index.ts +++ b/src/features/assets/models/index.ts @@ -1,5 +1,7 @@ +import { AssetId } from '../data/types' + export type AssetSummary = { - id: number + id: AssetId name?: string decimals: number unitName?: string diff --git a/src/features/assets/pages/asset-page.test.tsx b/src/features/assets/pages/asset-page.test.tsx index 4ce656c67..a70eca4c5 100644 --- a/src/features/assets/pages/asset-page.test.tsx +++ b/src/features/assets/pages/asset-page.test.tsx @@ -35,6 +35,7 @@ import { algod, indexer } from '@/features/common/data/algo-client' import { setupServer } from 'msw/node' import { http, HttpResponse } from 'msw' import { searchTransactionsMock } from '@/tests/setup/mocks' +import algosdk from 'algosdk' const server = setupServer() @@ -117,7 +118,15 @@ describe('asset-page', () => { vi.mocked(useParams).mockImplementation(() => ({ assetId: assetResult.index.toString() })) vi.mocked( indexer.searchForTransactions().assetID(assetResult.index).txType('acfg').address('').addressRole('sender').limit(2).do - ).mockReturnValue(Promise.resolve({ transactions: [transactionResult] })) + ).mockReturnValue( + Promise.resolve( + new algosdk.indexerModels.TransactionsResponse({ + transactions: [transactionResult as algosdk.indexerModels.Transaction], + nextToken: undefined, + currentRound: 1, + }) + ) + ) server.use( http.get('https://ipfs.algonode.xyz/ipfs/QmUitxJuPJJrcuAdAiVdEEpuzGmsELGgAvhLd5FiXRShEu', () => { return HttpResponse.json({ @@ -202,7 +211,15 @@ describe('asset-page', () => { vi.mocked(useParams).mockImplementation(() => ({ assetId: assetResult.index.toString() })) vi.mocked( indexer.searchForTransactions().assetID(assetResult.index).txType('acfg').address('').addressRole('sender').limit(2).do - ).mockReturnValue(Promise.resolve({ transactions: [transactionResult] })) + ).mockReturnValue( + Promise.resolve( + new algosdk.indexerModels.TransactionsResponse({ + transactions: [transactionResult as algosdk.indexerModels.Transaction], + nextToken: undefined, + currentRound: 1, + }) + ) + ) server.use( http.get('https://ipfs.algonode.xyz/ipfs/bafkreidt263gwlss4t5kdg6tekxhlxsedb42l5ntvt5mzbv5jywzrzk2ku', () => { return HttpResponse.json({ @@ -303,7 +320,15 @@ describe('asset-page', () => { vi.mocked(useParams).mockImplementation(() => ({ assetId: assetResult.index.toString() })) vi.mocked( indexer.searchForTransactions().assetID(assetResult.index).txType('acfg').address('').addressRole('sender').limit(2).do - ).mockReturnValue(Promise.resolve({ transactions: [transactionResult] })) + ).mockReturnValue( + Promise.resolve( + new algosdk.indexerModels.TransactionsResponse({ + transactions: [transactionResult as algosdk.indexerModels.Transaction], + nextToken: undefined, + currentRound: 1, + }) + ) + ) return executeComponentTest( () => { @@ -389,7 +414,15 @@ describe('asset-page', () => { vi.mocked(useParams).mockImplementation(() => ({ assetId: assetResult.index.toString() })) vi.mocked( indexer.searchForTransactions().assetID(assetResult.index).txType('acfg').address('').addressRole('sender').limit(2).do - ).mockReturnValue(Promise.resolve({ transactions: [transactionResult] })) + ).mockReturnValue( + Promise.resolve( + new algosdk.indexerModels.TransactionsResponse({ + transactions: [transactionResult as algosdk.indexerModels.Transaction], + nextToken: undefined, + currentRound: 1, + }) + ) + ) server.use( http.get('https://ipfs.algonode.xyz/ipfs/bafkreifpfaqwwfyj2zcy76hr6eswkhbqak5bxjzhryeeg7tqnzjgmx5xfi', () => { return HttpResponse.json({ @@ -474,7 +507,15 @@ describe('asset-page', () => { vi.mocked(useParams).mockImplementation(() => ({ assetId: assetResult.index.toString() })) vi.mocked( indexer.searchForTransactions().assetID(assetResult.index).txType('acfg').address('').addressRole('sender').limit(2).do - ).mockReturnValue(Promise.resolve({ transactions: [transactionResult] })) + ).mockReturnValue( + Promise.resolve( + new algosdk.indexerModels.TransactionsResponse({ + transactions: [transactionResult as algosdk.indexerModels.Transaction], + nextToken: undefined, + currentRound: 1, + }) + ) + ) server.use( http.get('https://ipfs.algonode.xyz/ipfs/bafkreihwm3mg4t4bgdvsf6j4epr4v7qwmuhbk6dv3qt3kmtmmm7uagrji4', () => { return HttpResponse.json({ @@ -591,7 +632,15 @@ describe('asset-page', () => { vi.mocked(useParams).mockImplementation(() => ({ assetId: assetResult.index.toString() })) vi.mocked( indexer.searchForTransactions().assetID(assetResult.index).txType('acfg').address('').addressRole('sender').limit(2).do - ).mockReturnValue(Promise.resolve({ transactions: [transactionResult] })) + ).mockReturnValue( + Promise.resolve( + new algosdk.indexerModels.TransactionsResponse({ + transactions: [transactionResult as algosdk.indexerModels.Transaction], + nextToken: undefined, + currentRound: 1, + }) + ) + ) server.use( http.get('https://ipfs.algonode.xyz/ipfs/QmfYFvNon3vfxbwtcetjYc1uZZ1Faw7AsQtSzz45sxXnaj', () => { return HttpResponse.json({ @@ -724,7 +773,17 @@ describe('asset-page', () => { vi.mocked(useParams).mockImplementation(() => ({ assetId: assetResult.index.toString() })) vi.mocked(indexer.searchForTransactions().assetID(assetResult.index).txType('acfg').do).mockImplementation(() => - Promise.resolve([createAssetTransactionResult, reconfigureAssetTransactionResult, destroyAssetTransactionResult]) + Promise.resolve( + new algosdk.indexerModels.TransactionsResponse({ + transactions: [ + createAssetTransactionResult as algosdk.indexerModels.Transaction, + reconfigureAssetTransactionResult as algosdk.indexerModels.Transaction, + destroyAssetTransactionResult as algosdk.indexerModels.Transaction, + ], + nextToken: undefined, + currentRound: 1, + }) + ) ) return executeComponentTest( @@ -810,7 +869,15 @@ describe('asset-page', () => { vi.mocked(useParams).mockImplementation(() => ({ assetId: assetResult.index.toString() })) vi.mocked( indexer.searchForTransactions().assetID(assetResult.index).txType('acfg').address('').addressRole('sender').limit(2).do - ).mockReturnValue(Promise.resolve({ transactions: [transactionResult] })) + ).mockReturnValue( + Promise.resolve( + new algosdk.indexerModels.TransactionsResponse({ + transactions: [transactionResult as algosdk.indexerModels.Transaction], + nextToken: undefined, + currentRound: 1, + }) + ) + ) server.use( http.get('https://ipfs.algonode.xyz/ipfs/QmUitxJuPJJrcuAdAiVdEEpuzGmsELGgAvhLd5FiXRShEu', () => { return HttpResponse.json({ @@ -869,7 +936,15 @@ describe('asset-page', () => { vi.mocked(useParams).mockImplementation(() => ({ assetId: assetResult.index.toString() })) vi.mocked( indexer.searchForTransactions().assetID(assetResult.index).txType('acfg').address('').addressRole('sender').limit(2).do - ).mockReturnValue(Promise.resolve({ transactions: [transactionResult] })) + ).mockReturnValue( + Promise.resolve( + new algosdk.indexerModels.TransactionsResponse({ + transactions: [transactionResult as algosdk.indexerModels.Transaction], + nextToken: undefined, + currentRound: 1, + }) + ) + ) server.use( http.head('https://ipfs.algonode.xyz/ipfs/QmbYMPpNdec5Nj8g11JCcaArCSreLWYUcAhPqAK6LjPAtd', () => { return new Response(null, { status: 200, headers: { 'Content-Type': 'image/png' } }) diff --git a/src/features/assets/pages/asset-page.tsx b/src/features/assets/pages/asset-page.tsx index 49cf5a93c..503d22c5a 100644 --- a/src/features/assets/pages/asset-page.tsx +++ b/src/features/assets/pages/asset-page.tsx @@ -31,7 +31,7 @@ export function AssetPage() { const { assetId: _assetId } = useRequiredParam(UrlParams.AssetId) invariant(isInteger(_assetId), assetInvalidIdMessage) - const assetId = parseInt(_assetId, 10) + const assetId = BigInt(_assetId) const [loadableAsset, refreshAsset, isStale] = useLoadableAsset(assetId) useTitle() diff --git a/src/features/blocks/components/block-details.tsx b/src/features/blocks/components/block-details.tsx index 7afcd5593..53544a31b 100644 --- a/src/features/blocks/components/block-details.tsx +++ b/src/features/blocks/components/block-details.tsx @@ -31,7 +31,7 @@ export function BlockDetails({ block }: Props) { dt: roundLabel, dd: (
- {block.round} + {block.round.toString()}
), diff --git a/src/features/blocks/components/block-link.tsx b/src/features/blocks/components/block-link.tsx index dee6e5b16..725912fdd 100644 --- a/src/features/blocks/components/block-link.tsx +++ b/src/features/blocks/components/block-link.tsx @@ -3,9 +3,10 @@ import { TemplatedNavLink } from '@/features/routing/components/templated-nav-li import { Urls } from '@/routes/urls' import { PropsWithChildren } from 'react' import { useSelectedNetwork } from '@/features/network/data' +import { Round } from '../data/types' type Props = PropsWithChildren<{ - round: number + round: Round className?: string }> @@ -18,7 +19,7 @@ export function BlockLink({ round, className, children }: Props) { urlTemplate={Urls.Network.Explore.Block.ByRound} urlParams={{ round: round.toString(), networkId: selectedNetwork }} > - {children ? children : round} + {children ? children : round.toString()} ) } diff --git a/src/features/blocks/components/latest-blocks.tsx b/src/features/blocks/components/latest-blocks.tsx index cb843b946..88d61316a 100644 --- a/src/features/blocks/components/latest-blocks.tsx +++ b/src/features/blocks/components/latest-blocks.tsx @@ -24,7 +24,7 @@ export function LatestBlocks({ latestBlocks }: Props) {
-

{block.round}

+

{block.round.toString()}

diff --git a/src/features/blocks/data/block-result.ts b/src/features/blocks/data/block-result.ts index 6ebbabead..eab7e5d02 100644 --- a/src/features/blocks/data/block-result.ts +++ b/src/features/blocks/data/block-result.ts @@ -1,12 +1,14 @@ import { atom, Getter, Setter } from 'jotai' import { createReadOnlyAtomAndTimestamp, readOnlyAtomCache } from '@/features/common/data' -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' import { transactionResultsAtom } from '@/features/transactions/data' import { BlockResult, Round } from './types' import { groupResultsAtom } from '@/features/groups/data' import { GroupId, GroupResult } from '@/features/groups/data/types' import { flattenTransactionResult } from '@/features/transactions/utils/flatten-transaction-result' import { indexer } from '@/features/common/data/algo-client' +import { TransactionResult } from '@/features/transactions/data/types' +import { uint8ArrayToBase64 } from '@/utils/uint8-array-to-base64' +import { indexerTransactionToTransactionResult } from '@/features/transactions/mappers/indexer-transaction-mappers' export const getBlockAndExtractData = async (round: Round) => { // We use indexer instead of algod, as algod might not have the full history of blocks @@ -15,25 +17,29 @@ export const getBlockAndExtractData = async (round: Round) => { .do() .then((result) => { const { transactions, ...block } = result - const [transactionIds, groupResults] = ((transactions ?? []) as TransactionResult[]).reduce( - (acc, t) => { - // Accumulate transactions - acc[0].push(t.id) + const [transactionIds, groupResults] = (transactions ?? []) + .map((txn) => indexerTransactionToTransactionResult(txn)) + .reduce( + (acc, t) => { + // Accumulate transactions + acc[0].push(t.id) - // Accumulate group results - accumulateGroupsFromTransaction(acc[1], t, block.round, block.timestamp) + // Accumulate group results + accumulateGroupsFromTransaction(acc[1], t, block.round, block.timestamp) - return acc - }, - [[], new Map()] as [string[], Map] - ) + return acc + }, + [[], new Map()] as [string[], Map] + ) return [ { ...block, + timestamp: block.timestamp, transactionIds, + txnCounter: block.txnCounter !== undefined ? BigInt(block.txnCounter) : undefined, } as BlockResult, - (transactions ?? []) as TransactionResult[], + (transactions ?? []).map((txn) => indexerTransactionToTransactionResult(txn)), Array.from(groupResults.values()), ] as const }) @@ -42,23 +48,23 @@ export const getBlockAndExtractData = async (round: Round) => { export const accumulateGroupsFromTransaction = ( acc: Map, transaction: TransactionResult, - round: number, + round: bigint, roundTime: number ) => { // Inner transactions can be part of a group, just like regular transactions. - // In this scenario we add the root transaction id to the group, as inner transactions don't have ids on the network. flattenTransactionResult(transaction).forEach((txn) => { - if (txn.group) { - const group: GroupResult = acc.get(txn.group) ?? { - id: txn.group, + const groupId = txn.group ? uint8ArrayToBase64(txn.group) : undefined + if (groupId) { + const group: GroupResult = acc.get(groupId) ?? { + id: groupId, round, timestamp: new Date(roundTime * 1000).toISOString(), transactionIds: [], } - if (!group.transactionIds.find((id) => id === transaction.id)) { - group.transactionIds.push(transaction.id) + if (!group.transactionIds.find((id) => id === txn.id)) { + group.transactionIds.push(txn.id) } - acc.set(txn.group, group) + acc.set(groupId, group) } }) } @@ -72,7 +78,7 @@ export const addStateExtractedFromBlocksAtom = atom( set(transactionResultsAtom, (prev) => { const next = new Map(prev) transactionResultsToAdd.forEach((transactionResult) => { - if (!next.has(transactionResult.id)) { + if (transactionResult.id && !next.has(transactionResult.id)) { next.set(transactionResult.id, createReadOnlyAtomAndTimestamp(transactionResult)) } }) diff --git a/src/features/blocks/data/block.ts b/src/features/blocks/data/block.ts index 7c319619a..05b944939 100644 --- a/src/features/blocks/data/block.ts +++ b/src/features/blocks/data/block.ts @@ -9,13 +9,13 @@ import { syncedRoundAtom } from './synced-round' import { atomEffect } from 'jotai-effect' const createBlockAtom = (round: Round) => { - const nextRound = round + 1 + const nextRound = round + 1n // This atom packages up the next round number, which may not be available yet. // We start by initialising as a promise that never resolves (async forever atom). // We then activate an atomEffect, which sets the next round number based on the round that we've synced up to. // If we've synced the round, we know that block is available to query. - const nextRoundWhenAvailableAtom = atom | number>(new Promise(() => {})) + const nextRoundWhenAvailableAtom = atom | Round>(new Promise(() => {})) const setNextRoundWhenAvailableEffect = atomEffect((get, set) => { // Conditionally subscribe to updates on the syncedRoundAtom diff --git a/src/features/blocks/data/genesis-hash.ts b/src/features/blocks/data/genesis-hash.ts index 2fc1349bd..95a77aa68 100644 --- a/src/features/blocks/data/genesis-hash.ts +++ b/src/features/blocks/data/genesis-hash.ts @@ -1,4 +1,5 @@ import { algod } from '@/features/common/data/algo-client' +import { uint8ArrayToBase64 } from '@/utils/uint8-array-to-base64' import { atomWithDefault, useAtomCallback } from 'jotai/utils' import { useCallback } from 'react' @@ -7,7 +8,7 @@ const getGenesisHash = () => .versionsCheck() .do() .then((result) => { - return result.genesis_hash_b64 as string + return uint8ArrayToBase64(result.genesisHashB64) }) export const genesisHashAtom = atomWithDefault>(async () => { diff --git a/src/features/blocks/data/latest-blocks.ts b/src/features/blocks/data/latest-blocks.ts index 79ead773c..187b76d7c 100644 --- a/src/features/blocks/data/latest-blocks.ts +++ b/src/features/blocks/data/latest-blocks.ts @@ -3,7 +3,7 @@ import { isDefined } from '@/utils/is-defined' import { latestTransactionIdsAtom } from '@/features/transactions/data' import { atomEffect } from 'jotai-effect' import { AlgorandSubscriber } from '@algorandfoundation/algokit-subscriber' -import { ApplicationOnComplete, TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { ApplicationOnComplete } from '@algorandfoundation/algokit-utils/types/indexer' import { BlockResult, Round, SubscriberState, SubscriberStatus, SubscriberStoppedDetails, SubscriberStoppedReason } from './types' import { assetMetadataResultsAtom } from '@/features/assets/data' import algosdk from 'algosdk' @@ -24,6 +24,9 @@ import { createTimestamp, maxBlocksToDisplay } from '@/features/common/data' import { genesisHashAtom } from './genesis-hash' import { asError } from '@/utils/error' import { activeWalletAccountAtom } from '@/features/wallet/data/active-wallet' +import { TransactionResult } from '@/features/transactions/data/types' +import { base64ToBytes } from '@/utils/base64-to-bytes' +import { subscribedTransactionToTransactionResult } from '@/features/transactions/mappers/subscriber-transaction-mappers' const notStartedSubscriberStatus = { state: SubscriberState.NotStarted } satisfies SubscriberStatus const startedSubscriberStatus = { state: SubscriberState.Started } satisfies SubscriberStatus @@ -68,7 +71,7 @@ const subscriberAtom = atom(null, (get, set) => { waitForBlockWhenAtTip: true, syncBehaviour: 'sync-oldest-start-now', watermarkPersistence: { - get: async () => get(syncedRoundAtom) ?? 0, + get: async () => get(syncedRoundAtom) ?? 0n, set: async (watermark) => { set(syncedRoundAtom, watermark) }, @@ -77,18 +80,6 @@ const subscriberAtom = atom(null, (get, set) => { algod ) - const reduceAllTransactions = (acc: BalanceChange[], transaction: SubscribedTransaction): BalanceChange[] => { - if (transaction.balanceChanges && transaction.balanceChanges.length > 0) { - acc.push(...transaction.balanceChanges) - } - transaction.id = '' - transaction.balanceChanges = undefined - transaction.filtersMatched = undefined - transaction.arc28Events = undefined - - return (transaction.innerTransactions ?? []).reduce(reduceAllTransactions, acc) - } - subscriber.onPoll(async (result) => { if (!result.blockMetadata || result.blockMetadata.length < 1) { return @@ -107,11 +98,11 @@ const subscriberAtom = atom(null, (get, set) => { const [blockTransactionIds, transactionResults, groupResults, staleAssetIds, staleAddresses, staleApplicationIds] = result.subscribedTransactions.reduce( (acc, t) => { - if (!t.parentTransactionId && t['confirmed-round'] != null) { - const round = t['confirmed-round'] - // Remove filtersMatched, balanceChanges and arc28Events, as we don't need to store them in the transaction - const { filtersMatched: _filtersMatched, balanceChanges: _balanceChanges, arc28Events: _arc28Events, ...transaction } = t - const balanceChanges = (transaction['inner-txns'] ?? []).reduce(reduceAllTransactions, _balanceChanges ?? []) + if (!t.parentTransactionId && t.confirmedRound != null) { + const round = t.confirmedRound + + const balanceChanges = extractBalanceChanges(t) + const transaction = subscribedTransactionToTransactionResult(t) // Accumulate transaction ids by round acc[0].set(round, (acc[0].get(round) ?? []).concat(transaction.id)) @@ -120,15 +111,16 @@ const subscriberAtom = atom(null, (get, set) => { acc[1].push(transaction) // Accumulate group results - accumulateGroupsFromTransaction(acc[2], transaction, round, transaction['round-time'] ?? Math.floor(Date.now() / 1000)) + accumulateGroupsFromTransaction(acc[2], transaction, round, transaction.roundTime ?? Math.floor(Date.now() / 1000)) // Accumulate stale asset ids const staleAssetIds = flattenTransactionResult(t) - .filter((t) => t['tx-type'] === algosdk.TransactionType.acfg) - .map((t) => t['asset-config-transaction']!['asset-id']) + .filter((t) => t.txType === algosdk.TransactionType.acfg) + .map((t) => t.assetConfigTransaction!.assetId) .filter(distinct((x) => x)) .filter(isDefined) // We ignore asset create transactions because they aren't in the atom - acc[3].push(...staleAssetIds) + .filter((x) => x !== 0n) // ALGO is never stale + acc[3] = acc[3].concat(staleAssetIds) // Accumulate stale addresses const addressesStaleDueToBalanceChanges = @@ -136,7 +128,7 @@ const subscriberAtom = atom(null, (get, set) => { ?.filter((bc) => { const isAssetOptIn = bc.amount === 0n && - bc.assetId !== 0 && + bc.assetId !== 0n && bc.roles.includes(BalanceChangeRole.Sender) && bc.roles.includes(BalanceChangeRole.Receiver) const isNonZeroAmount = bc.amount !== 0n // Can either be negative (decreased balance) or positive (increased balance) @@ -152,21 +144,21 @@ const subscriberAtom = atom(null, (get, set) => { const addressesStaleDueToTransactions = flattenTransactionResult(t) .filter((t) => { - const accountIsStaleDueToRekey = t['rekey-to'] + const accountIsStaleDueToRekey = t.rekeyTo return accountIsStaleDueToAppChanges(t) || accountIsStaleDueToRekey }) .map((t) => t.sender) .filter(distinct((x) => x)) const staleAddresses = Array.from(new Set(addressesStaleDueToBalanceChanges.concat(addressesStaleDueToTransactions))) - acc[4].push(...staleAddresses) + acc[4] = acc[4].concat(staleAddresses) // Accumulate stale application ids const staleApplicationIds = flattenTransactionResult(t) - .filter((t) => t['tx-type'] === algosdk.TransactionType.appl) - .map((t) => t['application-transaction']?.['application-id']) + .filter((t) => t.txType === algosdk.TransactionType.appl) + .map((t) => t.applicationTransaction?.applicationId) .filter(distinct((x) => x)) .filter(isDefined) // We ignore application create transactions because they aren't in the atom - acc[5].push(...staleApplicationIds) + acc[5] = acc[5].concat(staleApplicationIds) } return acc }, @@ -181,63 +173,63 @@ const subscriberAtom = atom(null, (get, set) => { ) const blockResults = result.blockMetadata.map((b) => { return { - ['genesis-hash']: b.genesisHash, - ['genesis-id']: b.genesisId, - ['previous-block-hash']: b.previousBlockHash ? b.previousBlockHash : '', + genesisHash: base64ToBytes(b.genesisHash), + genesisId: b.genesisId, + previousBlockHash: base64ToBytes(b.previousBlockHash ?? ''), ...(b.rewards ? { rewards: { - ['fee-sink']: b.rewards.feeSink, - ['rewards-calculation-round']: b.rewards.rewardsCalculationRound, - ['rewards-level']: b.rewards.rewardsLevel, - ['rewards-pool']: b.rewards.rewardsPool, - ['rewards-rate']: b.rewards.rewardsRate, - ['rewards-residue']: Number(b.rewards.rewardsResidue), + feeSink: b.rewards.feeSink, + rewardsCalculationRound: b.rewards.rewardsCalculationRound, + rewardsLevel: b.rewards.rewardsLevel, + rewardsPool: b.rewards.rewardsPool, + rewardsRate: b.rewards.rewardsRate, + rewardsResidue: b.rewards.rewardsResidue, }, } : undefined), round: b.round, - seed: b.seed ?? '', + seed: base64ToBytes(b.seed ?? ''), ...(b.stateProofTracking && b.stateProofTracking.length > 0 ? { - 'state-proof-tracking': b.stateProofTracking.map((tracking) => ({ - 'next-round': tracking.nextRound, - 'online-total-weight': tracking.onlineTotalWeight, + stateProofTracking: b.stateProofTracking.map((tracking) => ({ + nextRound: tracking.nextRound, + onlineTotalWeight: tracking.onlineTotalWeight, type: tracking.type, - 'voters-commitment': tracking.votersCommitment, + votersCommitment: tracking.votersCommitment, })), } : undefined), timestamp: b.timestamp, - ['transactions-root']: b.transactionsRoot, - ['transactions-root-sha256']: b.transactionsRootSha256, - ['txn-counter']: b.txnCounter, + transactionsRoot: base64ToBytes(b.transactionsRoot), + transactionsRootSha256: base64ToBytes(b.transactionsRootSha256), + txnCounter: b.txnCounter, proposer: b.proposer, ...(b.upgradeState ? { - ['upgrade-state']: { - ['current-protocol']: b.upgradeState.currentProtocol, - ['next-protocol']: b.upgradeState.nextProtocol, - ['next-protocol-approvals']: b.upgradeState.nextProtocolApprovals ?? 0, - ['next-protocol-switch-on']: b.upgradeState.nextProtocolSwitchOn ?? 0, - ['next-protocol-vote-before']: b.upgradeState.nextProtocolVoteBefore ?? 0, + upgradeState: { + currentProtocol: b.upgradeState.currentProtocol, + nextProtocol: b.upgradeState.nextProtocol, + nextProtocolApprovals: b.upgradeState.nextProtocolApprovals ?? 0n, + nextProtocolSwitchOn: b.upgradeState.nextProtocolSwitchOn ?? 0n, + nextProtocolVoteBefore: b.upgradeState.nextProtocolVoteBefore ?? 0n, }, } : undefined), ...(b.upgradeVote ? { - 'upgrade-vote': { - 'upgrade-approve': b.upgradeVote.upgradeApprove ?? false, - 'upgrade-delay': b.upgradeVote.upgradeDelay ?? 0, - 'upgrade-propose': b.upgradeVote.upgradePropose, + upgradeVote: { + upgradeApprove: b.upgradeVote.upgradeApprove ?? false, + upgradeDelay: b.upgradeVote.upgradeDelay ?? 0n, + upgradePropose: b.upgradeVote.upgradePropose, }, } : undefined), ...(b.participationUpdates ? { - 'participation-updates': { - 'absent-participation-accounts': b.participationUpdates.absentParticipationAccounts, - 'expired-participation-accounts': b.participationUpdates.expiredParticipationAccounts, + participationUpdates: { + absentParticipationAccounts: b.participationUpdates.absentParticipationAccounts, + expiredParticipationAccounts: b.participationUpdates.expiredParticipationAccounts, }, } : undefined), @@ -345,11 +337,16 @@ export const useSubscribeToBlocksEffect = () => { } const accountIsStaleDueToAppChanges = (txn: TransactionResult) => { - if (txn['tx-type'] !== algosdk.TransactionType.appl) { + if (txn.txType !== algosdk.TransactionType.appl) { return false } - const appCallTransaction = txn['application-transaction']! - const isAppCreate = appCallTransaction['on-completion'] === ApplicationOnComplete.noop && !appCallTransaction['application-id'] - const isAppOptIn = appCallTransaction['on-completion'] === ApplicationOnComplete.optin && appCallTransaction['application-id'] + const appCallTransaction = txn.applicationTransaction! + const isAppCreate = appCallTransaction.onCompletion === ApplicationOnComplete.noop && !appCallTransaction.applicationId + const isAppOptIn = appCallTransaction.onCompletion === ApplicationOnComplete.optin && appCallTransaction.applicationId return isAppCreate || isAppOptIn } + +const extractBalanceChanges = (txn: SubscribedTransaction): BalanceChange[] => { + const innerTxnsBalanceChanges = (txn.innerTxns ?? []).flatMap((innerTxn) => extractBalanceChanges(innerTxn)) ?? [] + return (txn.balanceChanges ?? []).concat(innerTxnsBalanceChanges) +} diff --git a/src/features/blocks/data/types.ts b/src/features/blocks/data/types.ts index f64d3379d..07e8434fe 100644 --- a/src/features/blocks/data/types.ts +++ b/src/features/blocks/data/types.ts @@ -1,60 +1,60 @@ import { Address } from '@/features/accounts/data/types' import { GroupResult } from '@/features/groups/data/types' -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' // Matches the data returned from indexer export type BlockResult = { - round: number + round: bigint timestamp: number - ['genesis-id']: string - ['genesis-hash']: string - ['previous-block-hash']?: string - seed: string + genesisId: string + genesisHash: Uint8Array + previousBlockHash: Uint8Array + seed: Uint8Array rewards?: BlockRewards - ['txn-counter']: number - ['transactions-root']: string - ['transactions-root-sha256']: string - ['upgrade-state']?: BlockUpgradeState + txnCounter: bigint + transactionsRoot: Uint8Array + transactionsRootSha256: Uint8Array + upgradeState?: BlockUpgradeState transactionIds: string[] - ['state-proof-tracking']?: BlockStateProofTracking[] - ['upgrade-vote']?: BlockUpgradeVote - ['participation-updates']?: ParticipationUpdates + stateProofTracking?: StateProofTracking[] + upgradeVote?: BlockUpgradeVote + participationUpdates?: ParticipationUpdates proposer?: Address } export type BlockRewards = { - ['fee-sink']: string - ['rewards-level']: number - ['rewards-calculation-round']: number - ['rewards-pool']: string - ['rewards-residue']: number - ['rewards-rate']: number + feeSink: string + rewardsCalculationRound: bigint + rewardsLevel: bigint + rewardsPool: string + rewardsRate: bigint + rewardsResidue: bigint } export type BlockUpgradeState = { - ['current-protocol']: string - ['next-protocol']?: string - ['next-protocol-approvals']?: number - ['next-protocol-vote-before']?: number - ['next-protocol-switch-on']?: number + currentProtocol: string + nextProtocol?: string + nextProtocolApprovals?: bigint + nextProtocolSwitchOn?: bigint + nextProtocolVoteBefore?: bigint } -export type BlockStateProofTracking = { - ['next-round']?: number - ['online-total-weight']?: number +export type StateProofTracking = { + nextRound?: bigint + onlineTotalWeight?: bigint type?: number - ['voters-commitment']?: string + votersCommitment?: string | Uint8Array } export interface BlockUpgradeVote { - ['upgrade-approve']?: boolean - ['upgrade-delay']?: number | bigint - ['upgrade-propose']?: string + upgradeApprove?: boolean + upgradeDelay?: bigint + upgradePropose?: string } export interface ParticipationUpdates { - ['absent-participation-accounts']?: string[] - ['expired-participation-accounts']?: string[] + absentParticipationAccounts?: string[] + expiredParticipationAccounts?: string[] } export type BlocksExtract = { @@ -63,7 +63,7 @@ export type BlocksExtract = { groupResults: GroupResult[] } -export type Round = number +export type Round = bigint export enum SubscriberState { NotStarted = 'NotStarted', diff --git a/src/features/blocks/mappers/index.ts b/src/features/blocks/mappers/index.ts index f2844c101..059092217 100644 --- a/src/features/blocks/mappers/index.ts +++ b/src/features/blocks/mappers/index.ts @@ -1,10 +1,10 @@ import { Transaction, TransactionSummary } from '@/features/transactions/models' import { Block, BlockSummary, CommonBlockProperties } from '../models' -import { BlockResult } from '../data/types' +import { BlockResult, Round } from '../data/types' import { asTransactionsSummary } from '@/features/transactions/mappers' import { AsyncMaybeAtom } from '@/features/common/data/types' -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' -import { asJson } from '@/utils/as-json' +import { asJson, normaliseAlgoSdkData } from '@/utils/as-json' +import { TransactionResult } from '@/features/transactions/data/types' const asCommonBlock = (block: BlockResult, transactions: (Transaction | TransactionSummary)[]): CommonBlockProperties => { return { @@ -22,20 +22,22 @@ export const asBlock = ( block: BlockResult, transactions: Transaction[], transactionResults: TransactionResult[], - nextRound: AsyncMaybeAtom + nextRound: AsyncMaybeAtom ): Block => { const { transactionIds: _, ...rest } = block return { ...asCommonBlock(block, transactions), - previousRound: block.round > 0 ? block.round - 1 : undefined, + previousRound: block.round > 0 ? block.round - 1n : undefined, nextRound, transactions, - json: asJson({ - ...rest, - ...(!rest['upgrade-vote'] ? { ['upgrade-vote']: { ['upgrade-approve']: false, ['upgrade-delay']: 0 } } : undefined), // Match how indexer handles an undefined upgrade-vote - transactions: transactionResults, - }), + json: asJson( + normaliseAlgoSdkData({ + ...rest, + ...(!rest.upgradeVote ? { upgradeVote: { upgradeApprove: false, upgradeDelay: 0 } } : undefined), // Match how indexer handles an undefined upgrade-vote + transactions: transactionResults, + }) + ), proposer: block.proposer, } } diff --git a/src/features/blocks/models/index.ts b/src/features/blocks/models/index.ts index 45b7edb70..ca6396a15 100644 --- a/src/features/blocks/models/index.ts +++ b/src/features/blocks/models/index.ts @@ -2,16 +2,17 @@ import { Address } from '@/features/accounts/data/types' import { AsyncMaybeAtom } from '@/features/common/data/types' import { TransactionsSummary } from '@/features/common/models' import { Transaction, TransactionSummary } from '@/features/transactions/models' +import { Round } from '../data/types' export type CommonBlockProperties = { - round: number + round: Round timestamp: string transactionsSummary: TransactionsSummary } export type Block = CommonBlockProperties & { - previousRound?: number - nextRound: AsyncMaybeAtom + previousRound?: Round + nextRound: AsyncMaybeAtom transactions: Transaction[] json: string proposer?: Address diff --git a/src/features/blocks/pages/block-page.test.tsx b/src/features/blocks/pages/block-page.test.tsx index ab22a9bd5..7d038d975 100644 --- a/src/features/blocks/pages/block-page.test.tsx +++ b/src/features/blocks/pages/block-page.test.tsx @@ -25,6 +25,8 @@ import { tableAssertion } from '@/tests/assertions/table-assertion' import { descriptionListAssertion } from '@/tests/assertions/description-list-assertion' import { assetResultsAtom } from '@/features/assets/data' import { indexer } from '@/features/common/data/algo-client' +import { base64ToBytes } from '@/utils/base64-to-bytes' +import { uint8ArrayToBase64 } from '@/utils/uint8-array-to-base64' vi.mock('@/features/common/data/algo-client', async () => { const original = await vi.importActual('@/features/common/data/algo-client') @@ -82,13 +84,13 @@ describe('block-page', () => { describe('when rendering a block that exists', () => { describe('and has no transactions', () => { - const block = blockResultMother.blockWithoutTransactions().withRound(12345).withTimestamp(1719284618).build() + const block = blockResultMother.blockWithoutTransactions().withRound(12345n).withTimestamp(1719284618).build() it('should be rendered with the correct data', () => { vi.mocked(useParams).mockImplementation(() => ({ round: block.round.toString() })) const myStore = createStore() myStore.set(blockResultsAtom, new Map([[block.round, createReadOnlyAtomAndTimestamp(block)]])) - myStore.set(syncedRoundAtom, block.round + 1) + myStore.set(syncedRoundAtom, block.round + 1n) return executeComponentTest( () => render(, undefined, myStore), @@ -100,8 +102,8 @@ describe('block-page', () => { { term: roundLabel, description: block.round.toString() }, { term: timestampLabel, description: 'Tue, 25 June 2024 03:03:38' }, { term: transactionsLabel, description: '0' }, - { term: previousRoundLabel, description: (block.round - 1).toString() }, - { term: nextRoundLabel, description: (block.round + 1).toString() }, + { term: previousRoundLabel, description: (block.round - 1n).toString() }, + { term: nextRoundLabel, description: (block.round + 1n).toString() }, ], }) ) @@ -113,13 +115,13 @@ describe('block-page', () => { }) describe('and has a proposer', () => { - const block = blockResultMother.blockWithoutTransactions().withRound(1644).withTimestamp(1724943091).build() + const block = blockResultMother.blockWithoutTransactions().withRound(1644n).withTimestamp(1724943091).build() it('should be rendered with the correct data', () => { vi.mocked(useParams).mockImplementation(() => ({ round: block.round.toString() })) const myStore = createStore() myStore.set(blockResultsAtom, new Map([[block.round, createReadOnlyAtomAndTimestamp(block)]])) - myStore.set(syncedRoundAtom, block.round + 1) + myStore.set(syncedRoundAtom, block.round + 1n) return executeComponentTest( () => render(, undefined, myStore), @@ -131,8 +133,8 @@ describe('block-page', () => { { term: roundLabel, description: block.round.toString() }, { term: timestampLabel, description: 'Thu, 29 August 2024 14:51:31' }, { term: transactionsLabel, description: '0' }, - { term: previousRoundLabel, description: (block.round - 1).toString() }, - { term: nextRoundLabel, description: (block.round + 1).toString() }, + { term: previousRoundLabel, description: (block.round - 1n).toString() }, + { term: nextRoundLabel, description: (block.round + 1n).toString() }, { term: proposerLabel, description: block.proposer ?? '' }, ], }) @@ -146,7 +148,10 @@ describe('block-page', () => { describe('and has transactions', () => { const asset = assetResultMother['mainnet-312769']().build() - const transactionResult1 = transactionResultMother.payment().withGroup('W3pIVuWVJlzmMDGvX8St0W/DPxslnpt6vKV8zoFb6rg=').build() + const transactionResult1 = transactionResultMother + .payment() + .withGroup(base64ToBytes('W3pIVuWVJlzmMDGvX8St0W/DPxslnpt6vKV8zoFb6rg=')) + .build() const transactionResult2 = transactionResultMother.transfer(asset).build() const transactionResults = [transactionResult1, transactionResult2] const block = blockResultMother.blockWithTransactions(transactionResults).withTimestamp(1719284618).build() @@ -158,7 +163,7 @@ describe('block-page', () => { myStore.set(blockResultsAtom, new Map([[block.round, createReadOnlyAtomAndTimestamp(block)]])) myStore.set(transactionResultsAtom, new Map(transactionResults.map((t) => [t.id, createReadOnlyAtomAndTimestamp(t)]))) myStore.set(assetResultsAtom, new Map([[asset.index, createReadOnlyAtomAndTimestamp(asset)]])) - myStore.set(syncedRoundAtom, block.round + 1) + myStore.set(syncedRoundAtom, block.round + 1n) return executeComponentTest( () => render(, undefined, myStore), @@ -170,8 +175,8 @@ describe('block-page', () => { { term: roundLabel, description: block.round.toString() }, { term: timestampLabel, description: 'Tue, 25 June 2024 03:03:38' }, { term: transactionsLabel, description: '2Payment=1Asset Transfer=1' }, - { term: previousRoundLabel, description: (block.round - 1).toString() }, - { term: nextRoundLabel, description: (block.round + 1).toString() }, + { term: previousRoundLabel, description: (block.round - 1n).toString() }, + { term: nextRoundLabel, description: (block.round + 1n).toString() }, ], }) ) @@ -186,22 +191,22 @@ describe('block-page', () => { cells: [ '', ellipseId(transactionResult1.id), - ellipseId(transactionResult1.group), + ellipseId(transactionResult1.group ? uint8ArrayToBase64(transactionResult1.group) : undefined), ellipseAddress(transactionResult1.sender), - ellipseAddress(transactionResult1['payment-transaction']!.receiver), + ellipseAddress(transactionResult1.paymentTransaction?.receiver), 'Payment', - (transactionResult1['payment-transaction']!.amount / 1e6).toString(), + (Number(transactionResult1.paymentTransaction!.amount) / 1e6).toString(), ], }, { cells: [ '', ellipseId(transactionResult2.id), - ellipseId(transactionResult2.group), + ellipseId(transactionResult2.group ? uint8ArrayToBase64(transactionResult2.group) : undefined), ellipseAddress(transactionResult2.sender), - ellipseAddress(transactionResult2['asset-transfer-transaction']!.receiver), + ellipseAddress(transactionResult2.assetTransferTransaction?.receiver), 'Asset Transfer', - `${(transactionResult2['asset-transfer-transaction']!.amount as number) / 1e6}USDt`, + `${Number(transactionResult2.assetTransferTransaction!.amount) / 1e6}USDt`, ], }, ], diff --git a/src/features/blocks/pages/block-page.tsx b/src/features/blocks/pages/block-page.tsx index d18570873..b970c9c49 100644 --- a/src/features/blocks/pages/block-page.tsx +++ b/src/features/blocks/pages/block-page.tsx @@ -30,7 +30,7 @@ export function BlockPage() { useTitle() const { round: _round } = useRequiredParam(UrlParams.Round) invariant(isInteger(_round), blockInvalidRoundMessage) - const round = parseInt(_round, 10) + const round = BigInt(_round) const loadableBlock = useLoadableBlock(round) return ( diff --git a/src/features/common/components/platform-provider.tsx b/src/features/common/components/platform-provider.tsx index 99927e577..6a05090b4 100644 --- a/src/features/common/components/platform-provider.tsx +++ b/src/features/common/components/platform-provider.tsx @@ -30,7 +30,7 @@ export function PlatformProvider({ children }: PropsWithChildren) { // The DataProvider key prop is super important it governs if the provider is reinitialized const dataProvider = shouldPromptForTokens ? ( - {children} + {children} ) : ( diff --git a/src/features/common/components/wallet-provider-inner.tsx b/src/features/common/components/wallet-provider-inner.tsx index a6b3ddaca..36e8f299a 100644 --- a/src/features/common/components/wallet-provider-inner.tsx +++ b/src/features/common/components/wallet-provider-inner.tsx @@ -7,8 +7,8 @@ type Props = PropsWithChildren<{ }> function SetActiveWalletState({ children }: PropsWithChildren) { - const { activeAddress, transactionSigner } = useWallet() - useSetActiveWalletState(activeAddress ?? undefined, transactionSigner) + const { isReady, activeAddress, transactionSigner } = useWallet() + useSetActiveWalletState(isReady, activeAddress ?? undefined, transactionSigner) return <>{children} } diff --git a/src/features/common/components/wallet-provider.tsx b/src/features/common/components/wallet-provider.tsx index e290e0267..a5370914f 100644 --- a/src/features/common/components/wallet-provider.tsx +++ b/src/features/common/components/wallet-provider.tsx @@ -1,8 +1,8 @@ import { PropsWithChildren, useMemo } from 'react' import { WalletProviderInner } from './wallet-provider-inner' import { defaultKmdWallet, useSelectedKmdWallet } from '@/features/wallet/data/selected-kmd-wallet' -import { NetworkConfigWithId } from '@/features/network/data/types' -import { NetworkId, SupportedWallet, WalletId, WalletIdConfig, WalletManager } from '@txnlab/use-wallet-react' +import { mainnetId, NetworkConfigWithId } from '@/features/network/data/types' +import { SupportedWallet, WalletId, WalletIdConfig, WalletManager } from '@txnlab/use-wallet-react' import { DialogBodyProps, useDialogForm } from '../hooks/use-dialog-form' import { PromptForm } from './prompt-form' import { loraKmdDevWalletName } from '@/features/fund/utils/kmd' @@ -89,15 +89,22 @@ export function WalletProvider({ networkConfig, children }: Props) { const walletManager = useMemo(() => { return new WalletManager({ wallets: wallets, - // use-wallet doesn't support custom network, we set it to localnet always to get around this. - network: NetworkId.LOCALNET, - algod: { - baseServer: networkConfig.algod.server, - port: networkConfig.algod.port, - token: networkConfig.algod.token, + defaultNetwork: networkConfig.id, + networks: { + [networkConfig.id]: { + algod: { + baseServer: networkConfig.algod.server, + port: networkConfig.algod.port, + token: networkConfig.algod.token ?? '', + }, + isTestnet: networkConfig.id !== mainnetId, + }, + }, + options: { + resetNetwork: true, }, }) - }, [networkConfig.algod.port, networkConfig.algod.server, networkConfig.algod.token, wallets]) + }, [networkConfig.algod.port, networkConfig.algod.server, networkConfig.algod.token, networkConfig.id, wallets]) return ( // The key prop is super important it governs if the provider is reinitialized diff --git a/src/features/common/data/algo-client.ts b/src/features/common/data/algo-client.ts index 29754465d..0b7efa845 100644 --- a/src/features/common/data/algo-client.ts +++ b/src/features/common/data/algo-client.ts @@ -18,25 +18,15 @@ const shouldCreateKmdClient = (config: NetworkConfig) => { const networkConfig = settingsStore.get(networkConfigAtom) export let indexer = ClientManager.getIndexerClient(networkConfig.indexer) -indexer.setIntEncoding(algosdk.IntDecoding.MIXED) - export let algod = ClientManager.getAlgodClient(networkConfig.algod) -algod.setIntEncoding(algosdk.IntDecoding.MIXED) - export let kmd: algosdk.Kmd | undefined = shouldCreateKmdClient(networkConfig) ? ClientManager.getKmdClient(networkConfig.kmd!) : undefined -kmd?.setIntEncoding(algosdk.IntDecoding.MIXED) export let algorandClient = AlgorandClient.fromClients({ algod, indexer, kmd }) export const updateClientConfig = (networkConfig: NetworkConfigWithId) => { indexer = ClientManager.getIndexerClient(networkConfig.indexer) - indexer.setIntEncoding(algosdk.IntDecoding.MIXED) - algod = ClientManager.getAlgodClient(networkConfig.algod) - algod.setIntEncoding(algosdk.IntDecoding.MIXED) - kmd = shouldCreateKmdClient(networkConfig) ? ClientManager.getKmdClient(networkConfig.kmd!) : undefined - kmd?.setIntEncoding(algosdk.IntDecoding.MIXED) algorandClient = AlgorandClient.fromClients({ algod, indexer, kmd }) if (networkConfig.id !== localnetId) { diff --git a/src/features/common/data/atom-cache.ts b/src/features/common/data/atom-cache.ts index 00c6b7d23..03b39cda5 100644 --- a/src/features/common/data/atom-cache.ts +++ b/src/features/common/data/atom-cache.ts @@ -7,7 +7,7 @@ export const createReadOnlyAtomAndTimestamp = (value: T) => { return [atom(() => value), createTimestamp()] as const } -function getOrCreateValueInCacheAtom( +function getOrCreateValueInCacheAtom( keySelector: (...args: Args) => Key, cacheAtom: PrimitiveAtom>, createValue: (get: Getter, set: Setter, ...args: Args) => Value @@ -52,12 +52,12 @@ function getOrCreateValueInCacheAtom( +export function readOnlyAtomCache( createInitialValue: (get: Getter, set: Setter, ...args: Args) => Value, keySelector: (...args: Args) => Key, initialValues?: Map, number]> ): readonly [PrimitiveAtom, number]>>, (...params: [...args: Args, options?: Options]) => Atom] -export function readOnlyAtomCache( +export function readOnlyAtomCache( createInitialValue: (get: Getter, set: Setter, ...args: Args) => Promise, keySelector: (...args: Args) => Key, initialValues?: Map>, number]> @@ -65,7 +65,7 @@ export function readOnlyAtomCache>, number]>>, (...params: [...args: Args, options?: Options]) => Atom>, ] -export function readOnlyAtomCache( +export function readOnlyAtomCache( createInitialValue: (get: Getter, set: Setter, ...args: Args) => Value | Promise, keySelector: (...args: Args) => Key, initialValues: Map>, number]> = new Map() diff --git a/src/features/common/data/indexed-db.ts b/src/features/common/data/indexed-db.ts index fdcc9ff02..8652f64a6 100644 --- a/src/features/common/data/indexed-db.ts +++ b/src/features/common/data/indexed-db.ts @@ -1,10 +1,10 @@ import { DBSchema, IDBPDatabase, IDBPTransaction, openDB, StoreNames } from 'idb' -import { ApplicationId } from '@/features/applications/data/types' import { genesisHashAtom } from '@/features/blocks/data' import { atom } from 'jotai/index' import { selectedNetworkAtomId } from '@/features/network/data' import { settingsStore } from '@/features/settings/data' import { AppSpecStandard, AppSpecVersion } from '@/features/app-interfaces/data/types' +import { ApplicationId } from '@/features/applications/data/types' interface LoraDBSchemaV1 extends DBSchema { 'applications-app-specs': { @@ -13,6 +13,20 @@ interface LoraDBSchemaV1 extends DBSchema { } } +export type AppInterfaceEntityV2 = { + applicationId: ApplicationId + name: string + appSpecVersions: AppSpecVersion[] + lastModified: number +} + +export type AppInterfaceEntityV3 = { + applicationId: string + name: string + appSpecVersions: AppSpecVersion[] + lastModified: number +} + export type AppInterfaceEntity = { applicationId: ApplicationId name: string @@ -23,7 +37,14 @@ export type AppInterfaceEntity = { interface LoraDBSchemaV2 extends DBSchema { 'app-interfaces': { key: number - value: AppInterfaceEntity + value: AppInterfaceEntityV2 + } +} + +interface LoraDBSchemaV3 extends DBSchema { + 'app-interfaces': { + key: string + value: AppInterfaceEntityV3 } } @@ -31,7 +52,7 @@ export const dbConnectionAtom = atom(async (get) => { const networkId = settingsStore.get(selectedNetworkAtomId) const genesisHash = await get(genesisHashAtom) - return await openDB(`${networkId}-${genesisHash}`, 2, { + return await openDB(`${networkId}-${genesisHash}`, 3, { async upgrade(db, oldVersion, newVersion, transaction) { // Casting to DBSchema to trick TypeScript const anyDb = db as unknown as IDBPDatabase @@ -59,21 +80,21 @@ const dbMigrations = [ const v1Transaction = transaction as unknown as IDBPTransaction[], 'versionchange'> const v1Store = v1Transaction.objectStore('applications-app-specs') - const newItems: AppInterfaceEntity[] = [] + const newItems: AppInterfaceEntityV2[] = [] const keys = await v1Store.getAllKeys() for (const key of keys) { const item = await v1Store.get(key) if (item && item.length > 0) { if (item[0].standard === AppSpecStandard.ARC32) { newItems.push({ - applicationId: Number(key), + applicationId: BigInt(key), name: item[0].appSpec.contract.name, appSpecVersions: [...item], lastModified: Date.now(), }) } else if (item[0].standard === AppSpecStandard.ARC4) { newItems.push({ - applicationId: Number(key), + applicationId: BigInt(key), name: item[0].appSpec.name, appSpecVersions: [...item], lastModified: Date.now(), @@ -96,6 +117,34 @@ const dbMigrations = [ await v2Store.put(newItem) } }, + async (db: IDBPDatabase, transaction: IDBPTransaction[], 'versionchange'>) => { + const v2Db = db as unknown as IDBPDatabase + const v2Transaction = transaction as unknown as IDBPTransaction[], 'versionchange'> + const v2Store = v2Transaction.objectStore('app-interfaces') + + const newItems = (await v2Store.getAll()).map((item) => ({ + ...item, + appSpecVersions: item.appSpecVersions.map((appSpecVersion) => ({ + ...appSpecVersion, + roundFirstValid: appSpecVersion.roundFirstValid !== undefined ? BigInt(appSpecVersion.roundFirstValid) : undefined, + roundLastValid: appSpecVersion.roundLastValid !== undefined ? BigInt(appSpecVersion.roundLastValid) : undefined, + })), + applicationId: item.applicationId.toString(), + })) + v2Db.deleteObjectStore('app-interfaces') + + const v3Db = db as unknown as IDBPDatabase + v3Db.createObjectStore('app-interfaces', { + keyPath: 'applicationId', + }) + + const v3Transaction = transaction as unknown as IDBPTransaction[], 'versionchange'> + const v3Store = v3Transaction.objectStore('app-interfaces') + + for (const newItem of newItems) { + await v3Store.put(newItem) + } + }, ] -export type DbConnection = IDBPDatabase +export type DbConnection = IDBPDatabase diff --git a/src/features/common/data/state-cleanup.ts b/src/features/common/data/state-cleanup.ts index 2f52650c6..a50ce5042 100644 --- a/src/features/common/data/state-cleanup.ts +++ b/src/features/common/data/state-cleanup.ts @@ -41,7 +41,7 @@ const stateCleanupEffect = atomEffect((get, set) => { }) const createExpiredDataRemover = (get: Getter, set: Setter, expiredTimestamp: number) => { - return (resultsAtom: PrimitiveAtom>) => { + return (resultsAtom: PrimitiveAtom>) => { const keysToRemove: Key[] = [] const results = get(resultsAtom) results.forEach(([_, timestamp], key) => { diff --git a/src/features/explore/data/live-explorer.ts b/src/features/explore/data/live-explorer.ts index 8c6c45e5e..f62f57cdb 100644 --- a/src/features/explore/data/live-explorer.ts +++ b/src/features/explore/data/live-explorer.ts @@ -30,7 +30,7 @@ const liveExplorerAtomsBuilder = () => { const latestBlockSummaries = ( await Promise.all( Array.from({ length: maxBlocksToDisplay }, async (_, i) => { - const round = syncedRound - i + const round = syncedRound - BigInt(i) const blockResult = blockResults.get(round) if (blockResult) { const block = await get(blockResult[0]) diff --git a/src/features/explore/pages/explore-page.test.tsx b/src/features/explore/pages/explore-page.test.tsx index 1576d940b..264fef6d5 100644 --- a/src/features/explore/pages/explore-page.test.tsx +++ b/src/features/explore/pages/explore-page.test.tsx @@ -10,12 +10,13 @@ import { blockResultMother } from '@/tests/object-mother/block-result' import { transactionResultMother } from '@/tests/object-mother/transaction-result' import { latestTransactionIdsAtom, transactionResultsAtom } from '@/features/transactions/data' import { BlockResult, Round } from '@/features/blocks/data/types' -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' import { TransactionId } from '@/features/transactions/data/types' import { randomNumberBetween } from '@makerx/ts-dossier' import { ellipseId } from '@/utils/ellipse-id' import { ellipseAddress } from '@/utils/ellipse-address' import { createReadOnlyAtomAndTimestamp, createTimestamp } from '@/features/common/data' +import { base64ToBytes } from '@/utils/base64-to-bytes' describe('explore-page', () => { describe('when no blocks are available', () => { @@ -51,7 +52,10 @@ describe('explore-page', () => { }) describe('when a small number of blocks have been processed', () => { - const transactionResult1 = transactionResultMother.payment().withGroup('W3pIVuWVJlzmMDGvX8St0W/DPxslnpt6vKV8zoFb6rg=').build() + const transactionResult1 = transactionResultMother + .payment() + .withGroup(base64ToBytes('W3pIVuWVJlzmMDGvX8St0W/DPxslnpt6vKV8zoFb6rg=')) + .build() const transactionResults = [transactionResult1] const block = blockResultMother.blockWithTransactions(transactionResults).withTimestamp(1719284618).build() const myStore = createStore() @@ -95,7 +99,7 @@ describe('explore-page', () => { const transactionCard1 = transactionCards[0] expect(getByRole(transactionCard1, 'heading').textContent).toBe(ellipseId(transactionResult1.id)) expect(transactionCard1.textContent).toContain(`From:${ellipseAddress(transactionResult1.sender)}`) - expect(transactionCard1.textContent).toContain(`To:${ellipseAddress(transactionResult1.receiver)}`) + expect(transactionCard1.textContent).toContain(`To:${ellipseAddress(transactionResult1.paymentTransaction!.receiver)}`) expect(transactionCards[0].textContent).toContain('Payment') }) } @@ -119,7 +123,7 @@ describe('explore-page', () => { } }, { - syncedRound: 0, + syncedRound: 0n, blocks: new Map, number]>(), transactions: new Map, number]>(), } diff --git a/src/features/forms/data/common.ts b/src/features/forms/data/common.ts index cfa9062d3..eb24c6e08 100644 --- a/src/features/forms/data/common.ts +++ b/src/features/forms/data/common.ts @@ -1,3 +1,4 @@ +import Decimal from 'decimal.js' import { z } from 'zod' import { zfd } from 'zod-form-data' @@ -19,3 +20,30 @@ export const numberSchema = (schema: TSchema) => .transform((val) => (val != null ? Number(val) : undefined)) .pipe(schema) ) + +// This is a little different to the others above, as zod doesn't have a decimal type +// It's not perfect, however does the job for our current use case. +export const decimalSchema = (params: Parameters[0]) => + zfd.text( + z.coerce + .string(params) + .optional() + .superRefine((data, ctx) => { + if (!data) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: params?.required_error || 'Required', + }) + } + + if (data && data.startsWith('-')) { + ctx.addIssue({ + code: z.ZodIssueCode.too_small, + minimum: 0, + inclusive: true, + type: 'number', + }) + } + }) + .transform((val) => (val != null ? new Decimal(val) : undefined)) + ) diff --git a/src/features/fund/data/dispenser-api.ts b/src/features/fund/data/dispenser-api.ts index 67bab8099..d846fb3f9 100644 --- a/src/features/fund/data/dispenser-api.ts +++ b/src/features/fund/data/dispenser-api.ts @@ -130,11 +130,11 @@ const createRefundStatusAtom = () => { return atom(async (get) => { const activeAccount = await get(activeWalletAccountAtom) // approxLimit = balance - minBalance - likelyTransactionFee - const approxLimit = Number(activeAccount?.algoHolding.amount ?? 0) - (activeAccount?.minBalance ?? 0) - 1000 + const approxLimit = (activeAccount?.algoHolding.amount ?? 0n) - (activeAccount?.minBalance ?? 0n) - 1000n return { canRefund: !!activeAccount, - limit: microAlgos(approxLimit < 0 ? 0 : approxLimit), + limit: microAlgos(approxLimit < 0n ? 0n : approxLimit), } }) } diff --git a/src/features/groups/data/group.ts b/src/features/groups/data/group.ts index f142dce14..5fbbfb401 100644 --- a/src/features/groups/data/group.ts +++ b/src/features/groups/data/group.ts @@ -10,7 +10,11 @@ import { createTransactionsAtom, getTransactionResultAtoms } from '@/features/tr const createGroupAtom = (groupId: GroupId, round: Round) => { return atom(async (get) => { const groupResult = await get(getGroupResultAtom(groupId, round)) - const transactionResults = await Promise.all(getTransactionResultAtoms(groupResult.transactionIds).map((txn) => get(txn))) + const transactionResults = await Promise.all( + // Transaction IDs in the group can be the inner transaction ID + // We need to remove the /inner/{id} part of the ID + getTransactionResultAtoms(groupResult.transactionIds.map((id) => id.split('/')[0])).map((txn) => get(txn)) + ) const transactions = get(createTransactionsAtom(transactionResults)) return asGroup(groupResult, transactions) }) diff --git a/src/features/groups/pages/group-page.test.tsx b/src/features/groups/pages/group-page.test.tsx index d2cb4abae..4f84a6ced 100644 --- a/src/features/groups/pages/group-page.test.tsx +++ b/src/features/groups/pages/group-page.test.tsx @@ -19,6 +19,7 @@ import { tableAssertion } from '@/tests/assertions/table-assertion' import { assetResultsAtom } from '@/features/assets/data' import { indexer } from '@/features/common/data/algo-client' import { genesisHashAtom } from '@/features/blocks/data' +import algosdk from 'algosdk' vi.mock('@/features/common/data/algo-client', async () => { const original = await vi.importActual('@/features/common/data/algo-client') @@ -28,6 +29,29 @@ vi.mock('@/features/common/data/algo-client', async () => { lookupBlock: vi.fn().mockReturnValue({ do: vi.fn(), }), + lookupTransactionByID: vi.fn().mockReturnValue({ + do: () => { + return Promise.resolve( + new algosdk.indexerModels.TransactionResponse({ + currentRound: 1, + transaction: new algosdk.indexerModels.Transaction({ + sender: 'sender', + fee: 1000, + firstValid: 1, + lastValid: 1, + note: 'note', + txType: 'pay', + confirmedRound: 1, + roundTime: 1, + paymentTransaction: new algosdk.indexerModels.TransactionPayment({ + amount: 1000, + receiver: 'receiver', + }), + }), + }) + ) + }, + }), }, } }) @@ -86,7 +110,7 @@ describe('group-page', () => { const group = groupResultMother .groupWithTransactions(transactionResults) .withId('/oRSr2uMFemQhwQliJO18b64Nl1QIkjA39ZszRCeSCI=') - .withRound(36591812) + .withRound(36591812n) .withTimestamp('2024-03-01T01:07:53Z') .build() @@ -133,7 +157,7 @@ describe('group-page', () => { await waitFor(() => expect(tableViewTab.getAttribute('data-state'), 'Table tab should be active').toBe('active')) await tableAssertion({ container: tableViewTab, - // This table has 10+ row, we only test the first 2 rows + // This table has 10+ row, we only test the first row rows: [ { cells: ['', 'INDQXWQ…', '/oRSr2u…', 'AACC…EN4A', '1201559522', 'Application Call', ''], @@ -144,4 +168,104 @@ describe('group-page', () => { ) }) }) + + describe('when rendering a group of inner transactions', () => { + const transactionResults = [transactionResultMother['mainnet-INDQXWQXHF22SO45EZY7V6FFNI6WUD5FHRVDV6NCU6HD424BJGGA']().build()] + const assets = [ + assetResultMother['mainnet-31566704']().build(), + assetResultMother['mainnet-386195940']().build(), + assetResultMother['mainnet-408898501']().build(), + ] + const group = groupResultMother + .groupWithTransactions(transactionResults) + .withId('aWpPwlog0oZYHQe9uDlwReKzIgb9HVKLv8Z4GX0wMO0=') + .withRound(36591812n) + .withTimestamp('2024-03-01T01:07:53Z') + .build() + + it('should be rendered with the correct data', () => { + vi.mocked(useParams).mockImplementation(() => ({ round: group.round.toString(), groupId: group.id })) + + const myStore = createStore() + myStore.set(groupResultsAtom, new Map([[group.id, createReadOnlyAtomAndTimestamp(group)]])) + myStore.set(transactionResultsAtom, new Map(transactionResults.map((t) => [t.id, createReadOnlyAtomAndTimestamp(t)]))) + myStore.set( + assetResultsAtom, + new Map([ + [algoAssetResult.index, createReadOnlyAtomAndTimestamp(algoAssetResult)], + ...assets.map((a) => [a.index, createReadOnlyAtomAndTimestamp(a)] as const), + ]) + ) + myStore.set(genesisHashAtom, 'some-hash') + + return executeComponentTest( + () => render(, undefined, myStore), + async (component, user) => { + await waitFor(() => + descriptionListAssertion({ + container: component.container, + items: [ + { term: groupIdLabel, description: 'aWpPwlog0oZYHQe9uDlwReKzIgb9HVKLv8Z4GX0wMO0=' }, + { term: blockLabel, description: '36591812' }, + { term: timestampLabel, description: 'Fri, 01 March 2024 01:07:53' }, + { term: transactionsLabel, description: '3Payment=1Application Call=1Asset Transfer=1' }, + ], + }) + ) + + const groupVisualTabList = component.getByRole('tablist', { name: groupVisual }) + expect(groupVisualTabList).toBeTruthy() + expect( + component.getByRole('tabpanel', { name: groupVisualGraphLabel }).getAttribute('data-state'), + 'Visual tab should be active' + ).toBe('active') + + // After click on the Table tab + await user.click(getByRole(groupVisualTabList, 'tab', { name: groupVisualTableLabel })) + const tableViewTab = component.getByRole('tabpanel', { name: groupVisualTableLabel }) + await waitFor(() => expect(tableViewTab.getAttribute('data-state'), 'Table tab should be active').toBe('active')) + await tableAssertion({ + container: tableViewTab, + rows: [ + { + cells: ['', 'inner/1', 'aWpPwlo…', 'AACC…EN4A', '2PIF…RNMM', 'Payment', '2.770045'], + }, + { + cells: ['', 'inner/2', 'aWpPwlo…', 'AACC…EN4A', '1002541853', 'Application Call', ''], + }, + ], + }) + } + ) + }) + }) + + describe('when rendering an inner transaction group', () => { + const transaction1 = transactionResultMother.payment().withId('MNVQ6KV2HCFDX4GBXGVNODIIK3ATIPH5KG4TS7L3WZT2JM6ETLLQ/inner/1').build() + const transaction2 = transactionResultMother.appCall().withId('MNVQ6KV2HCFDX4GBXGVNODIIK3ATIPH5KG4TS7L3WZT2JM6ETLLQ/inner/2').build() + + const group = groupResultMother + .groupWithTransactions([transaction1, transaction2]) + .withId('ZlhheIuy1l/olQhJQt0eMMgbxPAsmElYrL6Is0A2Qno=') + .withRound(2215n) + .withTimestamp('2025-01-27T01:07:53Z') + .build() + + it('should be rendered with the correct data', () => { + vi.mocked(useParams).mockImplementation(() => ({ round: group.round.toString(), groupId: group.id })) + + const myStore = createStore() + myStore.set(groupResultsAtom, new Map([[group.id, createReadOnlyAtomAndTimestamp(group)]])) + + return executeComponentTest( + () => render(, undefined, myStore), + async () => { + const mock = vi.mocked(indexer.lookupTransactionByID) + + expect(mock).toHaveBeenCalledWith('MNVQ6KV2HCFDX4GBXGVNODIIK3ATIPH5KG4TS7L3WZT2JM6ETLLQ') + expect(mock).toHaveBeenCalledTimes(1) + } + ) + }) + }) }) diff --git a/src/features/groups/pages/group-page.tsx b/src/features/groups/pages/group-page.tsx index bcc855075..657cd3fa3 100644 --- a/src/features/groups/pages/group-page.tsx +++ b/src/features/groups/pages/group-page.tsx @@ -32,7 +32,7 @@ export function GroupPage() { const { groupId } = useRequiredParam(UrlParams.GroupId) useTitle() - const round = parseInt(_round, 10) + const round = BigInt(_round) const loadableGroup = useLoadableGroup(groupId, round) return ( diff --git a/src/features/layout/pages/layout-page.test.tsx b/src/features/layout/pages/layout-page.test.tsx index 0316bc546..037396d1f 100644 --- a/src/features/layout/pages/layout-page.test.tsx +++ b/src/features/layout/pages/layout-page.test.tsx @@ -51,6 +51,7 @@ describe('when rendering the layout page', () => { return { ...original.useWallet(), activeAddress: 'CGRSYAYF2M5HNH6KYY6RPLYANVZ5ZQO4OTC3M3YPI4D6JFBXZGRUSVLQ5Q', + isReady: true, } satisfies ReturnType }) @@ -84,6 +85,7 @@ describe('when rendering the layout page', () => { name: 'Account 2', }, ], + isReady: true, } satisfies ReturnType }) @@ -127,6 +129,7 @@ describe('when rendering the layout page', () => { setAlgodClient: vi.fn(), signTransactions: vi.fn(), transactionSigner: vi.fn(), + isReady: true, } as unknown as ReturnType }) await executeComponentTest( diff --git a/src/features/network/components/network-select.tsx b/src/features/network/components/network-select.tsx index 976ef8960..255b4fc42 100644 --- a/src/features/network/components/network-select.tsx +++ b/src/features/network/components/network-select.tsx @@ -17,13 +17,13 @@ export function NetworkSelect({ showLabel = true }: NetworkSelectProps) { const location = useLocation() const handleNetworkChange = useCallback( - (newNetworkId: string) => { + async (newNetworkId: string) => { const currentPath = location.pathname - setSelectedNetwork(newNetworkId) if (currentNetworkId) { const newUrl = currentPath.replace(currentNetworkId, newNetworkId) navigate(newUrl) } + await setSelectedNetwork(newNetworkId) }, [currentNetworkId, location.pathname, navigate, setSelectedNetwork] ) diff --git a/src/features/network/data/index.ts b/src/features/network/data/index.ts index f926d64de..8ae1b4f91 100644 --- a/src/features/network/data/index.ts +++ b/src/features/network/data/index.ts @@ -26,6 +26,7 @@ export const allWalletProviderNames: Record = { kmd: 'KMD', mnemonic: 'MNEMONIC', defly: 'Defly', + 'defly-web': 'Defly Web', pera: 'Pera', exodus: 'Exodus', lute: 'Lute', @@ -34,8 +35,6 @@ export const allWalletProviderNames: Record = { kibisis: 'Kibisis', walletconnect: 'Wallet Connect', magic: 'Magic', - liquid: 'Liquid', - 'pera-beta': 'Pera Beta', biatec: 'Biatec', } @@ -276,9 +275,9 @@ export const useSetNetworkPromptedTokens = () => { const shouldPromptForTokens = atom((get) => { const networkConfig = get(networkConfigAtom) return ( - (networkConfig.algod.promptForToken && !networkConfig.algod.token) || - (networkConfig.indexer.promptForToken && !networkConfig.indexer.token) || - (networkConfig.kmd?.promptForToken && !networkConfig?.kmd.token) + (networkConfig.algod.promptForToken === true && !networkConfig.algod.token) || + (networkConfig.indexer.promptForToken === true && !networkConfig.indexer.token) || + (networkConfig.kmd?.promptForToken === true && !networkConfig?.kmd.token) ) }) @@ -331,7 +330,7 @@ export const useSetSelectedNetwork = () => { return useCallback( async (selectedNetwork: string) => { - disconnectAllWallets() + await disconnectAllWallets() setStorageNetwork(selectedNetwork) // Refresh selected network atom value settingsStore.set(selectedNetworkAtomId) diff --git a/src/features/search/components/search.test.tsx b/src/features/search/components/search.test.tsx index f4d3829f3..2b47a9d4b 100644 --- a/src/features/search/components/search.test.tsx +++ b/src/features/search/components/search.test.tsx @@ -1,6 +1,6 @@ import { Search, noSearchResultsMessage, searchPlaceholderLabel } from './search' import { describe, it, expect, vi } from 'vitest' -import { render, renderHook, waitFor } from '@/tests/testing-library' +import { render, renderHook } from '@/tests/testing-library' import { executeComponentTest } from '@/tests/test-component' import { atom, createStore } from 'jotai' import { assetResultMother } from '@/tests/object-mother/asset-result' @@ -24,13 +24,11 @@ describe('search', () => { return executeComponentTest( () => render(), async (component, user) => { - await waitFor(async () => { - const input = component.getByPlaceholderText(searchPlaceholderLabel) - await user.type(input, 'nothing') - const result = await component.findByText(noSearchResultsMessage) + const input = component.getByPlaceholderText(searchPlaceholderLabel) + await user.type(input, 'nothing') + const result = await component.findByText(noSearchResultsMessage) - expect(result).toBeDefined() - }) + expect(result).toBeDefined() } ) }) @@ -86,23 +84,19 @@ describe('search', () => { return executeComponentTest( () => render(, undefined, myStore), async (component, user) => { - await waitFor( - async () => { - const input = component.getByPlaceholderText(searchPlaceholderLabel) - await user.type(input, id) + const input = await component.findByPlaceholderText(searchPlaceholderLabel) + await user.type(input, id) + + const results = (await component.findAllByText(label, undefined, { timeout: 1000 })).map((result) => result.parentElement) + results.forEach((result) => { + const link = result!.querySelector('a') + expect(link).toHaveTextContent(label) + }) - const results = (await component.findAllByText(label, undefined, { timeout: 1000 })).map((result) => result.parentElement) - results.forEach((result) => { - const link = result!.querySelector('a') - expect(link).toHaveTextContent(label) - }) + const result = results.find((result) => result!.textContent!.includes(type))! + await user.click(result) - const result = results.find((result) => result!.textContent!.includes(type))! - await user.click(result) - expect(mockNavigate).toHaveBeenCalledWith(`/localnet/${type.toLowerCase()}/${id}`) - }, - { timeout: 10000 } - ) + expect(mockNavigate).toHaveBeenCalledWith(`/localnet/${type.toLowerCase()}/${id}`) } ) }) @@ -139,17 +133,12 @@ describe('search', () => { return executeComponentTest( () => render(, undefined, myStore), async (component, user) => { - await waitFor( - async () => { - const input = component.getByPlaceholderText(searchPlaceholderLabel) - await user.type(input, term) - const results = (await component.findAllByText(label, undefined, { timeout: 1000 })).map((result) => result.parentElement) - const result = results.find((result) => result!.textContent!.includes(type))! - await user.click(result) - expect(mockNavigate).toHaveBeenCalledWith(`/localnet/${type.toLowerCase()}/${id}`) - }, - { timeout: 10000 } - ) + const input = await component.findByPlaceholderText(searchPlaceholderLabel) + await user.type(input, term) + const results = (await component.findAllByText(label, undefined, { timeout: 1000 })).map((result) => result.parentElement) + const result = results.find((result) => result!.textContent!.includes(type))! + await user.click(result) + expect(mockNavigate).toHaveBeenCalledWith(`/localnet/${type.toLowerCase()}/${id}`) } ) }) diff --git a/src/features/search/data/search.ts b/src/features/search/data/search.ts index 34a9a36ef..538831e69 100644 --- a/src/features/search/data/search.ts +++ b/src/features/search/data/search.ts @@ -73,7 +73,7 @@ const createSearchAtoms = (store: JotaiStore, selectedNetwork: string) => { }) } } else if (isInteger(term)) { - const id = parseInt(term, 10) + const id = BigInt(term) if (id >= 0) { const syncedRound = store.get(syncedRoundAtom) if (!syncedRound || syncedRound >= id) { diff --git a/src/features/search/models/index.ts b/src/features/search/models/index.ts index a5b262913..3185d5f28 100644 --- a/src/features/search/models/index.ts +++ b/src/features/search/models/index.ts @@ -1,7 +1,7 @@ export type SearchResult = ( | { type: SearchResultType.Application | SearchResultType.Asset | SearchResultType.Block - id: number + id: bigint } | { type: SearchResultType.Account | SearchResultType.Transaction diff --git a/src/features/settings/components/theme-toggle.test.tsx b/src/features/settings/components/theme-toggle.test.tsx index 6d3746c0c..f4ff63ec7 100644 --- a/src/features/settings/components/theme-toggle.test.tsx +++ b/src/features/settings/components/theme-toggle.test.tsx @@ -8,8 +8,8 @@ describe('when the theme is toggled to dark', () => { return executeComponentTest( () => render(), async (component, user) => { - user.click(await component.findByRole('button', { name: themeTogglelabel })) - user.click(await component.findByText('Dark')) + await user.click(await component.findByRole('button', { name: themeTogglelabel })) + await user.click(await component.findByText('Dark')) await waitFor(() => expect(document.documentElement.classList.contains('dark')).toBe(true)) } diff --git a/src/features/settings/pages/settings-page.test.tsx b/src/features/settings/pages/settings-page.test.tsx index ae0373057..fd9e27169 100644 --- a/src/features/settings/pages/settings-page.test.tsx +++ b/src/features/settings/pages/settings-page.test.tsx @@ -34,8 +34,8 @@ describe('settings-page', () => { () => render(), async (component, user) => { const createNetworkConfigButton = await component.findByRole('button', { name: 'Create' }) - await user.click(createNetworkConfigButton) + const createNetworkConfigDialog = await component.findByRole('dialog', { name: createNetworkConfigDialogLabel }) await user.type(await findByRole(createNetworkConfigDialog, 'textbox', { name: 'name' }), 'My LocalNet') diff --git a/src/features/transaction-wizard/components/app-call-transaction-builder.tsx b/src/features/transaction-wizard/components/app-call-transaction-builder.tsx index f7a272926..6c11e5f03 100644 --- a/src/features/transaction-wizard/components/app-call-transaction-builder.tsx +++ b/src/features/transaction-wizard/components/app-call-transaction-builder.tsx @@ -46,7 +46,7 @@ export function AppCallTransactionBuilder({ mode, transaction, activeAccount, de onSubmit({ id: transaction?.id ?? randomGuid(), type: BuildableTransactionType.AppCall, - applicationId: Number(values.applicationId), + applicationId: BigInt(values.applicationId), sender: values.sender, onComplete: Number(values.onComplete), extraProgramPages: values.extraProgramPages, diff --git a/src/features/transaction-wizard/components/asset-clawback-transaction-builder.tsx b/src/features/transaction-wizard/components/asset-clawback-transaction-builder.tsx index 633501c77..d90b337db 100644 --- a/src/features/transaction-wizard/components/asset-clawback-transaction-builder.tsx +++ b/src/features/transaction-wizard/components/asset-clawback-transaction-builder.tsx @@ -1,4 +1,4 @@ -import { numberSchema } from '@/features/forms/data/common' +import { bigIntSchema, decimalSchema } from '@/features/forms/data/common' import { addressFieldSchema, commonSchema, receiverFieldSchema, senderFieldSchema } from '../data/common' import { z } from 'zod' import { useCallback, useEffect, useMemo, useState } from 'react' @@ -33,7 +33,7 @@ const formSchema = z clawbackTarget: addressFieldSchema, asset: z .object({ - id: numberSchema(z.number({ required_error: 'Required', invalid_type_error: 'Required' }).min(1)), + id: bigIntSchema(z.bigint({ required_error: 'Required', invalid_type_error: 'Required' }).min(1n)), decimals: z.number().optional(), unitName: z.string().optional(), clawback: z.string().optional(), @@ -53,7 +53,7 @@ const formSchema = z }) } }), - amount: numberSchema(z.number({ required_error: 'Required', invalid_type_error: 'Required' })), + amount: decimalSchema({ required_error: 'Required', invalid_type_error: 'Required' }), }) .superRefine((data, ctx) => { if (data.asset.clawback && data.sender && data.sender.resolvedAddress && data.sender.resolvedAddress !== data.asset.clawback) { @@ -119,7 +119,7 @@ function FormInner({ helper }: FormInnerProps) { const formCtx = useFormContext>() const assetIdFieldValue = formCtx.watch('asset.id') // This actually comes back as a string value, so we convert below - const [assetId] = useDebounce(assetIdFieldValue ? Number(assetIdFieldValue) : undefined, 500) + const [assetId] = useDebounce(assetIdFieldValue ? BigInt(assetIdFieldValue) : undefined, 500) if (assetId) { return @@ -189,7 +189,7 @@ export function AssetClawbackTransactionBuilder({ mode, transaction, onSubmit, o sender: data.sender, receiver: data.receiver, clawbackTarget: data.clawbackTarget, - amount: data.amount, + amount: data.amount!, fee: data.fee, validRounds: data.validRounds, note: data.note, diff --git a/src/features/transaction-wizard/components/asset-destroy-transaction-builder.tsx b/src/features/transaction-wizard/components/asset-destroy-transaction-builder.tsx index 2d0520ead..e90f5b785 100644 --- a/src/features/transaction-wizard/components/asset-destroy-transaction-builder.tsx +++ b/src/features/transaction-wizard/components/asset-destroy-transaction-builder.tsx @@ -1,4 +1,4 @@ -import { numberSchema } from '@/features/forms/data/common' +import { bigIntSchema } from '@/features/forms/data/common' import { commonSchema, senderFieldSchema } from '../data/common' import { z } from 'zod' import { useCallback, useEffect, useMemo, useState } from 'react' @@ -31,7 +31,7 @@ const formSchema = { ...senderFieldSchema, asset: z .object({ - id: numberSchema(z.number({ required_error: 'Required', invalid_type_error: 'Required' }).min(1)), + id: bigIntSchema(z.bigint({ required_error: 'Required', invalid_type_error: 'Required' }).min(1n)), decimals: z.number().optional(), manager: z.string().optional(), }) @@ -99,7 +99,7 @@ function FormInner({ helper }: FormInnerProps) { const formCtx = useFormContext>() const assetIdFieldValue = formCtx.watch('asset.id') // This actually comes back as a string value, so we convert below - const [assetId] = useDebounce(assetIdFieldValue ? Number(assetIdFieldValue) : undefined, 500) + const [assetId] = useDebounce(assetIdFieldValue ? BigInt(assetIdFieldValue) : undefined, 500) if (assetId) { return diff --git a/src/features/transaction-wizard/components/asset-freeze-transaction-builder.tsx b/src/features/transaction-wizard/components/asset-freeze-transaction-builder.tsx index c7bdd7942..f4f457330 100644 --- a/src/features/transaction-wizard/components/asset-freeze-transaction-builder.tsx +++ b/src/features/transaction-wizard/components/asset-freeze-transaction-builder.tsx @@ -1,4 +1,4 @@ -import { numberSchema } from '@/features/forms/data/common' +import { bigIntSchema } from '@/features/forms/data/common' import { addressFieldSchema, commonSchema, senderFieldSchema } from '../data/common' import { z } from 'zod' import { useCallback, useEffect, useMemo, useState } from 'react' @@ -32,7 +32,7 @@ const formSchema = z frozen: z.string(), asset: z .object({ - id: numberSchema(z.number({ required_error: 'Required', invalid_type_error: 'Required' }).min(1)), + id: bigIntSchema(z.bigint({ required_error: 'Required', invalid_type_error: 'Required' }).min(1n)), decimals: z.number().optional(), unitName: z.string().optional(), freeze: z.string().optional(), @@ -115,7 +115,7 @@ function FormInner({ helper }: FormInnerProps) { const formCtx = useFormContext>() const assetIdFieldValue = formCtx.watch('asset.id') // This actually comes back as a string value, so we convert below - const [assetId] = useDebounce(assetIdFieldValue ? Number(assetIdFieldValue) : undefined, 500) + const [assetId] = useDebounce(assetIdFieldValue ? BigInt(assetIdFieldValue) : undefined, 500) if (assetId) { return diff --git a/src/features/transaction-wizard/components/asset-opt-in-transaction-builder.tsx b/src/features/transaction-wizard/components/asset-opt-in-transaction-builder.tsx index 4bc18d859..e64fb7ee0 100644 --- a/src/features/transaction-wizard/components/asset-opt-in-transaction-builder.tsx +++ b/src/features/transaction-wizard/components/asset-opt-in-transaction-builder.tsx @@ -1,4 +1,4 @@ -import { numberSchema } from '@/features/forms/data/common' +import { bigIntSchema } from '@/features/forms/data/common' import { commonSchema, senderFieldSchema } from '../data/common' import { z } from 'zod' import { useCallback, useEffect, useMemo, useState } from 'react' @@ -29,7 +29,7 @@ const formSchema = { ...senderFieldSchema, asset: z .object({ - id: numberSchema(z.number({ required_error: 'Required', invalid_type_error: 'Required' }).min(1)), + id: bigIntSchema(z.bigint({ required_error: 'Required', invalid_type_error: 'Required' }).min(1n)), decimals: z.number().optional(), unitName: z.string().optional(), clawback: z.string().optional(), @@ -81,7 +81,7 @@ function FormInner({ helper }: FormInnerProps) { const formCtx = useFormContext>() const assetIdFieldValue = formCtx.watch('asset.id') // This actually comes back as a string value, so we convert below - const [assetId] = useDebounce(assetIdFieldValue ? Number(assetIdFieldValue) : undefined, 500) + const [assetId] = useDebounce(assetIdFieldValue ? BigInt(assetIdFieldValue) : undefined, 500) if (assetId) { return diff --git a/src/features/transaction-wizard/components/asset-opt-out-transaction-builder.tsx b/src/features/transaction-wizard/components/asset-opt-out-transaction-builder.tsx index 4d56046cc..715542245 100644 --- a/src/features/transaction-wizard/components/asset-opt-out-transaction-builder.tsx +++ b/src/features/transaction-wizard/components/asset-opt-out-transaction-builder.tsx @@ -1,4 +1,4 @@ -import { numberSchema } from '@/features/forms/data/common' +import { bigIntSchema } from '@/features/forms/data/common' import { addressFieldSchema, commonSchema, senderFieldSchema } from '../data/common' import { z } from 'zod' import { useCallback, useEffect, useMemo, useState } from 'react' @@ -30,7 +30,7 @@ const formSchema = { closeRemainderTo: addressFieldSchema, asset: z .object({ - id: numberSchema(z.number({ required_error: 'Required', invalid_type_error: 'Required' }).min(1)), + id: bigIntSchema(z.bigint({ required_error: 'Required', invalid_type_error: 'Required' }).min(1n)), decimals: z.number().optional(), unitName: z.string().optional(), clawback: z.string().optional(), @@ -88,7 +88,7 @@ function FormInner({ helper }: FormInnerProps) { const formCtx = useFormContext>() const assetIdFieldValue = formCtx.watch('asset.id') // This actually comes back as a string value, so we convert below - const [assetId] = useDebounce(assetIdFieldValue ? Number(assetIdFieldValue) : undefined, 500) + const [assetId] = useDebounce(assetIdFieldValue ? BigInt(assetIdFieldValue) : undefined, 500) if (assetId) { return diff --git a/src/features/transaction-wizard/components/asset-reconfigure-transaction-builder.tsx b/src/features/transaction-wizard/components/asset-reconfigure-transaction-builder.tsx index e2ba71d7b..e8dcdcfca 100644 --- a/src/features/transaction-wizard/components/asset-reconfigure-transaction-builder.tsx +++ b/src/features/transaction-wizard/components/asset-reconfigure-transaction-builder.tsx @@ -1,4 +1,4 @@ -import { numberSchema } from '@/features/forms/data/common' +import { bigIntSchema } from '@/features/forms/data/common' import { commonSchema, optionalAddressFieldSchema, senderFieldSchema } from '../data/common' import { z } from 'zod' import { useCallback, useEffect, useMemo, useState } from 'react' @@ -29,7 +29,7 @@ const formSchema = z ...senderFieldSchema, asset: z .object({ - id: numberSchema(z.number({ required_error: 'Required', invalid_type_error: 'Required' }).min(1)), + id: bigIntSchema(z.bigint({ required_error: 'Required', invalid_type_error: 'Required' }).min(1n)), decimals: z.number().optional(), // This field is used to determine if an asset has been resolved unitName: z.string().optional(), manager: z.string().optional(), @@ -124,7 +124,7 @@ function FormInner({ helper }: FormInnerProps) { const formCtx = useFormContext>() const assetIdFieldValue = formCtx.watch('asset.id') // This actually comes back as a string value, so we convert below - const [assetId] = useDebounce(assetIdFieldValue ? Number(assetIdFieldValue) : undefined, 500) + const [assetId] = useDebounce(assetIdFieldValue ? BigInt(assetIdFieldValue) : undefined, 500) if (assetId) { return diff --git a/src/features/transaction-wizard/components/asset-transfer-transaction-builder.tsx b/src/features/transaction-wizard/components/asset-transfer-transaction-builder.tsx index 56fcd9b6a..d33303dbf 100644 --- a/src/features/transaction-wizard/components/asset-transfer-transaction-builder.tsx +++ b/src/features/transaction-wizard/components/asset-transfer-transaction-builder.tsx @@ -1,4 +1,4 @@ -import { numberSchema } from '@/features/forms/data/common' +import { bigIntSchema, decimalSchema } from '@/features/forms/data/common' import { commonSchema, receiverFieldSchema, senderFieldSchema } from '../data/common' import { z } from 'zod' import { useCallback, useEffect, useMemo, useState } from 'react' @@ -32,7 +32,7 @@ const formSchema = { ...receiverFieldSchema, asset: z .object({ - id: numberSchema(z.number({ required_error: 'Required', invalid_type_error: 'Required' }).min(1)), + id: bigIntSchema(z.bigint({ required_error: 'Required', invalid_type_error: 'Required' }).min(1n)), decimals: z.number().optional(), unitName: z.string().optional(), clawback: z.string().optional(), @@ -46,7 +46,7 @@ const formSchema = { }) } }), - amount: numberSchema(z.number({ required_error: 'Required', invalid_type_error: 'Required' }).min(0)), + amount: decimalSchema({ required_error: 'Required' }), } const formData = zfd.formData(formSchema) @@ -97,7 +97,7 @@ function FormInner({ helper }: FormInnerProps) { const formCtx = useFormContext>() const assetIdFieldValue = formCtx.watch('asset.id') // This actually comes back as a string value, so we convert below - const [assetId] = useDebounce(assetIdFieldValue ? Number(assetIdFieldValue) : undefined, 500) + const [assetId] = useDebounce(assetIdFieldValue ? BigInt(assetIdFieldValue) : undefined, 500) if (assetId) { return @@ -163,7 +163,7 @@ export function AssetTransferTransactionBuilder({ mode, transaction, activeAccou asset: data.asset, sender: data.sender, receiver: data.receiver, - amount: data.amount, + amount: data.amount!, fee: data.fee, validRounds: data.validRounds, note: data.note, diff --git a/src/features/transaction-wizard/components/group-send-results.tsx b/src/features/transaction-wizard/components/group-send-results.tsx index 971169bb2..c94933925 100644 --- a/src/features/transaction-wizard/components/group-send-results.tsx +++ b/src/features/transaction-wizard/components/group-send-results.tsx @@ -7,7 +7,6 @@ import { TransactionsGraph, TransactionsGraphData } from '@/features/transaction import { transactionIdLabel } from '@/features/transactions/components/transaction-info' import { TransactionLink } from '@/features/transactions/components/transaction-link' import { AppCallTransaction } from '@/features/transactions/models' -import { asJson } from '@/utils/as-json' import algosdk from 'algosdk' import { Download } from 'lucide-react' import { useCallback } from 'react' @@ -76,8 +75,7 @@ const buildSimulateTraceFilename = (simulateResponse: algosdk.modelsv2.SimulateR export function GroupSendResults({ transactionGraph, transactionGraphBgClassName, sentAppCalls, simulateResponse }: Props) { const downloadSimulateTrace = useCallback(async () => { if (!simulateResponse) return - - const file = new Blob([asJson(simulateResponse.get_obj_for_encoding())], { type: 'application/json' }) + const file = new Blob([algosdk.encodeJSON(simulateResponse, { space: 2 })], { type: 'application/json' }) await downloadFile(buildSimulateTraceFilename(simulateResponse), file) }, [simulateResponse]) diff --git a/src/features/transaction-wizard/components/method-call-transaction-builder.tsx b/src/features/transaction-wizard/components/method-call-transaction-builder.tsx index 15c4d0796..857209e2b 100644 --- a/src/features/transaction-wizard/components/method-call-transaction-builder.tsx +++ b/src/features/transaction-wizard/components/method-call-transaction-builder.tsx @@ -99,7 +99,7 @@ export function MethodCallTransactionBuilder({ return { appSpec: loadableArc56ContractWithMethodDefinitions.data.appSpec, methodDefinitions: loadableArc56ContractWithMethodDefinitions.data.methodDefinitions.filter((method) => - appId === 0 ? (method.callConfig?.create ?? []).length > 0 : (method.callConfig?.call ?? []).length > 0 + appId === 0n ? (method.callConfig?.create ?? []).length > 0 : (method.callConfig?.call ?? []).length > 0 ), } }, [appId, loadableArc56ContractWithMethodDefinitions]) @@ -153,7 +153,7 @@ export function MethodCallTransactionBuilder({ const methodCallTxn = { id: methodCallTransactionId, type: BuildableTransactionType.MethodCall, - applicationId: Number(values.applicationId), + applicationId: BigInt(values.applicationId), methodDefinition: methodDefinition, onComplete: Number(values.onComplete), sender: values.sender, @@ -250,7 +250,7 @@ function FormInner({ helper, onAppIdChanged, onMethodNameChanged, methodDefiniti const methodName = watch('methodName') useEffect(() => { - onAppIdChanged(Number(appId)) + onAppIdChanged(appId) }, [appId, onAppIdChanged]) useEffect(() => { diff --git a/src/features/transaction-wizard/components/transaction-builder-valid-round-field.tsx b/src/features/transaction-wizard/components/transaction-builder-valid-round-field.tsx index f85638aec..def269ffa 100644 --- a/src/features/transaction-wizard/components/transaction-builder-valid-round-field.tsx +++ b/src/features/transaction-wizard/components/transaction-builder-valid-round-field.tsx @@ -22,8 +22,8 @@ export function TransactionBuilderValidRoundField() { setValue(lastValidPath, undefined) } else { if (syncedRound && getValues(firstValidPath) === undefined && getValues(lastValidPath) === undefined) { - setValue(firstValidPath, BigInt(syncedRound)) - setValue(lastValidPath, BigInt(syncedRound + 1000)) + setValue(firstValidPath, syncedRound) + setValue(lastValidPath, syncedRound + 1000n) } } clearErrors(firstValidPath) diff --git a/src/features/transaction-wizard/components/transactions-builder.test.tsx b/src/features/transaction-wizard/components/transactions-builder.test.tsx index ad98a94f5..de22f289b 100644 --- a/src/features/transaction-wizard/components/transactions-builder.test.tsx +++ b/src/features/transaction-wizard/components/transactions-builder.test.tsx @@ -13,7 +13,7 @@ import { MethodDefinition } from '@/features/applications/models' describe('patchTransactions', () => { const exampleMethodCallProperties = { - applicationId: 1988, + applicationId: 1988n, methodDefinition: {} as MethodDefinition, onComplete: 0, sender: asAddressOrNfd('IN6X7QLOJB76VTDHWAW43OTBUGAQ22DVYBPNHLLTJ5RVOTFVTCPK3JY6RA'), diff --git a/src/features/transaction-wizard/components/transactions-builder.tsx b/src/features/transaction-wizard/components/transactions-builder.tsx index af7054a8a..34c218cb9 100644 --- a/src/features/transaction-wizard/components/transactions-builder.tsx +++ b/src/features/transaction-wizard/components/transactions-builder.tsx @@ -80,6 +80,7 @@ export function TransactionsBuilder({ const [transactions, setTransactions] = useState(defaultTransactions ?? []) const [errorMessage, setErrorMessage] = useState(undefined) const [requireSignaturesOnSimulate, setRequireSignaturesOnSimulate] = useState(false) + const [isBusy, setIsBusy] = useState(false) const nonDeletableTransactionIds = useMemo(() => { return defaultTransactions?.map((t) => t.id) ?? [] @@ -139,6 +140,7 @@ export function TransactionsBuilder({ const sendTransactions = useCallback(async () => { try { + setIsBusy(true) setErrorMessage(undefined) invariant(activeAddress, 'Please connect your wallet') ensureThereIsNoPlaceholderTransaction(transactions) @@ -149,11 +151,14 @@ export function TransactionsBuilder({ console.error(err) const error = await parseCallAbiMethodError(err, transactions) setErrorMessage(error.message) + } finally { + setIsBusy(false) } }, [activeAddress, onSendTransactions, transactions]) const simulateTransactions = useCallback(async () => { try { + setIsBusy(true) setErrorMessage(undefined) ensureThereIsNoPlaceholderTransaction(transactions) @@ -179,11 +184,14 @@ export function TransactionsBuilder({ console.error(err) const error = await parseSimulateAbiMethodError(err, transactions) setErrorMessage(error.message) + } finally { + setIsBusy(false) } }, [onSimulated, requireSignaturesOnSimulate, transactions]) const populateResources = useCallback(async () => { try { + setIsBusy(true) setErrorMessage(undefined) ensureThereIsNoPlaceholderTransaction(transactions) @@ -201,10 +209,12 @@ export function TransactionsBuilder({ const transactionWithResources = transactionsWithResources[i] if (transaction.type === BuildableTransactionType.AppCall || transaction.type === BuildableTransactionType.MethodCall) { const resources = { - accounts: (transactionWithResources.txn.appAccounts ?? []).map((account) => algosdk.encodeAddress(account.publicKey)), - assets: transactionWithResources.txn.appForeignAssets ?? [], - applications: transactionWithResources.txn.appForeignApps ?? [], - boxes: transactionWithResources.txn.boxes?.map((box) => [box.appIndex, uint8ArrayToBase64(box.name)] as const) ?? [], + accounts: transactionWithResources.txn.applicationCall?.accounts.map((account) => account.toString()) ?? [], + assets: transactionWithResources.txn.applicationCall?.foreignAssets.map((a) => a) ?? [], + applications: transactionWithResources.txn.applicationCall?.foreignApps.map((a) => a) ?? [], + boxes: + transactionWithResources.txn.applicationCall?.boxes?.map((box) => [box.appIndex, uint8ArrayToBase64(box.name)] as const) ?? + [], } satisfies TransactionResources newTransactions = setTransactionResources(newTransactions, transaction.id, resources) } @@ -216,6 +226,8 @@ export function TransactionsBuilder({ // eslint-disable-next-line no-console console.error(error) setErrorMessage(asError(error).message) + } finally { + setIsBusy(false) } }, [transactions]) @@ -299,9 +311,9 @@ export function TransactionsBuilder({ } return { - disabled: false, + disabled: isBusy, } - }, [transactions]) + }, [transactions, isBusy]) const simulateButtonDisabledProps = useMemo(() => { if (requireSignaturesOnSimulate && !activeAddress) { diff --git a/src/features/transaction-wizard/mappers/as-algosdk-transactions.ts b/src/features/transaction-wizard/mappers/as-algosdk-transactions.ts index cc60660d5..0a04b8350 100644 --- a/src/features/transaction-wizard/mappers/as-algosdk-transactions.ts +++ b/src/features/transaction-wizard/mappers/as-algosdk-transactions.ts @@ -33,6 +33,7 @@ import { } from '@algorandfoundation/algokit-utils/types/composer' import { base64ToBytes } from '@/utils/base64-to-bytes' import { Buffer } from 'buffer' +import Decimal from 'decimal.js' export const asAlgosdkTransactions = async (transaction: BuildTransactionResult): Promise => { if (transaction.type === BuildableTransactionType.Payment || transaction.type === BuildableTransactionType.AccountClose) { @@ -176,8 +177,14 @@ export const asAssetTransferTransactionParams = ( | BuildAssetClawbackTransactionResult ): AssetTransferParams => { invariant(transaction.asset.decimals !== undefined, 'Asset decimals is required') - - const amount = 'amount' in transaction && transaction.amount > 0 ? BigInt(transaction.amount * 10 ** transaction.asset.decimals) : 0n + let amount = 0n + if ('amount' in transaction && transaction.amount.gt(0)) { + const convertedAmount = transaction.amount.mul(new Decimal(10).pow(transaction.asset.decimals)) + if (!convertedAmount.isInteger()) { + throw new Error('Asset transfer failed to convert to the lowest unit') + } + amount = BigInt(convertedAmount.toString()) + } return { sender: transaction.sender.resolvedAddress, receiver: 'receiver' in transaction ? transaction.receiver.resolvedAddress : transaction.sender.resolvedAddress, diff --git a/src/features/transaction-wizard/mappers/as-description-list-items.tsx b/src/features/transaction-wizard/mappers/as-description-list-items.tsx index edc8a52f3..dc1ab7100 100644 --- a/src/features/transaction-wizard/mappers/as-description-list-items.tsx +++ b/src/features/transaction-wizard/mappers/as-description-list-items.tsx @@ -1,4 +1,4 @@ -import algosdk from 'algosdk' +import algosdk, { Address } from 'algosdk' import { DescriptionList, DescriptionListItems } from '@/features/common/components/description-list' import { BuildableTransactionType, @@ -127,7 +127,7 @@ const asAssetTransferTransaction = ( return [ { dt: 'Asset ID', - dd: , + dd: , }, { dt: 'Sender', @@ -173,7 +173,7 @@ const asAssetConfigTransaction = ( ? [ { dt: 'Asset ID', - dd: , + dd: , }, ] : []), @@ -234,7 +234,7 @@ const asAssetFreezeTransaction = (transaction: BuildAssetFreezeTransactionResult return [ { dt: 'Asset ID', - dd: , + dd: , }, { dt: 'Sender', @@ -340,11 +340,11 @@ const asMethodArg = ( return } if (argumentDefinition.type === algosdk.ABIReferenceType.asset) { - const assetId = Number(arg) + const assetId = BigInt(arg.toString()) return } if (argumentDefinition.type === algosdk.ABIReferenceType.application) { - const applicationId = Number(arg) + const applicationId = BigInt(arg.toString()) return } return arg.toString() @@ -366,7 +366,7 @@ const asAppCallTransaction = (transaction: BuildAppCallTransactionResult): Descr ? [ { dt: 'Application ID', - dd: , + dd: , }, ] : []), @@ -418,7 +418,7 @@ const asMethodCallTransaction = ( ? [ { dt: 'Application ID', - dd: , + dd: , }, ] : []), @@ -485,7 +485,12 @@ const asValidRoundsItem = (firstValid?: bigint, lastValid?: bigint) => ] : [] -const asResourcesItem = (accounts?: string[], assets?: bigint[], apps?: bigint[], boxes?: CommonAppCallParams['boxReferences']) => { +const asResourcesItem = ( + accounts?: (string | Address)[], + assets?: bigint[], + apps?: bigint[], + boxes?: CommonAppCallParams['boxReferences'] +) => { return [ { dt: 'Resources', @@ -500,7 +505,7 @@ const asResourcesItem = (accounts?: string[], assets?: bigint[], apps?: bigint[] {accounts?.map((address, index, array) => (
  • - {address} + {typeof address === 'string' ? address : address.toString()} {index < array.length - 1 ? {', '} : null}
  • @@ -518,8 +523,8 @@ const asResourcesItem = (accounts?: string[], assets?: bigint[], apps?: bigint[]
      {assets.map((assetId, index, array) => (
    1. - - {Number(assetId)} + + {assetId.toString()} {index < array.length - 1 ? {', '} : null}
    2. @@ -537,8 +542,8 @@ const asResourcesItem = (accounts?: string[], assets?: bigint[], apps?: bigint[]
        {apps?.map((appId, index, array) => (
      1. - - {Number(appId)} + + {appId.toString()} {index < array.length - 1 ? {', '} : null}
      2. @@ -561,8 +566,8 @@ const asResourcesItem = (accounts?: string[], assets?: bigint[], apps?: bigint[]
      3. [ {box.appId > 0 ? ( - - {Number(box.appId)} + + {box.appId.toString()} ) : ( { return { ...original.useWallet(), activeAddress: null, + isReady: true, } satisfies ReturnType }) }) @@ -142,11 +143,12 @@ describe('transaction-wizard-page', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(testAccount.addr) - expect(result.transaction['payment-transaction']!).toMatchInlineSnapshot(` - { - "amount": 500000, - "close-amount": 0, + expect(result.transaction.sender).toBe(testAccount.addr.toString()) + expect(result.transaction.paymentTransaction!).toMatchInlineSnapshot(` + TransactionPayment { + "amount": 500000n, + "closeAmount": 0n, + "closeRemainderTo": undefined, "receiver": "${testAccount2.addr}", } `) @@ -247,12 +249,12 @@ describe('transaction-wizard-page', () => { ) const result = await localnet.context.waitForIndexerTransaction(transactionId) - expect(result.transaction.sender).toBe(testAccount.addr) - expect(result.transaction['payment-transaction']!).toMatchInlineSnapshot(` - { - "amount": 0, - "close-amount": 9999000, - "close-remainder-to": "${testAccount2.addr}", + expect(result.transaction.sender).toBe(testAccount.addr.toString()) + expect(result.transaction.paymentTransaction!).toMatchInlineSnapshot(` + TransactionPayment { + "amount": 0n, + "closeAmount": 9999000n, + "closeRemainderTo": "${testAccount2.addr}", "receiver": "${testAccount.addr}", } `) diff --git a/src/features/transactions-graph/components/transactions-graph.test.tsx b/src/features/transactions-graph/components/transactions-graph.test.tsx index 1afc381d7..0bea8e9a7 100644 --- a/src/features/transactions-graph/components/transactions-graph.test.tsx +++ b/src/features/transactions-graph/components/transactions-graph.test.tsx @@ -5,11 +5,10 @@ import { render, prettyDOM } from '@/tests/testing-library' import { asAppCallTransaction, asAssetTransferTransaction, + asHeartbeatTransaction, asPaymentTransaction, asTransaction, - asHeartbeatTransaction, } from '../../transactions/mappers' -import { AssetResult, TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' import { assetResultMother } from '@/tests/object-mother/asset-result' import { useParams } from 'react-router-dom' import { asAssetSummary } from '@/features/assets/mappers/asset-summary' @@ -27,6 +26,8 @@ import { GroupId, GroupResult } from '@/features/groups/data/types' import { Round } from '@/features/blocks/data/types' import { AsyncMaybeAtom } from '@/features/common/data/types' import { DecodedAbiMethod } from '@/features/abi-methods/models' +import { AssetResult } from '@/features/assets/data/types' +import { TransactionResult } from '@/features/transactions/data/types' // This file maintain the snapshot test for the TransactionViewVisual component // To add new test case: @@ -51,7 +52,7 @@ describe('payment-transaction-graph', () => { return executeComponentTest( () => render(), async (component) => { - expect(prettyDOM(component.container, prettyDomMaxLength, { highlight: false })).toMatchFileSnapshot( + await expect(prettyDOM(component.container, prettyDomMaxLength, { highlight: false })).toMatchFileSnapshot( `__snapshots__/payment-transaction-graph.${transactionResult.id}.html` ) } @@ -80,7 +81,7 @@ describe('asset-transfer-transaction-graph', () => { return executeComponentTest( () => render(), async (component) => { - expect(prettyDOM(component.container, prettyDomMaxLength, { highlight: false })).toMatchFileSnapshot( + await expect(prettyDOM(component.container, prettyDomMaxLength, { highlight: false })).toMatchFileSnapshot( `__snapshots__/asset-transfer-graph.${transaction.id}.html` ) } @@ -142,7 +143,7 @@ describe('application-call-graph', () => { async (component) => { // Sleep to make sure the ABI method is loaded await setTimeout(10) - expect(prettyDOM(component.container, prettyDomMaxLength, { highlight: false })).toMatchFileSnapshot( + await expect(prettyDOM(component.container, prettyDomMaxLength, { highlight: false })).toMatchFileSnapshot( `__snapshots__/application-transaction-graph.${transactionResult.id}.html` ) } @@ -165,7 +166,7 @@ describe('key-reg-graph', () => { return executeComponentTest( () => render(), async (component) => { - expect(prettyDOM(component.container, prettyDomMaxLength, { highlight: false })).toMatchFileSnapshot( + await expect(prettyDOM(component.container, prettyDomMaxLength, { highlight: false })).toMatchFileSnapshot( `__snapshots__/key-reg-graph.${transactionResult.id}.html` ) } @@ -246,7 +247,7 @@ describe('group-graph', () => { // Sleep to make sure the ABI method is loaded await setTimeout(10) - expect(prettyDOM(component.container, prettyDomMaxLength, { highlight: false })).toMatchFileSnapshot( + await expect(prettyDOM(component.container, prettyDomMaxLength, { highlight: false })).toMatchFileSnapshot( `__snapshots__/group-graph.${encodeURIComponent(groupId)}.html` ) } @@ -269,7 +270,7 @@ describe('heartbeat-transaction-graph', () => { return executeComponentTest( () => render(), async (component) => { - expect(prettyDOM(component.container, prettyDomMaxLength, { highlight: false })).toMatchFileSnapshot( + await expect(prettyDOM(component.container, prettyDomMaxLength, { highlight: false })).toMatchFileSnapshot( `__snapshots__/heartbeat-transaction-graph.${transactionResult.id}.html` ) } @@ -278,7 +279,7 @@ describe('heartbeat-transaction-graph', () => { }) }) -const createAssetResolver = (assetResults: AssetResult[]) => (assetId: number) => { +const createAssetResolver = (assetResults: AssetResult[]) => (assetId: bigint) => { const assetResult = assetResults.find((a) => a.index === assetId) invariant(assetResult, `Could not find asset result ${assetId}`) return atom(() => asAssetSummary(assetResult)) diff --git a/src/features/transactions-graph/components/vertical-title.tsx b/src/features/transactions-graph/components/vertical-title.tsx index a74937cff..a52ddc124 100644 --- a/src/features/transactions-graph/components/vertical-title.tsx +++ b/src/features/transactions-graph/components/vertical-title.tsx @@ -49,7 +49,7 @@ export function VerticalTitle({ vertical, isSimulated }: { vertical: Vertical; i
        {isSimulated ? ( - {vertical.applicationId} + {vertical.applicationId.toString()} ) : ( )} @@ -67,7 +67,7 @@ export function VerticalTitle({ vertical, isSimulated }: { vertical: Vertical; i )} {vertical.type === 'Asset' && ( - {isSimulated ? {vertical.assetId} : } + {isSimulated ? {vertical.assetId.toString()} : } )} {vertical.type === 'OpUp' && ( diff --git a/src/features/transactions-graph/mappers/verticals.ts b/src/features/transactions-graph/mappers/verticals.ts index 44389696f..236ca5678 100644 --- a/src/features/transactions-graph/mappers/verticals.ts +++ b/src/features/transactions-graph/mappers/verticals.ts @@ -184,7 +184,7 @@ const asRawTransactionGraphVerticals = (transaction: Transaction | InnerTransact const associatedAccounts = transaction.innerTransactions .reduce( (acc, itxn) => { - if (itxn.sender !== getApplicationAddress(transaction.applicationId)) { + if (itxn.sender !== getApplicationAddress(transaction.applicationId).toString()) { acc.push({ type: 'Rekey', accountNumber: -1, @@ -216,7 +216,7 @@ const asRawTransactionGraphVerticals = (transaction: Transaction | InnerTransact applicationId: transaction.applicationId, linkedAccount: { accountNumber: -1, - accountAddress: getApplicationAddress(transaction.applicationId), + accountAddress: getApplicationAddress(transaction.applicationId).toString(), }, associatedAccounts, }) diff --git a/src/features/transactions/components/asset-config-transaction-info.tsx b/src/features/transactions/components/asset-config-transaction-info.tsx index 831b96440..068869008 100644 --- a/src/features/transactions/components/asset-config-transaction-info.tsx +++ b/src/features/transactions/components/asset-config-transaction-info.tsx @@ -64,7 +64,7 @@ export function AssetConfigTransactionInfo({ transaction }: Props) { transaction.total != null ? { dt: assetTotalSupplyLabel, - dd: `${new Decimal(transaction.total.toString()).div(new Decimal(10).pow((transaction.decimals ?? 0).toString()))} ${transaction.unitName}`, + dd: `${new Decimal(transaction.total.toString()).div(new Decimal(10).pow((transaction.decimals ?? 0).toString()))} ${transaction.unitName ?? ''}`, } : undefined, transaction.decimals != null diff --git a/src/features/transactions/components/live-transactions-table.tsx b/src/features/transactions/components/live-transactions-table.tsx index 50d2f0a27..87fd4bcc8 100644 --- a/src/features/transactions/components/live-transactions-table.tsx +++ b/src/features/transactions/components/live-transactions-table.tsx @@ -3,7 +3,7 @@ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../common/components/select' import { useEffect, useState } from 'react' import { InnerTransaction, Transaction } from '@/features/transactions/models' -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' import { useLiveTransactions } from '../data/live-transaction' import { cn } from '@/features/common/utils' import { Switch } from '@/features/common/components/switch' diff --git a/src/features/transactions/components/multisig-details.tsx b/src/features/transactions/components/multisig-details.tsx index 83a8241b4..5560c88a6 100644 --- a/src/features/transactions/components/multisig-details.tsx +++ b/src/features/transactions/components/multisig-details.tsx @@ -23,10 +23,14 @@ export function MultisigDetails({ signature }: MultisigProps) { dt: multisigThresholdLabel, dd: signature.threshold, }, - { - dt: multisigSubsignersLabel, - dd: signature.subsigners.map((address, index) =>
        {address}
        ), - }, + ...(signature.subsigners + ? [ + { + dt: multisigSubsignersLabel, + dd: signature.subsigners.map((address, index) =>
        {address}
        ), + }, + ] + : []), ], [signature.subsigners, signature.version, signature.threshold] ) diff --git a/src/features/transactions/data/global-state-delta-resolver.ts b/src/features/transactions/data/global-state-delta-resolver.ts index 812f02e2a..f972d6a1a 100644 --- a/src/features/transactions/data/global-state-delta-resolver.ts +++ b/src/features/transactions/data/global-state-delta-resolver.ts @@ -1,4 +1,4 @@ -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' import { atom, Atom } from 'jotai' import { GlobalStateDelta } from '../models' import { TransactionType as AlgoSdkTransactionType } from 'algosdk' @@ -8,11 +8,11 @@ import { asGlobalStateDelta } from '../mappers/state-delta-mappers' export const globalStateDeltaResolver = (transaction: TransactionResult): Atom> => { return atom(async (get) => { - if (transaction['tx-type'] !== AlgoSdkTransactionType.appl || !transaction['application-transaction']?.['application-id']) { + if (transaction.txType !== AlgoSdkTransactionType.appl || !transaction.applicationTransaction?.applicationId) { return [] } - const appSpec = await get(createAppSpecAtom(transaction['application-transaction']?.['application-id'])) - return asGlobalStateDelta(transaction['global-state-delta'], appSpec ? asArc56AppSpec(appSpec) : undefined) + const appSpec = await get(createAppSpecAtom(transaction.applicationTransaction?.applicationId)) + return asGlobalStateDelta(transaction.globalStateDelta, appSpec ? asArc56AppSpec(appSpec) : undefined) }) } diff --git a/src/features/transactions/data/inner-transaction.ts b/src/features/transactions/data/inner-transaction.ts index a3601bb43..1892cc62c 100644 --- a/src/features/transactions/data/inner-transaction.ts +++ b/src/features/transactions/data/inner-transaction.ts @@ -1,6 +1,6 @@ import { Atom, atom, useAtomValue } from 'jotai' import { useMemo } from 'react' -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' import { loadable } from 'jotai/utils' import { TransactionId } from './types' import { asTransaction } from '../mappers/transaction-mappers' @@ -14,7 +14,7 @@ export const createInnerTransactionAtom = ( innerId: string ) => { return atom(async (get) => { - const txn = 'id' in transactionResult ? transactionResult : await get(transactionResult) + const txn = 'read' in transactionResult ? await get(transactionResult) : transactionResult const transaction = asTransaction(txn, assetSummaryResolver, abiMethodResolver) if (transaction.type !== TransactionType.AppCall) { throw new Error('Only application call transactions have inner transactions') diff --git a/src/features/transactions/data/live-transaction.ts b/src/features/transactions/data/live-transaction.ts index 869b6f01f..a184a04d3 100644 --- a/src/features/transactions/data/live-transaction.ts +++ b/src/features/transactions/data/live-transaction.ts @@ -4,7 +4,7 @@ import { InnerTransaction, Transaction } from '@/features/transactions/models' import { atomEffect } from 'jotai-effect' import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai' import { TransactionId } from '@/features/transactions/data/types' -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' export const useLiveTransactions = (filter: (transactionResult: TransactionResult) => boolean, maxRows: number) => { const { liveTransactionsAtomEffect, liveTransactionsAtom, showLiveUpdatesAtom } = useMemo(() => { diff --git a/src/features/transactions/data/local-state-delta-resolver.ts b/src/features/transactions/data/local-state-delta-resolver.ts index 689307338..dd7723e5c 100644 --- a/src/features/transactions/data/local-state-delta-resolver.ts +++ b/src/features/transactions/data/local-state-delta-resolver.ts @@ -1,4 +1,4 @@ -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' import { atom, Atom } from 'jotai' import { LocalStateDelta } from '../models' import { TransactionType as AlgoSdkTransactionType } from 'algosdk' @@ -8,11 +8,11 @@ import { asLocalStateDelta } from '../mappers/state-delta-mappers' export const localStateDeltaResolver = (transaction: TransactionResult): Atom> => { return atom(async (get) => { - if (transaction['tx-type'] !== AlgoSdkTransactionType.appl || !transaction['application-transaction']?.['application-id']) { + if (transaction.txType !== AlgoSdkTransactionType.appl || !transaction.applicationTransaction?.applicationId) { return [] } - const appSpec = await get(createAppSpecAtom(transaction['application-transaction']?.['application-id'])) - return asLocalStateDelta(transaction['local-state-delta'], appSpec ? asArc56AppSpec(appSpec) : undefined) + const appSpec = await get(createAppSpecAtom(transaction.applicationTransaction?.applicationId)) + return asLocalStateDelta(transaction.localStateDelta, appSpec ? asArc56AppSpec(appSpec) : undefined) }) } diff --git a/src/features/transactions/data/send-transaction-result.ts b/src/features/transactions/data/send-transaction-result.ts index d677aa805..623b615d2 100644 --- a/src/features/transactions/data/send-transaction-result.ts +++ b/src/features/transactions/data/send-transaction-result.ts @@ -1,8 +1,5 @@ -import { BlockInnerTransaction } from '@algorandfoundation/algokit-subscriber/types/block' -import algosdk from 'algosdk' import { Transaction } from '../models' import { SendTransactionResults } from '@algorandfoundation/algokit-utils/types/transaction' -import { getIndexerTransactionFromAlgodTransaction } from '@algorandfoundation/algokit-subscriber/transform' import { invariant } from '@/utils/invariant' import { asTransaction } from '../mappers' import { getAssetResultAtom } from '@/features/assets/data' @@ -12,23 +9,28 @@ import { GroupId, GroupResult } from '@/features/groups/data/types' import { Round } from '@/features/blocks/data/types' import { AssetId } from '@/features/assets/data/types' import { asAssetSummary } from '@/features/assets/mappers' +import { getIndexerTransactionFromAlgodTransaction } from '@algorandfoundation/algokit-subscriber/transform' +import algosdk, { SignedTxnWithAD } from 'algosdk' +import { accumulateGroupsFromTransaction } from '@/features/blocks/data' +import { subscribedTransactionToTransactionResult } from '../mappers/subscriber-transaction-mappers' -const asBlockTransaction = (res: algosdk.modelsv2.PendingTransactionResponse): BlockInnerTransaction => { - return { - txn: res.txn.txn, - sgnr: res.txn.sgnr, - caid: res.assetIndex !== undefined ? Number(res.assetIndex) : res.txn.txn.caid, - apid: res.applicationIndex !== undefined ? Number(res.applicationIndex) : res.txn.txn.apid, - aca: res.assetClosingAmount, - ca: res.closingAmount !== undefined ? Number(res.closingAmount) : undefined, - dt: { - // We don't use gd or ld in this context, so don't need to map. - gd: {}, - ld: {}, - lg: res.logs ?? [], - itx: res.innerTxns?.map((inner) => asBlockTransaction(inner)), - }, - } +const asSignedTxnWithAD = (res: algosdk.modelsv2.PendingTransactionResponse): SignedTxnWithAD => { + return new SignedTxnWithAD({ + signedTxn: new algosdk.SignedTransaction({ + txn: res.txn.txn, + sgnr: res.txn.sgnr, + }), + applyData: new algosdk.ApplyData({ + configAsset: res.assetIndex, + applicationID: res.applicationIndex, + closingAmount: res.closingAmount, + assetClosingAmount: res.assetClosingAmount, + evalDelta: new algosdk.EvalDelta({ + logs: res.logs, + innerTxns: res.innerTxns?.map((inner) => asSignedTxnWithAD(inner)), + }), + }), + }) } export const asTransactionFromSendResult = (result: SendTransactionResults): Transaction[] => { @@ -38,37 +40,47 @@ export const asTransactionFromSendResult = (result: SendTransactionResults): Tra invariant(result.transactions.length === result.confirmations.length, 'All transactions must be confirmed') const now = new Date() - const groupResolver = (groupId: GroupId, round: Round) => - atom(() => { - return { - id: groupId, - timestamp: now.toISOString(), - round, - transactionIds: result.transactions.map((txn) => txn.txID()), - } satisfies GroupResult - }) + const groups = new Map() // This mapping does some approximations, which are fine for the contexts we currently use it for. - return result.confirmations.map((confirmation, i) => { - const txnResult = getIndexerTransactionFromAlgodTransaction({ - blockTransaction: asBlockTransaction(confirmation), - roundOffset: 0, - roundIndex: 0, - genesisHash: confirmation.txn.txn.gh, - genesisId: confirmation.txn.txn.gen, - roundNumber: Number(confirmation.confirmedRound ?? 0), + const transactionResults = result.confirmations.map((confirmation, i) => { + invariant(confirmation.txn.txn.genesisHash, 'Genesis hash is required') + invariant(confirmation.txn.txn.genesisID, 'Genesis ID is required') + + const subscribedTransaction = getIndexerTransactionFromAlgodTransaction({ + signedTxnWithAD: asSignedTxnWithAD(confirmation), + intraRoundOffset: 0, + transactionId: confirmation.txn.txn.txID(), + genesisHash: Buffer.from(confirmation.txn.txn.genesisHash), + genesisId: confirmation.txn.txn.genesisID, + roundNumber: confirmation.confirmedRound ?? 0n, roundTimestamp: Math.floor(now.getTime() / 1000), transaction: result.transactions[i], logs: confirmation.logs, - createdAssetId: confirmation.assetIndex !== undefined ? Number(confirmation.assetIndex) : undefined, - createdAppId: confirmation.applicationIndex !== undefined ? Number(confirmation.applicationIndex) : undefined, - closeAmount: confirmation.closingAmount != undefined ? Number(confirmation.closingAmount) : undefined, + createdAssetId: confirmation.assetIndex, + createdAppId: confirmation.applicationIndex, + closeAmount: confirmation.closingAmount, assetCloseAmount: confirmation.assetClosingAmount, }) - const transaction = asTransaction(txnResult, assetSummaryResolver, abiMethodResolver, groupResolver) - return transaction + return subscribedTransactionToTransactionResult(subscribedTransaction) }) + + transactionResults.forEach((txnResult) => { + accumulateGroupsFromTransaction(groups, txnResult, 0n, 0) + }) + + const groupResolver = (groupId: GroupId, round: Round) => + atom(() => { + return { + id: groupId, + timestamp: now.toISOString(), + round, + transactionIds: groups.get(groupId)?.transactionIds ?? [], + } satisfies GroupResult + }) + + return transactionResults.map((txnResult) => asTransaction(txnResult, assetSummaryResolver, abiMethodResolver, groupResolver)) } const assetSummaryResolver = (assetId: AssetId) => @@ -82,7 +94,7 @@ const assetSummaryResolver = (assetId: AssetId) => params: { creator: '', decimals: 0, - total: 0, + total: 0n, }, }) } diff --git a/src/features/transactions/data/transaction-result.ts b/src/features/transactions/data/transaction-result.ts index 35f21a31f..d8a3609e3 100644 --- a/src/features/transactions/data/transaction-result.ts +++ b/src/features/transactions/data/transaction-result.ts @@ -1,14 +1,16 @@ -import { TransactionId } from './types' -import { lookupTransactionById } from '@algorandfoundation/algokit-utils' +import { TransactionId, TransactionResult } from './types' import { readOnlyAtomCache } from '@/features/common/data' import { indexer } from '@/features/common/data/algo-client' import { Getter, Setter } from 'jotai/index' -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { indexerTransactionToTransactionResult } from '../mappers/indexer-transaction-mappers' const getTransactionResult = (_: Getter, __: Setter, transactionId: TransactionId) => - lookupTransactionById(transactionId, indexer).then((result) => { - return result.transaction - }) + indexer + .lookupTransactionByID(transactionId) + .do() + .then((result) => { + return indexerTransactionToTransactionResult(result.transaction) + }) const keySelector = (transactionId: TransactionId) => transactionId diff --git a/src/features/transactions/data/transaction.ts b/src/features/transactions/data/transaction.ts index 8193d7708..921a6dcfe 100644 --- a/src/features/transactions/data/transaction.ts +++ b/src/features/transactions/data/transaction.ts @@ -1,12 +1,12 @@ import { Atom, atom, useAtomValue } from 'jotai' import { useMemo } from 'react' -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' import { loadable } from 'jotai/utils' import { TransactionId } from './types' import { asTransaction } from '../mappers/transaction-mappers' import { getTransactionResultAtom } from './transaction-result' import { assetSummaryResolver } from '@/features/assets/data/asset-summary' import { abiMethodResolver } from '@/features/abi-methods/data' +import { TransactionResult } from './types' export const createTransactionsAtom = (transactionResults: TransactionResult[]) => { return atom(() => { @@ -18,7 +18,7 @@ export const createTransactionsAtom = (transactionResults: TransactionResult[]) export const createTransactionAtom = (transactionResult: TransactionResult | Atom>) => { return atom(async (get) => { - const txn = 'id' in transactionResult ? transactionResult : await get(transactionResult) + const txn = 'read' in transactionResult ? await get(transactionResult) : transactionResult return asTransaction(txn, assetSummaryResolver, abiMethodResolver) }) } diff --git a/src/features/transactions/data/types.ts b/src/features/transactions/data/types.ts index 8b009ba5b..694c46c45 100644 --- a/src/features/transactions/data/types.ts +++ b/src/features/transactions/data/types.ts @@ -1 +1,84 @@ +import { Expand } from '@/utils/expand' +import algosdk from 'algosdk' + export type TransactionId = string + +export type TransactionResult = Expand< + Omit< + algosdk.indexerModels.Transaction, + | 'id' + | 'getEncodingSchema' + | 'toEncodingData' + | 'signature' + | 'paymentTransaction' + | 'assetTransferTransaction' + | 'applicationTransaction' + | 'assetConfigTransaction' + | 'innerTxns' + | 'localStateDelta' + | 'globalStateDelta' + | 'assetFreezeTransaction' + | 'keyregTransaction' + | 'heartbeatTransaction' + > & { + id: TransactionId + signature?: TransactionSignature + paymentTransaction?: TransactionPayment + assetTransferTransaction?: TransactionAssetTransfer + applicationTransaction?: TransactionApplication + assetConfigTransaction?: TransactionAssetConfig + innerTxns?: TransactionResult[] + localStateDelta?: AccountStateDelta[] + globalStateDelta?: EvalDeltaKeyValue[] + assetFreezeTransaction?: TransactionAssetFreeze + keyregTransaction?: TransactionKeyreg + heartbeatTransaction?: TransactionHeartbeat + } +> + +export type EvalDeltaKeyValue = Omit & { + value: EvalDelta +} + +export type AccountStateDelta = Omit & { + delta: EvalDeltaKeyValue[] +} + +export type EvalDelta = Omit + +export type TransactionSignature = Omit< + algosdk.indexerModels.TransactionSignature, + 'getEncodingSchema' | 'toEncodingData' | 'multisig' | 'logicsig' +> & { + multisig?: Omit & { + subsignature?: Omit[] + } + logicsig?: Omit +} + +export type TransactionKeyreg = Omit + +export type TransactionHeartbeat = Omit + +export type TransactionPayment = Omit + +export type TransactionAssetTransfer = Omit + +export type TransactionApplication = Omit< + algosdk.indexerModels.TransactionApplication, + 'getEncodingSchema' | 'toEncodingData' | 'globalStateSchema' | 'localStateSchema' | 'applicationId' +> & { + // algod returns undefined for application-id when creating an application + applicationId?: bigint + globalStateSchema?: Omit + localStateSchema?: Omit +} + +export type TransactionAssetConfig = Omit< + algosdk.indexerModels.TransactionAssetConfig, + 'getEncodingSchema' | 'toEncodingData' | 'params' +> & { + params?: Omit +} + +export type TransactionAssetFreeze = Omit diff --git a/src/features/transactions/mappers/app-call-transaction-mappers.ts b/src/features/transactions/mappers/app-call-transaction-mappers.ts index 3cec5b74c..3b43feddc 100644 --- a/src/features/transactions/mappers/app-call-transaction-mappers.ts +++ b/src/features/transactions/mappers/app-call-transaction-mappers.ts @@ -1,4 +1,3 @@ -import { ApplicationOnComplete, TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' import { AppCallOnComplete, AppCallTransaction, @@ -23,6 +22,9 @@ import { GroupId, GroupResult } from '@/features/groups/data/types' import { Round } from '@/features/blocks/data/types' import { globalStateDeltaResolver } from '../data/global-state-delta-resolver' import { localStateDeltaResolver } from '../data/local-state-delta-resolver' +import { TransactionResult } from '../data/types' +import { AssetId } from '@/features/assets/data/types' +import { uint8ArrayToBase64 } from '@/utils/uint8-array-to-base64' const opUpPrograms = [ 'A4EB', // #pragma version 3\npushint 1\n // First version pushint was available @@ -43,7 +45,7 @@ const opUpPrograms = [ const mapCommonAppCallTransactionProperties = ( networkTransactionId: string, transactionResult: TransactionResult, - assetResolver: (assetId: number) => AsyncMaybeAtom, + assetResolver: (assetId: AssetId) => AsyncMaybeAtom, abiMethodResolver: ( transactionResult: TransactionResult, groupResolver: (groupId: GroupId, round: Round) => AsyncMaybeAtom @@ -51,14 +53,16 @@ const mapCommonAppCallTransactionProperties = ( groupResolver: (groupId: GroupId, round: Round) => AsyncMaybeAtom, indexPrefix?: string ) => { - invariant(transactionResult['application-transaction'], 'application-transaction is not set') - const isCreate = !transactionResult['application-transaction']['application-id'] - const onCompletion = asAppCallOnComplete(transactionResult['application-transaction']['on-completion']) + invariant(transactionResult.applicationTransaction, 'application-transaction is not set') + const isCreate = !transactionResult.applicationTransaction.applicationId + const onCompletion = asAppCallOnComplete(transactionResult.applicationTransaction.onCompletion) const isOpUp = isCreate && onCompletion === AppCallOnComplete.Delete && - opUpPrograms.includes(transactionResult['application-transaction']['approval-program']) && - opUpPrograms.includes(transactionResult['application-transaction']['clear-state-program']) + !!transactionResult.applicationTransaction.approvalProgram && + !!transactionResult.applicationTransaction.clearStateProgram && + opUpPrograms.includes(uint8ArrayToBase64(transactionResult.applicationTransaction.approvalProgram)) && + opUpPrograms.includes(uint8ArrayToBase64(transactionResult.applicationTransaction.clearStateProgram)) const abiMethod = abiMethodResolver(transactionResult, groupResolver) return { @@ -66,30 +70,30 @@ const mapCommonAppCallTransactionProperties = ( type: TransactionType.AppCall, subType: isCreate ? AppCallTransactionSubType.Create : undefined, isOpUp, - applicationId: transactionResult['application-transaction']['application-id'] - ? transactionResult['application-transaction']['application-id'] - : transactionResult['created-application-index']!, - applicationArgs: transactionResult['application-transaction']['application-args'] ?? [], - applicationAccounts: transactionResult['application-transaction'].accounts ?? [], - foreignApps: transactionResult['application-transaction']['foreign-apps'] ?? [], - foreignAssets: transactionResult['application-transaction']['foreign-assets'] ?? [], + applicationId: transactionResult.applicationTransaction.applicationId + ? transactionResult.applicationTransaction.applicationId + : transactionResult.createdApplicationIndex!, + applicationArgs: transactionResult.applicationTransaction.applicationArgs?.map((a) => uint8ArrayToBase64(a)) ?? [], + applicationAccounts: transactionResult.applicationTransaction.accounts?.map((a) => a.toString()) ?? [], + foreignApps: transactionResult.applicationTransaction.foreignApps ?? [], + foreignAssets: transactionResult.applicationTransaction.foreignAssets ?? [], globalStateDeltas: globalStateDeltaResolver(transactionResult), localStateDeltas: localStateDeltaResolver(transactionResult), innerTransactions: - transactionResult['inner-txns']?.map((innerTransaction, index) => { + transactionResult.innerTxns?.map((innerTransaction, index) => { // Generate a unique id for the inner transaction const innerId = indexPrefix ? `${indexPrefix}/${index + 1}` : `${index + 1}` return asInnerTransaction(networkTransactionId, innerId, innerTransaction, assetResolver, abiMethodResolver, groupResolver) }) ?? [], onCompletion, - logs: transactionResult['logs'] ?? [], + logs: transactionResult.logs?.map((l) => uint8ArrayToBase64(l)) ?? [], abiMethod, } satisfies BaseAppCallTransaction } export const asAppCallTransaction = ( transactionResult: TransactionResult, - assetResolver: (assetId: number) => AsyncMaybeAtom, + assetResolver: (assetId: AssetId) => AsyncMaybeAtom, abiMethodResolver: ( transactionResult: TransactionResult, groupResolver: (groupId: GroupId, round: Round) => AsyncMaybeAtom @@ -114,7 +118,7 @@ export const asInnerAppCallTransaction = ( networkTransactionId: string, index: string, transactionResult: TransactionResult, - assetResolver: (assetId: number) => AsyncMaybeAtom, + assetResolver: (assetId: AssetId) => AsyncMaybeAtom, abiMethodResolver: ( transactionResult: TransactionResult, groupResolver: (groupId: GroupId, round: Round) => AsyncMaybeAtom @@ -134,20 +138,22 @@ export const asInnerAppCallTransaction = ( } } -const asAppCallOnComplete = (indexerEnum: ApplicationOnComplete): AppCallOnComplete => { - switch (indexerEnum) { - case ApplicationOnComplete.noop: +const asAppCallOnComplete = (onComplete?: string): AppCallOnComplete => { + switch (onComplete) { + case 'noop': return AppCallOnComplete.NoOp - case ApplicationOnComplete.optin: + case 'optin': return AppCallOnComplete.OptIn - case ApplicationOnComplete.closeout: + case 'closeout': return AppCallOnComplete.CloseOut - case ApplicationOnComplete.clear: + case 'clear': return AppCallOnComplete.ClearState - case ApplicationOnComplete.update: + case 'update': return AppCallOnComplete.Update - case ApplicationOnComplete.delete: + case 'delete': return AppCallOnComplete.Delete + default: + throw new Error(`Unsupported on-complete value: ${onComplete}`) } } @@ -155,31 +161,31 @@ const asInnerTransaction = ( networkTransactionId: string, index: string, transactionResult: TransactionResult, - assetResolver: (assetId: number) => AsyncMaybeAtom, + assetResolver: (assetId: AssetId) => AsyncMaybeAtom, abiMethodResolver: ( transactionResult: TransactionResult, groupResolver: (groupId: GroupId, round: Round) => AsyncMaybeAtom ) => Atom>, groupResolver: (groupId: GroupId, round: Round) => AsyncMaybeAtom ) => { - if (transactionResult['tx-type'] === AlgoSdkTransactionType.pay) { + if (transactionResult.txType === AlgoSdkTransactionType.pay) { return asInnerPaymentTransaction(networkTransactionId, index, transactionResult) } - if (transactionResult['tx-type'] === AlgoSdkTransactionType.axfer) { + if (transactionResult.txType === AlgoSdkTransactionType.axfer) { return asInnerAssetTransferTransaction(networkTransactionId, index, transactionResult, assetResolver) } - if (transactionResult['tx-type'] === AlgoSdkTransactionType.appl) { + if (transactionResult.txType === AlgoSdkTransactionType.appl) { return asInnerAppCallTransaction(networkTransactionId, index, transactionResult, assetResolver, abiMethodResolver, groupResolver) } - if (transactionResult['tx-type'] === AlgoSdkTransactionType.acfg) { + if (transactionResult.txType === AlgoSdkTransactionType.acfg) { return asInnerAssetConfigTransaction(networkTransactionId, index, transactionResult) } - if (transactionResult['tx-type'] === AlgoSdkTransactionType.afrz) { + if (transactionResult.txType === AlgoSdkTransactionType.afrz) { return asInnerAssetFreezeTransaction(networkTransactionId, index, transactionResult, assetResolver) } - if (transactionResult['tx-type'] === AlgoSdkTransactionType.keyreg) { + if (transactionResult.txType === AlgoSdkTransactionType.keyreg) { return asInnerKeyRegTransaction(networkTransactionId, index, transactionResult) } - throw new Error(`Unsupported inner transaction type: ${transactionResult['tx-type']}`) + throw new Error(`Unsupported inner transaction type: ${transactionResult.txType}`) } diff --git a/src/features/transactions/mappers/asset-config-transaction-mappers.ts b/src/features/transactions/mappers/asset-config-transaction-mappers.ts index dfa3175a1..ef79e67c1 100644 --- a/src/features/transactions/mappers/asset-config-transaction-mappers.ts +++ b/src/features/transactions/mappers/asset-config-transaction-mappers.ts @@ -1,4 +1,4 @@ -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' import { AssetConfigTransaction, AssetConfigTransactionSubType, @@ -10,36 +10,36 @@ import { invariant } from '@/utils/invariant' import { asInnerTransactionId, mapCommonTransactionProperties } from './transaction-common-properties-mappers' const mapCommonAssetConfigTransactionProperties = (transactionResult: TransactionResult): BaseAssetConfigTransaction => { - invariant(transactionResult['asset-config-transaction'], 'asset-config-transaction is not set') - const assetConfig = transactionResult['asset-config-transaction'] + invariant(transactionResult.assetConfigTransaction, 'asset-config-transaction is not set') + const assetConfig = transactionResult.assetConfigTransaction - if (!assetConfig['params']) { + if (!assetConfig.params) { return { ...mapCommonTransactionProperties(transactionResult), type: TransactionType.AssetConfig, subType: AssetConfigTransactionSubType.Destroy, - assetId: assetConfig['asset-id'], + assetId: assetConfig.assetId!, } } - const subType = assetConfig['asset-id'] ? AssetConfigTransactionSubType.Reconfigure : AssetConfigTransactionSubType.Create - const assetId = subType === AssetConfigTransactionSubType.Reconfigure ? assetConfig['asset-id'] : transactionResult['created-asset-index'] + const subType = assetConfig.assetId ? AssetConfigTransactionSubType.Reconfigure : AssetConfigTransactionSubType.Create + const assetId = subType === AssetConfigTransactionSubType.Reconfigure ? assetConfig.assetId : transactionResult.createdAssetIndex return { ...mapCommonTransactionProperties(transactionResult), type: TransactionType.AssetConfig, subType: subType, assetId: assetId!, - name: assetConfig['params']['name'] ?? undefined, - url: assetConfig['params']['url'] ?? undefined, - unitName: assetConfig['params']['unit-name'] ?? undefined, - total: assetConfig['params']['total'] ?? undefined, - decimals: assetConfig['params']['decimals'] ?? undefined, - clawback: assetConfig['params']['clawback'] ?? undefined, - manager: assetConfig['params']['manager'] ?? undefined, - reserve: assetConfig['params']['reserve'] ?? undefined, - freeze: assetConfig['params']['freeze'] ?? undefined, - defaultFrozen: assetConfig['params']['default-frozen'] ?? false, + name: assetConfig.params.name ?? undefined, + url: assetConfig.params.url ?? undefined, + unitName: assetConfig.params.unitName ?? undefined, + total: assetConfig.params.total ?? undefined, + decimals: assetConfig.params.decimals ?? undefined, + clawback: assetConfig.params.clawback ?? undefined, + manager: assetConfig.params.manager ?? undefined, + reserve: assetConfig.params.reserve ?? undefined, + freeze: assetConfig.params.freeze ?? undefined, + defaultFrozen: assetConfig.params.defaultFrozen ?? false, } } diff --git a/src/features/transactions/mappers/asset-freeze-transaction-mappers.ts b/src/features/transactions/mappers/asset-freeze-transaction-mappers.ts index 444f092b0..552118d53 100644 --- a/src/features/transactions/mappers/asset-freeze-transaction-mappers.ts +++ b/src/features/transactions/mappers/asset-freeze-transaction-mappers.ts @@ -1,4 +1,4 @@ -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' import { AssetFreezeStatus, AssetFreezeTransaction, @@ -10,14 +10,15 @@ import { invariant } from '@/utils/invariant' import { asInnerTransactionId, mapCommonTransactionProperties } from './transaction-common-properties-mappers' import { AssetSummary } from '@/features/assets/models' import { AsyncMaybeAtom } from '@/features/common/data/types' +import { AssetId } from '@/features/assets/data/types' const mapCommonAssetFreezeTransactionProperties = ( transactionResult: TransactionResult, - assetResolver: (assetId: number) => AsyncMaybeAtom + assetResolver: (assetId: AssetId) => AsyncMaybeAtom ): BaseAssetFreezeTransaction => { - invariant(transactionResult['asset-freeze-transaction'], 'asset-freeze-transaction is not set') - const assetFreeze = transactionResult['asset-freeze-transaction'] - const assetId = assetFreeze['asset-id'] + invariant(transactionResult.assetFreezeTransaction, 'asset-freeze-transaction is not set') + const assetFreeze = transactionResult.assetFreezeTransaction + const assetId = assetFreeze.assetId const asset = assetResolver(assetId) return { @@ -27,13 +28,13 @@ const mapCommonAssetFreezeTransactionProperties = ( address: assetFreeze['address'], assetId, asset, - freezeStatus: assetFreeze['new-freeze-status'] ? AssetFreezeStatus.Frozen : AssetFreezeStatus.Unfrozen, + freezeStatus: assetFreeze.newFreezeStatus ? AssetFreezeStatus.Frozen : AssetFreezeStatus.Unfrozen, } } export const asAssetFreezeTransaction = ( transactionResult: TransactionResult, - assetResolver: (assetId: number) => AsyncMaybeAtom + assetResolver: (assetId: AssetId) => AsyncMaybeAtom ): AssetFreezeTransaction => { return { id: transactionResult.id, @@ -45,7 +46,7 @@ export const asInnerAssetFreezeTransaction = ( networkTransactionId: string, index: string, transactionResult: TransactionResult, - assetResolver: (assetId: number) => AsyncMaybeAtom + assetResolver: (assetId: AssetId) => AsyncMaybeAtom ): InnerAssetFreezeTransaction => { return { ...asInnerTransactionId(networkTransactionId, index), diff --git a/src/features/transactions/mappers/asset-transfer-transaction-mappers.ts b/src/features/transactions/mappers/asset-transfer-transaction-mappers.ts index 83b5d78e9..19bb26a4f 100644 --- a/src/features/transactions/mappers/asset-transfer-transaction-mappers.ts +++ b/src/features/transactions/mappers/asset-transfer-transaction-mappers.ts @@ -1,4 +1,4 @@ -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' import { AssetTransferTransaction, AssetTransferTransactionSubType, @@ -11,16 +11,17 @@ import { ZERO_ADDRESS } from '@/features/common/constants' import { asInnerTransactionId, mapCommonTransactionProperties } from './transaction-common-properties-mappers' import { AssetSummary } from '@/features/assets/models' import { AsyncMaybeAtom } from '@/features/common/data/types' +import { AssetId } from '@/features/assets/data/types' const mapSubType = (transactionResult: TransactionResult) => { - invariant(transactionResult['asset-transfer-transaction'], 'asset-transfer-transaction is not set') - const assetTransfer = transactionResult['asset-transfer-transaction'] + invariant(transactionResult.assetTransferTransaction, 'asset-transfer-transaction is not set') + const assetTransfer = transactionResult.assetTransferTransaction - if (assetTransfer['close-to']) { + if (assetTransfer.closeTo) { return AssetTransferTransactionSubType.OptOut } - if (transactionResult.sender === assetTransfer.receiver && assetTransfer.amount === 0) { + if (transactionResult.sender === assetTransfer.receiver && assetTransfer.amount === 0n) { return AssetTransferTransactionSubType.OptIn } @@ -35,11 +36,11 @@ const mapSubType = (transactionResult: TransactionResult) => { const mapCommonAssetTransferTransactionProperties = ( transactionResult: TransactionResult, - assetResolver: (assetId: number) => AsyncMaybeAtom + assetResolver: (assetId: AssetId) => AsyncMaybeAtom ) => { - invariant(transactionResult['asset-transfer-transaction'], 'asset-transfer-transaction is not set') + invariant(transactionResult.assetTransferTransaction, 'asset-transfer-transaction is not set') - const assetId = transactionResult['asset-transfer-transaction']['asset-id'] + const assetId = transactionResult.assetTransferTransaction.assetId const asset = assetResolver(assetId) return { @@ -48,21 +49,21 @@ const mapCommonAssetTransferTransactionProperties = ( subType: mapSubType(transactionResult), assetId, asset, - receiver: transactionResult['asset-transfer-transaction'].receiver, - amount: transactionResult['asset-transfer-transaction'].amount, - closeRemainder: transactionResult['asset-transfer-transaction']['close-to'] + receiver: transactionResult.assetTransferTransaction.receiver, + amount: transactionResult.assetTransferTransaction.amount, + closeRemainder: transactionResult.assetTransferTransaction.closeTo ? { - to: transactionResult['asset-transfer-transaction']['close-to'], - amount: transactionResult['asset-transfer-transaction']['close-amount'] ?? 0, + to: transactionResult.assetTransferTransaction.closeTo, + amount: transactionResult.assetTransferTransaction.closeAmount ?? 0n, } : undefined, - clawbackFrom: transactionResult['asset-transfer-transaction'].sender, + clawbackFrom: transactionResult.assetTransferTransaction.sender, } satisfies BaseAssetTransferTransaction } export const asAssetTransferTransaction = ( transactionResult: TransactionResult, - assetResolver: (assetId: number) => AsyncMaybeAtom + assetResolver: (assetId: bigint) => AsyncMaybeAtom ): AssetTransferTransaction => { return { id: transactionResult.id, @@ -74,7 +75,7 @@ export const asInnerAssetTransferTransaction = ( networkTransactionId: string, index: string, transactionResult: TransactionResult, - assetResolver: (assetId: number) => AsyncMaybeAtom + assetResolver: (assetId: AssetId) => AsyncMaybeAtom ): InnerAssetTransferTransaction => { return { ...asInnerTransactionId(networkTransactionId, index), diff --git a/src/features/transactions/mappers/heartbeat-transaction-mappers.ts b/src/features/transactions/mappers/heartbeat-transaction-mappers.ts index dcfa30e86..6e7821cb1 100644 --- a/src/features/transactions/mappers/heartbeat-transaction-mappers.ts +++ b/src/features/transactions/mappers/heartbeat-transaction-mappers.ts @@ -1,17 +1,17 @@ -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '../data/types' import { HeartbeatTransaction, TransactionType } from '../models' import { mapCommonTransactionProperties } from './transaction-common-properties-mappers' import { invariant } from '@/utils/invariant' export const asHeartbeatTransaction = (transactionResult: TransactionResult): HeartbeatTransaction => { - invariant(transactionResult['heartbeat-transaction'], 'heartbeat-transaction is not set') - const heartbeat = transactionResult['heartbeat-transaction'] + invariant(transactionResult.heartbeatTransaction, 'heartbeat-transaction is not set') + const heartbeat = transactionResult.heartbeatTransaction return { id: transactionResult.id, type: TransactionType.Heartbeat, subType: undefined, - address: heartbeat['hb-address'], + address: heartbeat.hbAddress, ...mapCommonTransactionProperties(transactionResult), } } diff --git a/src/features/transactions/mappers/indexer-transaction-mappers.ts b/src/features/transactions/mappers/indexer-transaction-mappers.ts new file mode 100644 index 000000000..8db1c259b --- /dev/null +++ b/src/features/transactions/mappers/indexer-transaction-mappers.ts @@ -0,0 +1,37 @@ +import { removeEncodableMethods } from '@/utils/remove-encodable-methods' +import { TransactionId, TransactionResult } from '../data/types' +import algosdk from 'algosdk' + +export const indexerTransactionToTransactionResult = (transaction: algosdk.indexerModels.Transaction): TransactionResult => { + const { innerTxns, ...rest } = removeEncodableMethods(transaction) + + const innerTxnsWithId = innerTxns?.map((innerTxn, index) => + indexerTransactionToInnerTransactionResult(innerTxn, transaction.id!, index + 1) + ) + + return { + ...rest, + innerTxns: innerTxnsWithId, + id: transaction.id!, + } +} + +export const indexerTransactionToInnerTransactionResult = ( + transaction: algosdk.indexerModels.Transaction, + parentTransactionId: TransactionId, + offset: number +): TransactionResult => { + const transactionId = parentTransactionId.includes('inner') + ? `${parentTransactionId}/${offset}` + : `${parentTransactionId}/inner/${offset}` + + const innerTxns = transaction.innerTxns?.map((innerTxn, index) => + indexerTransactionToInnerTransactionResult(innerTxn, transactionId, index + 1) + ) + + return { + ...removeEncodableMethods(transaction), + id: transactionId, + innerTxns, + } +} diff --git a/src/features/transactions/mappers/key-reg-transaction-mappers.ts b/src/features/transactions/mappers/key-reg-transaction-mappers.ts index ebf5a6a44..6123748b8 100644 --- a/src/features/transactions/mappers/key-reg-transaction-mappers.ts +++ b/src/features/transactions/mappers/key-reg-transaction-mappers.ts @@ -1,28 +1,29 @@ -import { KeyRegistrationTransactionResult, TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' import { KeyRegTransaction, BaseKeyRegTransaction, InnerKeyRegTransaction, TransactionType, KeyRegTransactionSubType } from '../models' import { invariant } from '@/utils/invariant' import { asInnerTransactionId, mapCommonTransactionProperties } from './transaction-common-properties-mappers' +import { TransactionKeyreg, TransactionResult } from '../data/types' +import { uint8ArrayToBase64 } from '@/utils/uint8-array-to-base64' -const mapSubType = (keyreg: KeyRegistrationTransactionResult) => - keyreg['vote-first-valid'] !== undefined && keyreg['vote-last-valid'] && keyreg['vote-key-dilution'] && keyreg['vote-participation-key'] +const mapSubType = (keyreg: TransactionKeyreg) => + keyreg.voteFirstValid !== undefined && keyreg.voteLastValid && keyreg.voteKeyDilution && keyreg.voteParticipationKey ? KeyRegTransactionSubType.Online : KeyRegTransactionSubType.Offline const mapCommonKeyRegTransactionProperties = (transactionResult: TransactionResult): BaseKeyRegTransaction => { - invariant(transactionResult['keyreg-transaction'], 'keyreg-transaction is not set') - const keyReg = transactionResult['keyreg-transaction'] + invariant(transactionResult.keyregTransaction, 'keyreg-transaction is not set') + const keyReg = transactionResult.keyregTransaction return { ...mapCommonTransactionProperties(transactionResult), type: TransactionType.KeyReg, subType: mapSubType(keyReg), - voteParticipationKey: keyReg['vote-participation-key'], - nonParticipation: keyReg['non-participation'], - selectionParticipationKey: keyReg['selection-participation-key'], - stateProofKey: keyReg['state-proof-key'], - voteKeyDilution: keyReg['vote-key-dilution'], - voteFirstValid: keyReg['vote-first-valid'], - voteLastValid: keyReg['vote-last-valid'], + voteParticipationKey: keyReg.voteParticipationKey ? uint8ArrayToBase64(keyReg.voteParticipationKey) : undefined, + nonParticipation: keyReg.nonParticipation, + selectionParticipationKey: keyReg.selectionParticipationKey ? uint8ArrayToBase64(keyReg.selectionParticipationKey) : undefined, + stateProofKey: keyReg.stateProofKey ? uint8ArrayToBase64(keyReg.stateProofKey) : undefined, + voteKeyDilution: keyReg.voteKeyDilution, + voteFirstValid: keyReg.voteFirstValid, + voteLastValid: keyReg.voteLastValid, } } diff --git a/src/features/transactions/mappers/payment-transaction-mappers.ts b/src/features/transactions/mappers/payment-transaction-mappers.ts index c3c6e6a00..0d4b1f831 100644 --- a/src/features/transactions/mappers/payment-transaction-mappers.ts +++ b/src/features/transactions/mappers/payment-transaction-mappers.ts @@ -1,23 +1,23 @@ -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' import { BasePaymentTransaction, InnerPaymentTransaction, PaymentTransaction, TransactionType } from '../models' import { invariant } from '@/utils/invariant' import { asInnerTransactionId, mapCommonTransactionProperties } from './transaction-common-properties-mappers' import { microAlgos } from '@algorandfoundation/algokit-utils' +import { TransactionResult } from '@/features/transactions/data/types' const mapCommonPaymentTransactionProperties = (transactionResult: TransactionResult) => { - invariant(transactionResult['payment-transaction'], 'payment-transaction is not set') - const payment = transactionResult['payment-transaction'] + invariant(transactionResult.paymentTransaction, 'payment-transaction is not set') + const payment = transactionResult.paymentTransaction return { ...mapCommonTransactionProperties(transactionResult), type: TransactionType.Payment, subType: undefined, - receiver: payment['receiver'], - amount: microAlgos(payment['amount']), - closeRemainder: payment['close-remainder-to'] + receiver: payment.receiver, + amount: microAlgos(payment.amount), + closeRemainder: payment.closeRemainderTo ? { - to: payment['close-remainder-to'], - amount: microAlgos(payment['close-amount'] ?? 0), + to: payment.closeRemainderTo, + amount: microAlgos(payment.closeAmount ?? 0n), } : undefined, } satisfies BasePaymentTransaction diff --git a/src/features/transactions/mappers/state-delta-mappers.ts b/src/features/transactions/mappers/state-delta-mappers.ts index e9720cd2a..cb3b4ae0c 100644 --- a/src/features/transactions/mappers/state-delta-mappers.ts +++ b/src/features/transactions/mappers/state-delta-mappers.ts @@ -1,5 +1,4 @@ import algosdk, { encodeAddress } from 'algosdk' -import { AccountStateDelta, EvalDelta, EvalDeltaKeyValue, StateDelta } from '@algorandfoundation/algokit-utils/types/indexer' import isUtf8 from 'isutf8' import { DecodedGlobalStateDelta, @@ -17,8 +16,9 @@ import { DecodedAbiType, DecodedAbiStorageValue, DecodedAbiStorageKeyType } from import { uint8ArrayStartsWith } from '@/utils/uint8-array-starts-with' import { base64ToUtf8 } from '@/utils/base64-to-utf8' import { Address } from '@/features/accounts/data/types' +import { AccountStateDelta, EvalDelta, EvalDeltaKeyValue } from '../data/types' -export const asGlobalStateDelta = (stateDelta: StateDelta | undefined, appSpec?: Arc56Contract): GlobalStateDelta[] => { +export const asGlobalStateDelta = (stateDelta: EvalDeltaKeyValue[] | undefined, appSpec?: Arc56Contract): GlobalStateDelta[] => { if (!stateDelta) { return [] } diff --git a/src/features/transactions/mappers/state-proof-transaction-mappers.ts b/src/features/transactions/mappers/state-proof-transaction-mappers.ts index e705eee84..4df366db6 100644 --- a/src/features/transactions/mappers/state-proof-transaction-mappers.ts +++ b/src/features/transactions/mappers/state-proof-transaction-mappers.ts @@ -1,4 +1,4 @@ -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' import { StateProofTransaction, TransactionType } from '../models' import { mapCommonTransactionProperties } from './transaction-common-properties-mappers' diff --git a/src/features/transactions/mappers/subscriber-transaction-mappers.ts b/src/features/transactions/mappers/subscriber-transaction-mappers.ts new file mode 100644 index 000000000..62caa26f3 --- /dev/null +++ b/src/features/transactions/mappers/subscriber-transaction-mappers.ts @@ -0,0 +1,54 @@ +import { removeEncodableMethods } from '@/utils/remove-encodable-methods' +import { SubscribedTransaction } from '@algorandfoundation/algokit-subscriber/types/subscription' +import { TransactionResult } from '../data/types' + +export const subscribedTransactionToTransactionResult = (subscribedTransaction: SubscribedTransaction): TransactionResult => { + const transactionWithoutEncodeMethods = removeEncodableMethods(subscribedTransaction) + + const { + filtersMatched: _filtersMatched, + balanceChanges: _balanceChanges, + arc28Events: _arc28Events, + ...transaction + } = transactionWithoutEncodeMethods + const innerTransactions = transaction.innerTxns?.map((innerTransaction, index) => + subscribedTransactionToInnerTransactionResult(innerTransaction, transaction.id, index + 1) + ) + + return { + ...transaction, + innerTxns: innerTransactions, + } satisfies TransactionResult +} + +const subscribedTransactionToInnerTransactionResult = ( + subscribedTransaction: SubscribedTransaction, + parentTransactionId: string, + offset: number +): TransactionResult => { + const transactionWithoutEncodeMethods = removeEncodableMethods(subscribedTransaction) + + const { + filtersMatched: _filtersMatched, + balanceChanges: _balanceChanges, + arc28Events: _arc28Events, + id: _id, + parentTransactionId: _parentTransactionId, + ...transaction + } = transactionWithoutEncodeMethods + + const transactionId = parentTransactionId.includes('inner') + ? `${parentTransactionId}/${offset}` + : `${parentTransactionId}/inner/${offset}` + + const innerTransactions = transaction.innerTxns?.map((innerTransaction, index) => + subscribedTransactionToInnerTransactionResult(innerTransaction, transactionId, index + 1) + ) + + return { + ...transaction, + id: transactionId, + intraRoundOffset: subscribedTransaction.parentIntraRoundOffset, + innerTxns: innerTransactions, + } +} diff --git a/src/features/transactions/mappers/transaction-common-properties-mappers.ts b/src/features/transactions/mappers/transaction-common-properties-mappers.ts index fa5b90198..6eb21f3be 100644 --- a/src/features/transactions/mappers/transaction-common-properties-mappers.ts +++ b/src/features/transactions/mappers/transaction-common-properties-mappers.ts @@ -1,24 +1,27 @@ -import { TransactionResult, TransactionSignature } from '@algorandfoundation/algokit-utils/types/indexer' import { InnerTransactionId, Logicsig, Multisig, SignatureType, Singlesig } from '../models' import { invariant } from '@/utils/invariant' -import { publicKeyToAddress } from '@/utils/publickey-to-addess' import { microAlgos } from '@algorandfoundation/algokit-utils' +import { TransactionResult, TransactionSignature } from '@/features/transactions/data/types' +import { uint8ArrayToBase64 } from '@/utils/uint8-array-to-base64' +import algosdk from 'algosdk' +import { isDefined } from '@/utils/is-defined' +import { normaliseAlgoSdkData } from '@/utils/as-json' import { asJson } from '@/utils/as-json' export const mapCommonTransactionProperties = (transactionResult: TransactionResult) => { - invariant(transactionResult['confirmed-round'] !== undefined, 'confirmed-round is not set') - invariant(transactionResult['round-time'], 'round-time is not set') + invariant(transactionResult.confirmedRound !== undefined, 'confirmed-round is not set') + invariant(transactionResult.roundTime, 'round-time is not set') return { - confirmedRound: transactionResult['confirmed-round'], - roundTime: transactionResult['round-time'] * 1000, - group: transactionResult['group'], + confirmedRound: transactionResult.confirmedRound, + roundTime: transactionResult.roundTime * 1000, + group: transactionResult.group ? uint8ArrayToBase64(transactionResult.group) : undefined, fee: microAlgos(transactionResult.fee), sender: transactionResult.sender, signature: transformSignature(transactionResult.signature), - note: transactionResult.note, - json: asJson(transactionResult), - rekeyTo: transactionResult['rekey-to'], + note: transactionResult.note ? uint8ArrayToBase64(transactionResult.note) : undefined, + json: asJson(normaliseAlgoSdkData(transactionResult)), + rekeyTo: transactionResult.rekeyTo?.toString(), } } @@ -26,7 +29,7 @@ export const transformSignature = (signature?: TransactionSignature) => { if (signature?.sig) { return { type: SignatureType.Single, - signer: signature.sig, + signer: uint8ArrayToBase64(signature.sig), } satisfies Singlesig } @@ -35,14 +38,16 @@ export const transformSignature = (signature?: TransactionSignature) => { type: SignatureType.Multi, version: signature.multisig.version, threshold: signature.multisig.threshold, - subsigners: signature.multisig.subsignature.map((subsignature) => publicKeyToAddress(subsignature['public-key'])), + subsigners: signature.multisig.subsignature + ?.map((subsignature) => (subsignature.publicKey ? algosdk.encodeAddress(subsignature.publicKey) : undefined)) + .filter(isDefined), } satisfies Multisig } if (signature?.logicsig) { return { type: SignatureType.Logic, - logic: signature.logicsig.logic, + logic: uint8ArrayToBase64(signature.logicsig.logic), } satisfies Logicsig } } diff --git a/src/features/transactions/mappers/transaction-mappers.ts b/src/features/transactions/mappers/transaction-mappers.ts index 829a575c4..c1f9c34d3 100644 --- a/src/features/transactions/mappers/transaction-mappers.ts +++ b/src/features/transactions/mappers/transaction-mappers.ts @@ -1,4 +1,3 @@ -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' import algosdk from 'algosdk' import { asAppCallTransaction } from './app-call-transaction-mappers' import { asAssetTransferTransaction } from './asset-transfer-transaction-mappers' @@ -15,17 +14,19 @@ import { Round } from '@/features/blocks/data/types' import { getGroupResultAtom } from '@/features/groups/data/group-result' import { DecodedAbiMethod } from '@/features/abi-methods/models' import { asHeartbeatTransaction } from './heartbeat-transaction-mappers' +import { TransactionResult } from '../data/types' +import { AssetId } from '@/features/assets/data/types' export const asTransaction = ( transactionResult: TransactionResult, - assetResolver: (assetId: number) => AsyncMaybeAtom, + assetResolver: (assetId: AssetId) => AsyncMaybeAtom, abiMethodResolver: ( transactionResult: TransactionResult, groupResolver: (groupId: GroupId, round: Round) => AsyncMaybeAtom ) => Atom>, groupResolver: (groupId: GroupId, round: Round) => AsyncMaybeAtom = getGroupResultAtom ) => { - switch (transactionResult['tx-type']) { + switch (transactionResult.txType) { case algosdk.TransactionType.pay: return asPaymentTransaction(transactionResult) case algosdk.TransactionType.axfer: { @@ -50,6 +51,6 @@ export const asTransaction = ( return asHeartbeatTransaction(transactionResult) } default: - throw new Error(`Unknown transaction type ${transactionResult['tx-type']}`) + throw new Error(`Unknown transaction type ${transactionResult.txType}`) } } diff --git a/src/features/transactions/mappers/transaction-summary-mappers.ts b/src/features/transactions/mappers/transaction-summary-mappers.ts index 500b749ac..c154198f0 100644 --- a/src/features/transactions/mappers/transaction-summary-mappers.ts +++ b/src/features/transactions/mappers/transaction-summary-mappers.ts @@ -1,4 +1,4 @@ -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' import { TransactionSummary, TransactionType } from '../models' import { invariant } from '@/utils/invariant' import algosdk from 'algosdk' @@ -11,72 +11,73 @@ export const asTransactionSummary = (transactionResult: TransactionResult): Tran fee: microAlgos(transactionResult.fee), } - switch (transactionResult['tx-type']) { + switch (transactionResult.txType) { case algosdk.TransactionType.pay: - invariant(transactionResult['payment-transaction'], 'payment-transaction is not set') + invariant(transactionResult.paymentTransaction, 'payment-transaction is not set') return { ...common, type: TransactionType.Payment, - to: transactionResult['payment-transaction']['receiver'], + to: transactionResult.paymentTransaction.receiver, } case algosdk.TransactionType.axfer: { - invariant(transactionResult['asset-transfer-transaction'], 'asset-transfer-transaction is not set') + invariant(transactionResult.assetTransferTransaction, 'asset-transfer-transaction is not set') return { ...common, type: TransactionType.AssetTransfer, - to: transactionResult['asset-transfer-transaction']['receiver'], + to: transactionResult.assetTransferTransaction.receiver, } } case algosdk.TransactionType.appl: { - invariant(transactionResult['application-transaction'], 'application-transaction is not set') + invariant(transactionResult.applicationTransaction, 'application-transaction is not set') return { ...common, type: TransactionType.AppCall, - to: transactionResult['application-transaction']['application-id'] - ? transactionResult['application-transaction']['application-id'] - : transactionResult['created-application-index']!, - innerTransactions: transactionResult['inner-txns']?.map((t) => asTransactionSummary(t)), + to: transactionResult.applicationTransaction.applicationId + ? transactionResult.applicationTransaction.applicationId + : transactionResult.createdApplicationIndex!, } } case algosdk.TransactionType.acfg: { - invariant(transactionResult['asset-config-transaction'], 'asset-config-transaction is not set') + invariant(transactionResult.assetConfigTransaction, 'asset-config-transaction is not set') return { ...common, type: TransactionType.AssetConfig, - to: transactionResult['asset-config-transaction']['asset-id'] ?? transactionResult['created-asset-index'], + to: transactionResult.assetConfigTransaction.assetId + ? transactionResult.assetConfigTransaction.assetId + : transactionResult.createdAssetIndex, } } case algosdk.TransactionType.afrz: { - invariant(transactionResult['asset-freeze-transaction'], 'asset-freeze-transaction is not set') + invariant(transactionResult.assetFreezeTransaction, 'asset-freeze-transaction is not set') return { ...common, type: TransactionType.AssetFreeze, - to: transactionResult['asset-freeze-transaction']['asset-id'], + to: transactionResult.assetFreezeTransaction.assetId, } } case algosdk.TransactionType.stpf: { - invariant(transactionResult['state-proof-transaction'], 'state-proof-transaction is not set') + invariant(transactionResult.stateProofTransaction, 'state-proof-transaction is not set') return { ...common, type: TransactionType.StateProof, } } case algosdk.TransactionType.keyreg: { - invariant(transactionResult['keyreg-transaction'], 'keyreg-transaction is not set') + invariant(transactionResult.keyregTransaction, 'keyreg-transaction is not set') return { ...common, type: TransactionType.KeyReg, } } case algosdk.TransactionType.hb: { - invariant(transactionResult['heartbeat-transaction'], 'heartbeat-transaction is not set') + invariant(transactionResult.heartbeatTransaction, 'heartbeat-transaction is not set') return { ...common, type: TransactionType.Heartbeat, } } default: - throw new Error(`Unknown Transaction type ${transactionResult['tx-type']}`) + throw new Error(`Unknown Transaction type ${transactionResult.txType}`) } } diff --git a/src/features/transactions/models/index.ts b/src/features/transactions/models/index.ts index 057f5ce43..da9a7a3cf 100644 --- a/src/features/transactions/models/index.ts +++ b/src/features/transactions/models/index.ts @@ -6,10 +6,11 @@ import { AlgoAmount } from '@algorandfoundation/algokit-utils/types/amount' import { GroupId } from '@/features/groups/data/types' import { Atom } from 'jotai/index' import { DecodedAbiMethod, DecodedAbiStorageKey, DecodedAbiStorageValue } from '@/features/abi-methods/models' +import { ApplicationId } from '@/features/applications/data/types' export type CommonTransactionProperties = { type: TransactionType - confirmedRound: number + confirmedRound: bigint roundTime: number group?: GroupId fee: AlgoAmount @@ -63,7 +64,7 @@ export type BaseAssetTransferTransaction = CommonTransactionProperties & { type: TransactionType.AssetTransfer subType: AssetTransferTransactionSubType | undefined receiver: Address - amount: number | bigint + amount: bigint closeRemainder?: CloseAssetRemainder assetId: AssetId asset: AsyncMaybeAtom @@ -87,8 +88,7 @@ export type Transaction = export type TransactionSummary = Pick & { id: string from: Address - to?: Address | number - innerTransactions?: TransactionSummary[] + to?: Address | number | bigint } export enum SignatureType { @@ -104,9 +104,9 @@ export type Singlesig = { export type Multisig = { type: SignatureType.Multi - version: number - threshold: number - subsigners: Address[] + version?: number + threshold?: number + subsigners?: Address[] } export type Logicsig = { @@ -154,10 +154,10 @@ export type BaseAppCallTransaction = CommonTransactionProperties & { type: TransactionType.AppCall subType: AppCallTransactionSubType | undefined isOpUp: boolean - applicationId: number + applicationId: ApplicationId applicationArgs: string[] - foreignApps: number[] - foreignAssets: number[] + foreignApps: ApplicationId[] + foreignAssets: AssetId[] applicationAccounts: Address[] globalStateDeltas: Atom> localStateDeltas: Atom> @@ -200,7 +200,7 @@ export type InnerTransaction = export type BaseAssetConfigTransaction = CommonTransactionProperties & { type: TransactionType.AssetConfig subType: AssetConfigTransactionSubType - assetId: number + assetId: AssetId url?: string name?: string total?: number | bigint @@ -229,7 +229,7 @@ export type BaseAssetFreezeTransaction = CommonTransactionProperties & { type: TransactionType.AssetFreeze subType: undefined address: Address - assetId: number + assetId: AssetId asset: AsyncMaybeAtom freezeStatus: AssetFreezeStatus } @@ -256,9 +256,9 @@ export type BaseKeyRegTransaction = CommonTransactionProperties & { subType: KeyRegTransactionSubType nonParticipation?: boolean selectionParticipationKey?: string - voteFirstValid?: number - voteKeyDilution?: number - voteLastValid?: number + voteFirstValid?: bigint + voteKeyDilution?: bigint + voteLastValid?: bigint voteParticipationKey?: string stateProofKey?: string } diff --git a/src/features/transactions/pages/transaction-page.test.tsx b/src/features/transactions/pages/transaction-page.test.tsx index ffda4a89f..da681ad8e 100644 --- a/src/features/transactions/pages/transaction-page.test.tsx +++ b/src/features/transactions/pages/transaction-page.test.tsx @@ -12,7 +12,6 @@ import { useParams } from 'react-router-dom' import { getByDescriptionTerm } from '@/tests/custom-queries/get-description' import { createStore } from 'jotai' import { transactionResultsAtom } from '../data' -import { lookupTransactionById } from '@algorandfoundation/algokit-utils' import { HttpError } from '@/tests/errors' import { logicsigLabel } from '../components/logicsig-details' import { createReadOnlyAtomAndTimestamp, createTimestamp } from '@/features/common/data' @@ -85,11 +84,13 @@ import { AppSpecStandard, Arc32AppSpec, Arc4AppSpec } from '@/features/app-inter import { AppInterfaceEntity, dbConnectionAtom } from '@/features/common/data/indexed-db' import { genesisHashAtom } from '@/features/blocks/data' import { upsertAppInterface } from '@/features/app-interfaces/data' -import { algod } from '@/features/common/data/algo-client' +import { algod, indexer } from '@/features/common/data/algo-client' import Arc56TestAppSpecSampleOne from '@/tests/test-app-specs/arc56/sample-one.json' import { Arc56Contract } from '@algorandfoundation/algokit-utils/types/app-arc56' import Arc56TestAppSpecSampleThree from '@/tests/test-app-specs/arc56/sample-three.json' import { heartbeatAddressLabel } from '../components/heartbeat-transaction-info' +import algosdk from 'algosdk' +import { uint8ArrayToBase64 } from '@/utils/uint8-array-to-base64' vi.mock('@/features/common/data/algo-client', async () => { const original = await vi.importActual('@/features/common/data/algo-client') @@ -100,6 +101,11 @@ vi.mock('@/features/common/data/algo-client', async () => { do: vi.fn(), }), }, + indexer: { + lookupTransactionByID: vi.fn().mockReturnValue({ + do: vi.fn(), + }), + }, } }) @@ -120,7 +126,9 @@ describe('transaction-page', () => { describe('when rendering a transaction that does not exist', () => { it('should display not found message', () => { vi.mocked(useParams).mockImplementation(() => ({ transactionId: '8MK6WLKFBPC323ATSEKNEKUTQZ23TCCM75SJNSFAHEM65GYJ5AND' })) - vi.mocked(lookupTransactionById).mockImplementation(() => Promise.reject(new HttpError('boom', 404))) + vi.mocked(indexer.lookupTransactionByID('8MK6WLKFBPC323ATSEKNEKUTQZ23TCCM75SJNSFAHEM65GYJ5AND').do).mockImplementation(() => + Promise.reject(new HttpError('boom', 404)) + ) return executeComponentTest( () => render(), @@ -134,7 +142,9 @@ describe('transaction-page', () => { describe('when rendering a transaction that fails to load', () => { it('should display failed to load message', () => { vi.mocked(useParams).mockImplementation(() => ({ transactionId: '7MK6WLKFBPC323ATSEKNEKUTQZ23TCCM75SJNSFAHEM65GYJ5AND' })) - vi.mocked(lookupTransactionById).mockImplementation(() => Promise.reject({})) + vi.mocked(indexer.lookupTransactionByID('7MK6WLKFBPC323ATSEKNEKUTQZ23TCCM75SJNSFAHEM65GYJ5AND').do).mockImplementation(() => + Promise.reject({}) + ) return executeComponentTest( () => render(), @@ -149,16 +159,16 @@ describe('transaction-page', () => { const transaction = transactionResultMother .payment() .withId('FBORGSDC4ULLWHWZUMUFIYQLSDC26HGLTFD7EATQDY37FHCIYBBQ') - ['withConfirmed-round'](36570178) - ['withRound-time'](1709189521) + .withConfirmedRound(36570178n) + .withRoundTime(1709189521) .withSender('M3IAMWFYEIJWLWFIIOEDFOLGIVMEOB3F4I3CA4BIAHJENHUUSX63APOXXM') - ['withPayment-transaction']({ - amount: 236070000, + .withPaymentTransaction({ + amount: 236070000n, receiver: 'KIZLH4HUM5ZIB5RVP6DR2IGXB44TGJ6HZUZIAYZFZ63KWCAQB2EZGPU5BQ', - 'close-amount': 345071234, - 'close-remainder-to': 'AIZLH4HUM5ZIB5RVP6DR2IGXB44TGJ6HZUZIAYZFZ63KWCAQB2EZGPU5BQ', + closeAmount: 345071234n, + closeRemainderTo: 'AIZLH4HUM5ZIB5RVP6DR2IGXB44TGJ6HZUZIAYZFZ63KWCAQB2EZGPU5BQ', }) - .withFee(1000) + .withFee(1000n) .build() it('should be rendered with the correct data', () => { @@ -183,7 +193,7 @@ describe('transaction-page', () => { { term: transactionBlockLabel, description: '36570178' }, { term: transactionFeeLabel, description: '0.001' }, { term: transactionSenderLabel, description: transaction.sender }, - { term: transactionReceiverLabel, description: transaction['payment-transaction']!.receiver }, + { term: transactionReceiverLabel, description: transaction.paymentTransaction!.receiver }, { term: transactionAmountLabel, description: '236.07' }, { term: transactionCloseRemainderToLabel, description: 'AIZLH4HUM5ZIB5RVP6DR2IGXB44TGJ6HZUZIAYZFZ63KWCAQB2EZGPU5BQ' }, { term: transactionCloseRemainderAmountLabel, description: '345.071234' }, @@ -283,14 +293,16 @@ describe('transaction-page', () => { const base64Tab = component.getByRole('tabpanel', { name: base64ProgramTabLabel }) expect(base64Tab.getAttribute('data-state'), 'Base64 tab should be active').toBe('active') - expect(base64Tab.textContent).toBe(transaction.signature!.logicsig!.logic) + expect(base64Tab.textContent).toBe(uint8ArrayToBase64(transaction.signature!.logicsig!.logic)) } ) }) it('should show the logicsig teal when activated', () => { const teal = '\n#pragma version 8\nint 1\nreturn\n' - vi.mocked(algod.disassemble('').do).mockImplementation(() => Promise.resolve({ result: teal })) + vi.mocked(algod.disassemble('').do).mockImplementation(() => + Promise.resolve(new algosdk.modelsv2.DisassembleResponse({ result: teal })) + ) const myStore = createStore() myStore.set(transactionResultsAtom, new Map([[transaction.id, createReadOnlyAtomAndTimestamp(transaction)]])) @@ -300,11 +312,13 @@ describe('transaction-page', () => { return render(, undefined, myStore) }, async (component, user) => { - await waitFor(async () => { + const logicsigTabList = await waitFor(async () => { const logicsigTabList = component.getByRole('tablist', { name: logicsigLabel }) expect(logicsigTabList).toBeTruthy() - await user.click(getByRole(logicsigTabList, 'tab', { name: tealProgramTabLabel })) + return logicsigTabList }) + await user.click(getByRole(logicsigTabList, 'tab', { name: tealProgramTabLabel })) + const tealTab = component.getByRole('tabpanel', { name: tealProgramTabLabel }) await waitFor(() => expect(tealTab.getAttribute('data-state'), 'Teal tab should be active').toBe('active')) expect(tealTab.textContent).toBe(teal) @@ -319,7 +333,7 @@ describe('transaction-page', () => { describe('and the note is text', () => { const note = 'Здравейте, world!' const base64Note = Buffer.from(note).toString('base64') - const transaction = transactionBuilder.withNote(base64Note).build() + const transaction = transactionBuilder.withNote(Buffer.from(note)).build() const myStore = createStore() myStore.set(transactionResultsAtom, new Map([[transaction.id, createReadOnlyAtomAndTimestamp(transaction)]])) @@ -352,11 +366,13 @@ describe('transaction-page', () => { return render(, undefined, myStore) }, async (component, user) => { - await waitFor(async () => { + const noteTabList = await waitFor(async () => { const noteTabList = component.getByRole('tablist', { name: noteLabel }) expect(noteTabList).toBeTruthy() - await user.click(getByRole(noteTabList, 'tab', { name: textNoteTabLabel })) + return noteTabList }) + await user.click(getByRole(noteTabList, 'tab', { name: textNoteTabLabel })) + const textTab = component.getByRole('tabpanel', { name: textNoteTabLabel }) await waitFor(() => expect(textTab.getAttribute('data-state'), 'UTF-8 tab should be active').toBe('active')) expect(textTab.textContent).toBe(note) @@ -369,7 +385,7 @@ describe('transaction-page', () => { const jsonNote = { hello: 'world' } const note = JSON.stringify(jsonNote) const base64Note = Buffer.from(note).toString('base64') - const transaction = transactionBuilder.withNote(base64Note).build() + const transaction = transactionBuilder.withNote(Buffer.from(note)).build() const myStore = createStore() myStore.set(transactionResultsAtom, new Map([[transaction.id, createReadOnlyAtomAndTimestamp(transaction)]])) @@ -402,11 +418,13 @@ describe('transaction-page', () => { return render(, undefined, myStore) }, async (component, user) => { - await waitFor(async () => { + const noteTabList = await waitFor(async () => { const noteTabList = component.getByRole('tablist', { name: noteLabel }) expect(noteTabList).toBeTruthy() - await user.click(getByRole(noteTabList, 'tab', { name: base64NoteTabLabel })) + return noteTabList }) + await user.click(getByRole(noteTabList, 'tab', { name: base64NoteTabLabel })) + const base64Tab = component.getByRole('tabpanel', { name: base64NoteTabLabel }) await waitFor(() => expect(base64Tab.getAttribute('data-state'), 'Base64 tab should be active').toBe('active')) expect(base64Tab.textContent).toBe(base64Note) @@ -420,11 +438,13 @@ describe('transaction-page', () => { return render(, undefined, myStore) }, async (component, user) => { - await waitFor(async () => { + const noteTabList = await waitFor(async () => { const noteTabList = component.getByRole('tablist', { name: noteLabel }) expect(noteTabList).toBeTruthy() - await user.click(getByRole(noteTabList, 'tab', { name: textNoteTabLabel })) + return noteTabList }) + await user.click(getByRole(noteTabList, 'tab', { name: textNoteTabLabel })) + const textTab = component.getByRole('tabpanel', { name: textNoteTabLabel }) await waitFor(() => expect(textTab.getAttribute('data-state'), 'UTF-8 tab should be active').toBe('active')) expect(textTab.textContent).toBe(note) @@ -435,7 +455,7 @@ describe('transaction-page', () => { describe('and the note is arc-2 formatted', () => { const note = 'algoCityTemp:j{"city":"Singapore","temp":35}' - const base64Note = Buffer.from(note).toString('base64') + const base64Note = Buffer.from(note) const transaction = transactionBuilder.withNote(base64Note).build() const myStore = createStore() myStore.set(transactionResultsAtom, new Map([[transaction.id, createReadOnlyAtomAndTimestamp(transaction)]])) @@ -471,14 +491,16 @@ describe('transaction-page', () => { return render(, undefined, myStore) }, async (component, user) => { - await waitFor(async () => { + const noteTabList = await waitFor(async () => { const noteTabList = component.getByRole('tablist', { name: noteLabel }) expect(noteTabList).toBeTruthy() - await user.click(getByRole(noteTabList, 'tab', { name: base64NoteTabLabel })) + return noteTabList }) + await user.click(getByRole(noteTabList, 'tab', { name: base64NoteTabLabel })) + const base64Tab = component.getByRole('tabpanel', { name: base64NoteTabLabel }) await waitFor(() => expect(base64Tab.getAttribute('data-state'), 'Base64 tab should be active').toBe('active')) - expect(base64Tab.textContent).toBe(base64Note) + expect(base64Tab.textContent).toBe(uint8ArrayToBase64(base64Note)) } ) }) @@ -489,11 +511,13 @@ describe('transaction-page', () => { return render(, undefined, myStore) }, async (component, user) => { - await waitFor(async () => { + const noteTabList = await waitFor(async () => { const noteTabList = component.getByRole('tablist', { name: noteLabel }) expect(noteTabList).toBeTruthy() - await user.click(getByRole(noteTabList, 'tab', { name: textNoteTabLabel })) + return noteTabList }) + await user.click(getByRole(noteTabList, 'tab', { name: textNoteTabLabel })) + const textTab = component.getByRole('tabpanel', { name: textNoteTabLabel }) await waitFor(() => expect(textTab.getAttribute('data-state'), 'UTF-8 tab should be active').toBe('active')) expect(textTab.textContent).toBe(note) @@ -919,7 +943,7 @@ describe('transaction-page', () => { describe('when rendering an app call transaction that has no foreign assets but has an inner asset transfer transaction', () => { const asset = assetResultMother['mainnet-312769']().build() const innerAssetTransferTransaction = transactionResultMother.transfer(asset).build() - const transaction = transactionResultMother.appCall()['withInner-txns']([innerAssetTransferTransaction]).build() + const transaction = transactionResultMother.appCall().withInnerTxns([innerAssetTransferTransaction]).build() it('should be rendered without error', () => { vi.mocked(useParams).mockImplementation(() => ({ transactionId: transaction.id })) @@ -1119,6 +1143,7 @@ describe('transaction-page', () => { // After click on the Table tab await user.click(getByRole(viewTransactionTabList, 'tab', { name: transactionVisualTableTabLabel })) + const tableViewTab = component.getByRole('tabpanel', { name: transactionVisualTableTabLabel }) await waitFor(() => expect(tableViewTab.getAttribute('data-state'), 'Table tab should be active').toBe('active')) @@ -1136,12 +1161,7 @@ describe('transaction-page', () => { }) describe('when rendering a state proof transaction', () => { - const transaction = transactionResultMother - .stateProof() - ['withRound-time'](1696316292) - ['withConfirmed-round'](32563331) - .withFee(0) - .build() + const transaction = transactionResultMother.stateProof().withRoundTime(1696316292).withConfirmedRound(32563331n).withFee(0n).build() it('should be rendered correctly', () => { vi.mocked(useParams).mockImplementation(() => ({ transactionId: transaction.id })) @@ -1279,7 +1299,7 @@ describe('when rendering an app call transaction with ARC-32 app spec loaded', ( myStore.set(genesisHashAtom, 'some-hash') myStore.set(transactionResultsAtom, new Map([[transaction.id, createReadOnlyAtomAndTimestamp(transaction)]])) - const applicationId = transaction['application-transaction']!['application-id']! + const applicationId = transaction.applicationTransaction!.applicationId! const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { applicationId: applicationId, @@ -1324,7 +1344,7 @@ describe('when rendering an app call transaction with ARC-4 app spec loaded', () myStore.set(genesisHashAtom, 'some-hash') myStore.set(transactionResultsAtom, new Map([[transaction.id, createReadOnlyAtomAndTimestamp(transaction)]])) - const applicationId = transaction['application-transaction']!['application-id']! + const applicationId = transaction.applicationTransaction!.applicationId! const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { applicationId: applicationId, @@ -1368,7 +1388,7 @@ describe('when rendering an app call transaction with ARC-56 app spec loaded', ( myStore.set(genesisHashAtom, 'some-hash') myStore.set(transactionResultsAtom, new Map([[transaction.id, createReadOnlyAtomAndTimestamp(transaction)]])) - const applicationId = transaction['application-transaction']!['application-id']! + const applicationId = transaction.applicationTransaction!.applicationId! const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { applicationId: applicationId, @@ -1421,7 +1441,7 @@ describe('when rendering an app call transaction with ARC-56 app spec loaded', ( myStore.set(genesisHashAtom, 'some-hash') myStore.set(transactionResultsAtom, new Map([[transaction.id, createReadOnlyAtomAndTimestamp(transaction)]])) - const applicationId = transaction['application-transaction']!['application-id']! + const applicationId = transaction.applicationTransaction!.applicationId! const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { applicationId: applicationId, @@ -1474,7 +1494,7 @@ describe('when rendering an app call transaction with ARC-56 app spec loaded', ( myStore.set(genesisHashAtom, 'some-hash') myStore.set(transactionResultsAtom, new Map([[transaction.id, createReadOnlyAtomAndTimestamp(transaction)]])) - const applicationId = transaction['application-transaction']!['application-id']! + const applicationId = transaction.applicationTransaction!.applicationId! const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { applicationId: applicationId, @@ -1524,7 +1544,7 @@ describe('when rendering an app call transaction with ARC-56 app spec loaded', ( myStore.set(genesisHashAtom, 'some-hash') myStore.set(transactionResultsAtom, new Map([[transaction.id, createReadOnlyAtomAndTimestamp(transaction)]])) - const applicationId = transaction['application-transaction']!['application-id']! + const applicationId = transaction.applicationTransaction!.applicationId! const dbConnection = await myStore.get(dbConnectionAtom) await upsertAppInterface(dbConnection, { applicationId: applicationId, diff --git a/src/features/transactions/utils/flatten-transaction-result.ts b/src/features/transactions/utils/flatten-transaction-result.ts index d99643d96..8b0a9d609 100644 --- a/src/features/transactions/utils/flatten-transaction-result.ts +++ b/src/features/transactions/utils/flatten-transaction-result.ts @@ -1,14 +1,14 @@ -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' import algosdk from 'algosdk' +import { TransactionResult } from '../data/types' export const flattenTransactionResult = (transactionResult: TransactionResult): TransactionResult[] => { const results = [transactionResult] - if (transactionResult['tx-type'] !== algosdk.TransactionType.appl) { + if (transactionResult.txType !== algosdk.TransactionType.appl) { return results } - const innerTransactions = transactionResult['inner-txns'] ?? [] + const innerTransactions = transactionResult.innerTxns ?? [] return results.concat(innerTransactions.flatMap(flattenTransactionResult)) } diff --git a/src/features/transactions/utils/get-asset-ids-for-transaction.ts b/src/features/transactions/utils/get-asset-ids-for-transaction.ts index d21fdc145..dce3f6c54 100644 --- a/src/features/transactions/utils/get-asset-ids-for-transaction.ts +++ b/src/features/transactions/utils/get-asset-ids-for-transaction.ts @@ -1,32 +1,34 @@ import algosdk from 'algosdk' -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' import { invariant } from '@/utils/invariant' import { AssetId } from '@/features/assets/data/types' export const getAssetIdsForTransaction = (transaction: TransactionResult): AssetId[] => { - if (transaction['tx-type'] === algosdk.TransactionType.axfer) { - invariant(transaction['asset-transfer-transaction'], 'asset-transfer-transaction is not set') + if (transaction.txType === algosdk.TransactionType.axfer) { + invariant(transaction.assetTransferTransaction, 'asset-transfer-transaction is not set') - return [transaction['asset-transfer-transaction']['asset-id']] + return [transaction.assetTransferTransaction.assetId] } - if (transaction['tx-type'] === algosdk.TransactionType.appl) { - invariant(transaction['application-transaction'], 'application-transaction is not set') + if (transaction.txType === algosdk.TransactionType.appl) { + invariant(transaction.applicationTransaction, 'application-transaction is not set') - const innerTransactions = transaction['inner-txns'] ?? [] + const innerTransactions = transaction.innerTxns ?? [] return innerTransactions.reduce((acc, innerTxn) => { const innerResult = getAssetIdsForTransaction(innerTxn) return acc.concat(innerResult) - }, [] as number[]) + }, [] as bigint[]) } - if (transaction['tx-type'] === algosdk.TransactionType.acfg) { - invariant(transaction['asset-config-transaction'], 'asset-config-transaction is not set') + if (transaction.txType === algosdk.TransactionType.acfg) { + invariant(transaction.assetConfigTransaction, 'asset-config-transaction is not set') + const assetId = transaction.assetConfigTransaction.assetId ? transaction.assetConfigTransaction.assetId : transaction.createdAssetIndex - return [transaction['asset-config-transaction']['asset-id'] ?? transaction['created-asset-index']] + invariant(assetId != null, 'asset-id is not set') + return [assetId] } - if (transaction['tx-type'] === algosdk.TransactionType.afrz) { - invariant(transaction['asset-freeze-transaction'], 'asset-freeze-transaction is not set') + if (transaction.txType === algosdk.TransactionType.afrz) { + invariant(transaction.assetFreezeTransaction, 'asset-freeze-transaction is not set') - return [transaction['asset-freeze-transaction']['asset-id']] + return [transaction.assetFreezeTransaction.assetId] } return [] diff --git a/src/features/wallet/components/connect-wallet-button.tsx b/src/features/wallet/components/connect-wallet-button.tsx index 25716f312..4d1bd8bab 100644 --- a/src/features/wallet/components/connect-wallet-button.tsx +++ b/src/features/wallet/components/connect-wallet-button.tsx @@ -4,7 +4,7 @@ import { Dialog, DialogContent, DialogHeader, DialogTitle, SmallSizeDialogBody } import { WalletAccount, WalletId, Wallet, useWallet } from '@txnlab/use-wallet-react' import { ellipseAddress } from '@/utils/ellipse-address' import { AccountLink } from '@/features/accounts/components/account-link' -import { CircleMinus, Wallet as WalletIcon } from 'lucide-react' +import { Loader2 as Loader, CircleMinus, Wallet as WalletIcon } from 'lucide-react' import { localnetId, useNetworkConfig } from '@/features/network/data' import { useCallback, useMemo } from 'react' import { Popover, PopoverContent, PopoverTrigger } from '@/features/common/components/popover' @@ -140,7 +140,7 @@ function ConnectedWallet({ activeAddress, activeWalletAccounts, wallets }: Conne const walletsWithLocalPrompt = [WalletId.KMD.toString(), WalletId.MNEMONIC.toString()] export function ConnectWalletButton() { - const { activeAddress, activeWalletAccounts, wallets } = useWallet() + const { activeAddress, activeWalletAccounts, wallets, isReady } = useWallet() const [dialogOpen, setDialogOpen] = useAtom(walletDialogOpenAtom) const networkConfig = useNetworkConfig() const refreshAvailableKmdWallets = useRefreshAvailableKmdWallets() @@ -176,7 +176,14 @@ export function ConnectWalletButton() { [setDialogOpen] ) - if (activeAddress) { + if (!isReady) { + button = ( + + ) + } else if (activeAddress) { button = } else { if (availableWalletIds.includes(WalletId.KMD)) { @@ -187,7 +194,18 @@ export function ConnectWalletButton() { } let walletProviders =

        No wallet providers available

        - if (!activeAddress && availableWallets.length > 0) { + if (!isReady) { + walletProviders = ( + <> + {networkConfig.walletIds.map((walletId) => ( + // Ensures that if the dialog is open and useWallet is reinitialised, the height stays consistent. +
        +   +
        + ))} + + ) + } else if (!activeAddress && availableWallets.length > 0) { walletProviders = ( <> {availableWallets.map((wallet) => diff --git a/src/features/wallet/data/active-wallet.ts b/src/features/wallet/data/active-wallet.ts index 44802c9ea..6aa4a56c6 100644 --- a/src/features/wallet/data/active-wallet.ts +++ b/src/features/wallet/data/active-wallet.ts @@ -17,12 +17,14 @@ export const activeWalletAccountAtom = atomWithRefresh { +export const useSetActiveWalletState = (isReady: boolean, activeAddress: string | undefined, signer: algosdk.TransactionSigner) => { const setActiveWalletAddress = useSetAtom(activeWalletAddressAtom) useEffect(() => { - setActiveWalletAddress(activeAddress) - algorandClient.setDefaultSigner(signer) - }, [setActiveWalletAddress, activeAddress, signer]) + if (isReady) { + setActiveWalletAddress(activeAddress) + algorandClient.setDefaultSigner(signer) + } + }, [setActiveWalletAddress, activeAddress, signer, isReady]) } const getActiveWalletAccount = async (address: string) => { @@ -31,14 +33,12 @@ const getActiveWalletAccount = async (address: string) => { return { address: address, - // In algosdk, the asset ID has type bigint | number - // but in lora, we use number only - assetHolding: new Map(assetHolding.map((asset) => [Number(asset.assetId), { amount: asset.amount }])), + assetHolding: new Map(assetHolding.map((asset) => [asset.assetId, { amount: asset.amount }])), algoHolding: { amount: accountInformation.balance.microAlgo, }, - minBalance: Number(accountInformation.minBalance.microAlgo), - validAtRound: Number(accountInformation.validAsOfRound), + minBalance: accountInformation.minBalance.microAlgo, + validAtRound: accountInformation.validAsOfRound, } satisfies Omit } diff --git a/src/features/wallet/types/active-wallet.ts b/src/features/wallet/types/active-wallet.ts index 0f08880e8..feb794a8b 100644 --- a/src/features/wallet/types/active-wallet.ts +++ b/src/features/wallet/types/active-wallet.ts @@ -6,11 +6,11 @@ export type ActiveWalletAccount = { address: Address assetHolding: Map algoHolding: AccountAssetHolding - minBalance: number - validAtRound: number + minBalance: bigint + validAtRound: bigint nfd: Nfd | null } type AccountAssetHolding = { - amount: number | bigint + amount: bigint } diff --git a/src/tests/builders/account-result-builder.ts b/src/tests/builders/account-result-builder.ts index 01b8ea6e8..cdfdc4d46 100644 --- a/src/tests/builders/account-result-builder.ts +++ b/src/tests/builders/account-result-builder.ts @@ -1,4 +1,5 @@ import { AccountResult } from '@/features/accounts/data/types' +import { randomBigInt } from '@/tests/utils/random-bigint' import { AccountStatus } from '@algorandfoundation/algokit-utils/types/indexer' import { DataBuilder, dossierProxy, randomNumber, randomString } from '@makerx/ts-dossier' @@ -9,23 +10,23 @@ export class AccountResultBuilder extends DataBuilder { ? initialState : { address: randomString(52, 52), - amount: randomNumber(), - 'amount-without-pending-rewards': randomNumber(), - 'apps-local-state': [], - 'apps-total-schema': { 'num-byte-slice': 0, 'num-uint': 0 }, + amount: randomBigInt(), + amountWithoutPendingRewards: randomBigInt(), + appsLocalState: [], + appsTotalSchema: { numByteSlice: 0, numUint: 0 }, assets: [], - 'created-apps': [], - 'created-assets': [], - 'min-balance': randomNumber(), - 'pending-rewards': randomNumber(), - 'reward-base': randomNumber(), - rewards: randomNumber(), - round: 38851889, + createdApps: [], + createdAssets: [], + minBalance: randomBigInt(), + pendingRewards: randomBigInt(), + rewardBase: randomBigInt(), + rewards: randomBigInt(), + round: 38851889n, status: AccountStatus.Online, - 'total-apps-opted-in': randomNumber(), - 'total-assets-opted-in': randomNumber(), - 'total-created-apps': randomNumber(), - 'total-created-assets': randomNumber(), + totalAppsOptedIn: randomNumber(), + totalAssetsOptedIn: randomNumber(), + totalCreatedApps: randomNumber(), + totalCreatedAssets: randomNumber(), } ) } diff --git a/src/tests/builders/application-result-builder.ts b/src/tests/builders/application-result-builder.ts index 7cba3a54a..2d3779b78 100644 --- a/src/tests/builders/application-result-builder.ts +++ b/src/tests/builders/application-result-builder.ts @@ -1,5 +1,7 @@ import { ApplicationResult } from '@/features/applications/data/types' -import { DataBuilder, dossierProxy, randomNumber, randomString } from '@makerx/ts-dossier' +import { randomBigInt } from '@/tests/utils/random-bigint' +import { DataBuilder, dossierProxy, randomString } from '@makerx/ts-dossier' +import algosdk, { base64ToBytes } from 'algosdk' export class ApplicationResultBuilder extends DataBuilder { constructor(initialState?: ApplicationResult) { @@ -7,12 +9,12 @@ export class ApplicationResultBuilder extends DataBuilder { initialState ? initialState : { - id: randomNumber(), + id: randomBigInt(), params: { - creator: randomString(52, 52), - 'approval-program': randomString(10, 100), - 'clear-state-program': randomString(10, 100), - 'global-state': [], + creator: algosdk.Address.zeroAddress(), + approvalProgram: base64ToBytes(randomString(10, 100)), + clearStateProgram: base64ToBytes(randomString(10, 100)), + globalState: [], }, } ) diff --git a/src/tests/builders/asset-result-builder.ts b/src/tests/builders/asset-result-builder.ts index 2d8a4d775..c896b342a 100644 --- a/src/tests/builders/asset-result-builder.ts +++ b/src/tests/builders/asset-result-builder.ts @@ -1,4 +1,5 @@ -import { AssetResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { AssetResult } from '@/features/assets/data/types' +import { randomBigInt } from '@/tests/utils/random-bigint' import { DataBuilder, dossierProxy, randomNumber, randomString } from '@makerx/ts-dossier' export class AssetResultBuilder extends DataBuilder { @@ -7,10 +8,10 @@ export class AssetResultBuilder extends DataBuilder { initialState ? initialState : { - index: randomNumber(), + index: randomBigInt(), params: { creator: randomString(52, 52), - total: randomNumber(), + total: randomBigInt(), decimals: randomNumber(), }, } diff --git a/src/tests/builders/block-result-builder.ts b/src/tests/builders/block-result-builder.ts index 290c1683f..a0ff40304 100644 --- a/src/tests/builders/block-result-builder.ts +++ b/src/tests/builders/block-result-builder.ts @@ -1,5 +1,7 @@ import { BlockResult } from '@/features/blocks/data/types' +import { base64ToBytes } from '@/utils/base64-to-bytes' import { DataBuilder, dossierProxy, incrementedNumber, randomDate, randomNumberBetween, randomString } from '@makerx/ts-dossier' +import { randomBigIntBetween } from '../utils/random-bigint' export class BlockResultBuilder extends DataBuilder { constructor(initialState?: BlockResult) { @@ -7,30 +9,30 @@ export class BlockResultBuilder extends DataBuilder { initialState ? initialState : { - round: incrementedNumber('round'), + round: BigInt(incrementedNumber('round')), timestamp: randomDate().getTime(), transactionIds: Array.from({ length: randomNumberBetween(1, 1000) }, () => randomString(52, 52)), - seed: randomString(64, 64), - ['genesis-hash']: randomString(64, 64), - ['genesis-id']: randomString(64, 64), - ['previous-block-hash']: randomString(64, 64), - ['txn-counter']: randomNumberBetween(1, 1000), - ['transactions-root']: randomString(64, 64), - ['transactions-root-sha256']: randomString(64, 64), + seed: base64ToBytes(randomString(64, 64)), + genesisHash: base64ToBytes(randomString(64, 64)), + genesisId: randomString(64, 64), + previousBlockHash: base64ToBytes(randomString(64, 64)), + txnCounter: randomBigIntBetween(1n, 1000n), + transactionsRoot: base64ToBytes(randomString(64, 64)), + transactionsRootSha256: base64ToBytes(randomString(64, 64)), rewards: { - ['fee-sink']: randomString(64, 64), - ['rewards-level']: randomNumberBetween(1, 1000), - ['rewards-calculation-round']: randomNumberBetween(1, 1000), - ['rewards-pool']: randomString(64, 64), - ['rewards-residue']: randomNumberBetween(1, 1000), - ['rewards-rate']: randomNumberBetween(1, 1000), + feeSink: randomString(64, 64), + rewardsLevel: randomBigIntBetween(1n, 1000n), + rewardsCalculationRound: randomBigIntBetween(1n, 1000n), + rewardsPool: randomString(64, 64), + rewardsResidue: randomBigIntBetween(1n, 1000n), + rewardsRate: randomBigIntBetween(1n, 1000n), }, - ['upgrade-state']: { - ['current-protocol']: randomString(64, 64), - ['next-protocol']: randomString(64, 64), - ['next-protocol-approvals']: randomNumberBetween(1, 1000), - ['next-protocol-vote-before']: randomNumberBetween(1, 1000), - ['next-protocol-switch-on']: randomNumberBetween(1, 1000), + upgradeState: { + currentProtocol: randomString(64, 64), + nextProtocol: randomString(64, 64), + nextProtocolApprovals: randomBigIntBetween(1n, 1000n), + nextProtocolVoteBefore: randomBigIntBetween(1n, 1000n), + nextProtocolSwitchOn: randomBigIntBetween(1n, 1000n), }, proposer: randomString(52, 52), } diff --git a/src/tests/builders/group-result-builder.ts b/src/tests/builders/group-result-builder.ts index ea8fb5e55..d0f0f2a15 100644 --- a/src/tests/builders/group-result-builder.ts +++ b/src/tests/builders/group-result-builder.ts @@ -8,7 +8,7 @@ export class GroupResultBuilder extends DataBuilder { ? initialState : { id: randomString(45, 45), - round: incrementedNumber('round'), + round: BigInt(incrementedNumber('round')), timestamp: randomDate().toISOString(), transactionIds: Array.from({ length: randomNumberBetween(1, 1000) }, () => randomString(52, 52)), } diff --git a/src/tests/builders/transaction-result-builder.ts b/src/tests/builders/transaction-result-builder.ts index 894ccc74f..285bda659 100644 --- a/src/tests/builders/transaction-result-builder.ts +++ b/src/tests/builders/transaction-result-builder.ts @@ -1,19 +1,9 @@ -import { - DataBuilder, - dossierProxy, - randomElement, - randomNumber, - randomString, - randomDateBetween, - randomNumberBetween, -} from '@makerx/ts-dossier' -import { - ApplicationTransactionResult, - AssetResult, - StateProofTransactionResult, - TransactionResult, -} from '@algorandfoundation/algokit-utils/types/indexer' -import algosdk from 'algosdk' +import { DataBuilder, dossierProxy, randomElement, randomString, randomDateBetween } from '@makerx/ts-dossier' +import algosdk, { base64ToBytes } from 'algosdk' +import { TransactionResult } from '@/features/transactions/data/types' +import { randomBigInt, randomBigIntBetween } from '@/tests/utils/random-bigint' +import { AssetResult } from '@/features/assets/data/types' +import { utf8ToUint8Array } from '@/utils/utf8-to-uint8-array' export class TransactionResultBuilder extends DataBuilder { constructor(initialState?: TransactionResult) { @@ -23,64 +13,65 @@ export class TransactionResultBuilder extends DataBuilder { ? initialState : { id: randomString(52, 52).toUpperCase(), - 'tx-type': randomElement(Object.values(algosdk.TransactionType)), - 'last-valid': randomNumber(), - 'first-valid': randomNumber(), - fee: randomNumberBetween(1_000, 100_000), + txType: randomElement(Object.values(algosdk.TransactionType)), + lastValid: randomBigInt(), + firstValid: randomBigInt(), + fee: randomBigIntBetween(1_000n, 100_000n), sender: randomString(52, 52), - 'confirmed-round': randomNumber(), - 'round-time': Math.floor(randomDateBetween(new Date(now.getTime() - 123456789), now).getTime() / 1000), - signature: { - sig: randomString(88, 88), - }, + confirmedRound: randomBigInt(), + roundTime: Math.floor(randomDateBetween(new Date(now.getTime() - 123456789), now).getTime() / 1000), + signature: new algosdk.indexerModels.TransactionSignature({ + sig: utf8ToUint8Array(randomString(88, 88)), + }), } ) } public paymentTransaction() { - this.thing['tx-type'] = algosdk.TransactionType.pay - this.thing['payment-transaction'] = { - amount: randomNumberBetween(10_000, 23_6070_000), + this.thing.txType = algosdk.TransactionType.pay + this.thing.paymentTransaction = new algosdk.indexerModels.TransactionPayment({ + amount: randomBigIntBetween(10_000n, 23_6070_000n), receiver: randomString(52, 52), - } + }) return this } public transferTransaction(asset: AssetResult) { - this.thing['tx-type'] = algosdk.TransactionType.axfer - this.thing['asset-transfer-transaction'] = { - amount: randomNumberBetween(10_000, 23_6070_000), - 'asset-id': asset.index, - 'close-amount': 0, + this.thing.txType = algosdk.TransactionType.axfer + this.thing.assetTransferTransaction = new algosdk.indexerModels.TransactionAssetTransfer({ + amount: randomBigIntBetween(10_000n, 23_6070_000n), + assetId: asset.index, + closeAmount: 0n, receiver: randomString(52, 52), - } + }) return this } public appCallTransaction() { - this.thing['tx-type'] = algosdk.TransactionType.appl - this.thing['application-transaction'] = { - 'application-id': randomNumber(), - } as ApplicationTransactionResult + this.thing.txType = algosdk.TransactionType.appl + this.thing.applicationTransaction = new algosdk.indexerModels.TransactionApplication({ + applicationId: randomBigInt(), + onCompletion: 'noop', + }) return this } public stateProofTransaction() { - this.thing['tx-type'] = algosdk.TransactionType.stpf + this.thing.txType = algosdk.TransactionType.stpf // HACK: do this because the type StateProofTransactionResult is very big - this.thing['state-proof-transaction'] = {} as StateProofTransactionResult + this.thing.stateProofTransaction = {} as TransactionResult['stateProofTransaction'] return this } public heartbeatTransaction() { - this.thing['tx-type'] = algosdk.TransactionType.hb - this.thing['heartbeat-transaction'] = { - 'hb-address': randomString(52, 52), - 'hb-key-dilution': randomNumberBetween(1000, 10000), - 'hb-proof': {}, - 'hb-seed': randomString(52, 52), - 'hb-vote-id': randomString(52, 52), - } + this.thing.txType = algosdk.TransactionType.hb + this.thing.heartbeatTransaction = new algosdk.indexerModels.TransactionHeartbeat({ + hbAddress: randomString(52, 52), + hbKeyDilution: randomBigIntBetween(1000n, 10000n), + hbProof: new algosdk.indexerModels.HbProofFields({}), + hbSeed: base64ToBytes(randomString(52, 52)), + hbVoteId: base64ToBytes(randomString(52, 52)), + }) return this } } diff --git a/src/tests/object-mother/account-result.ts b/src/tests/object-mother/account-result.ts index 7c79dddaa..7efbece28 100644 --- a/src/tests/object-mother/account-result.ts +++ b/src/tests/object-mother/account-result.ts @@ -1,6 +1,7 @@ import { AccountResult } from '@/features/accounts/data/types' import { AccountResultBuilder } from '../builders/account-result-builder' import { AccountStatus } from '@algorandfoundation/algokit-utils/types/indexer' +import algosdk, { base64ToBytes } from 'algosdk' const encoder = new TextEncoder() @@ -8,300 +9,304 @@ export const accountResultMother = { ['mainnet-BIQXAK67KSCKN3EJXT4S3RVXUBFOLZ45IQOBTSOQWOSR4LLULBTD54S5IA']: () => { return new AccountResultBuilder({ address: 'BIQXAK67KSCKN3EJXT4S3RVXUBFOLZ45IQOBTSOQWOSR4LLULBTD54S5IA', - amount: 5883741, - 'amount-without-pending-rewards': 5883741, - 'apps-local-state': [ + amount: 5883741n, + amountWithoutPendingRewards: 5883741n, + appsLocalState: [ { - id: 1209868169, - schema: { 'num-byte-slice': 1, 'num-uint': 0 }, + id: 1209868169n, + schema: { numByteSlice: 1, numUint: 0 }, }, { - id: 1210178396, - schema: { 'num-byte-slice': 1, 'num-uint': 0 }, + id: 1210178396n, + schema: { numByteSlice: 1, numUint: 0 }, }, ], - 'apps-total-schema': { 'num-byte-slice': 2, 'num-uint': 0 }, + appsTotalSchema: { numByteSlice: 2, numUint: 0 }, assets: [ - { amount: 2002560000, 'asset-id': 924268058, 'is-frozen': false }, - { amount: 0, 'asset-id': 1010208883, 'is-frozen': false }, - { amount: 0, 'asset-id': 1096015467, 'is-frozen': false }, + { amount: 2002560000n, assetId: 924268058n, isFrozen: false }, + { amount: 0n, assetId: 1010208883n, isFrozen: false }, + { amount: 0n, assetId: 1096015467n, isFrozen: false }, ], - 'created-apps': [], - 'created-assets': [], - 'min-balance': 700000, - 'pending-rewards': 0, - 'reward-base': 218288, - rewards: 0, - round: 38880589, + createdApps: [], + createdAssets: [], + minBalance: 700000n, + pendingRewards: 0n, + rewardBase: 218288n, + rewards: 0n, + round: 38880589n, status: AccountStatus.Offline, - 'total-apps-opted-in': 2, - 'total-assets-opted-in': 3, - 'total-created-apps': 0, - 'total-created-assets': 0, + totalAppsOptedIn: 2, + totalAssetsOptedIn: 3, + totalCreatedApps: 0, + totalCreatedAssets: 0, } satisfies AccountResult) }, ['mainnet-ORANGESCU7XMR2TFXSFTOHCUHNP6OYEPIKZW3JZANTCDHVQYMGQFYFIDDA']: () => { return new AccountResultBuilder({ address: 'ORANGESCU7XMR2TFXSFTOHCUHNP6OYEPIKZW3JZANTCDHVQYMGQFYFIDDA', - amount: 123714752, - 'amount-without-pending-rewards': 123714752, - 'apps-local-state': [ + amount: 123714752n, + amountWithoutPendingRewards: 123714752n, + appsLocalState: [ { - id: 1284326447, - 'key-value': [], + id: 1284326447n, + keyValue: [], schema: { - 'num-byte-slice': 0, - 'num-uint': 1, + numByteSlice: 0, + numUint: 1, }, }, ], - 'apps-total-extra-pages': 3, - 'apps-total-schema': { - 'num-byte-slice': 38, - 'num-uint': 66, + appsTotalExtraPages: 3, + appsTotalSchema: { + numByteSlice: 38, + numUint: 66, }, assets: [ - { amount: 1, 'asset-id': 1162292622, 'is-frozen': true }, - { amount: 0, 'asset-id': 1284444444, 'is-frozen': false }, - { amount: 1228320, 'asset-id': 1294765516, 'is-frozen': false }, - { amount: 3, 'asset-id': 1336655079, 'is-frozen': false }, - { amount: 1, 'asset-id': 1355858325, 'is-frozen': true }, - { amount: 1, 'asset-id': 1355898842, 'is-frozen': true }, + { amount: 1n, assetId: 1162292622n, isFrozen: true }, + { amount: 0n, assetId: 1284444444n, isFrozen: false }, + { amount: 1228320n, assetId: 1294765516n, isFrozen: false }, + { amount: 3n, assetId: 1336655079n, isFrozen: false }, + { amount: 1n, assetId: 1355858325n, isFrozen: true }, + { amount: 1n, assetId: 1355898842n, isFrozen: true }, ], - 'created-apps': [ + createdApps: [ { - id: 1276197345, + id: 1276197345n, params: { - 'approval-program': - 'CSAFAAGAgNGUtXQGAiYODmhhbHZpbmdfc3VwcGx5BmVmZm9ydApsYXN0X21pbmVyFGN1cnJlbnRfbWluZXJfZWZmb3J0DG1pbmVyX3Jld2FyZAV0b2tlbgdoYWx2aW5nDG1pbmVkX3N1cHBseRFsYXN0X21pbmVyX2VmZm9ydA1jdXJyZW50X21pbmVyBWJsb2NrDHRvdGFsX2VmZm9ydBJ0b3RhbF90cmFuc2FjdGlvbnMPc3RhcnRfdGltZXN0YW1wMRgiDSULMRkIjQgCBgInAAAAAAAAAAACGQIoAIgAAiNDigAAJwUiZycKImcnCyJnJwwiZycGImcogYDAqMqaOmcnByJnJwSBgICAAmcqMgNnJwgiZycJMgNnKyJnJw2BgIHIrAZniYoAACcFsYEDshCABk9yYW5nZbImgANPUkGyJTIKsikyA7IqMgOyKzIDsiwksiIlsiOAFGh0dHBzOi8vb3Jhbmdlcy5tZW1lsicisgGztDxniYgAAiNDigAAJwVkIhJBAAOI/5wxACkiZomKAwAnBmSBDxJBABMrImcnBCJngAhHb29kYnllLrCJMgYyBoEFGAmM/ycKZIv/E0EAuipkJwVkcABMSEEAbihkJwRkDUEABicEZEIAAihkjP6xgQSyECcFZLIRKmSyFIv+shIisgGzJwcnB2SL/ghnKChki/4JZyhkIhJBAC4nBicGZCMIZycGZIEOEkEACigkJwdkCWdCABMoJCcHZAkhBApnJwQnBGQhBApnKmQ2MgBhQQAdKmQpYoz9KmQpi/0nCGQNQQAJi/0nCGQJQgABImYnCWQrZBZQsCcKi/9nKicJZGcnCCtkZysiZ4k2GgFJFYEgEkSIAAIjQ4oBAIv/NjIAKWNMSEQyBycNZA9EMQGBoJwBDkSAAEcCiP7iJwsnC2QxAQhnJwwnDGQjCGeL/ymL/yliMQEIZov/KWIrZA1BAAsnCYv/ZyuL/yliZ4kxG0H99oAEuER7NjYaAI4B/ekAgASrI3DMNhoAjgH/fQAAMRtB/nAA', - 'clear-state-program': 'CQ==', - creator: 'ORANGESCU7XMR2TFXSFTOHCUHNP6OYEPIKZW3JZANTCDHVQYMGQFYFIDDA', - 'global-state': [], - 'global-state-schema': { - 'num-byte-slice': 2, - 'num-uint': 11, + approvalProgram: base64ToBytes( + 'CSAFAAGAgNGUtXQGAiYODmhhbHZpbmdfc3VwcGx5BmVmZm9ydApsYXN0X21pbmVyFGN1cnJlbnRfbWluZXJfZWZmb3J0DG1pbmVyX3Jld2FyZAV0b2tlbgdoYWx2aW5nDG1pbmVkX3N1cHBseRFsYXN0X21pbmVyX2VmZm9ydA1jdXJyZW50X21pbmVyBWJsb2NrDHRvdGFsX2VmZm9ydBJ0b3RhbF90cmFuc2FjdGlvbnMPc3RhcnRfdGltZXN0YW1wMRgiDSULMRkIjQgCBgInAAAAAAAAAAACGQIoAIgAAiNDigAAJwUiZycKImcnCyJnJwwiZycGImcogYDAqMqaOmcnByJnJwSBgICAAmcqMgNnJwgiZycJMgNnKyJnJw2BgIHIrAZniYoAACcFsYEDshCABk9yYW5nZbImgANPUkGyJTIKsikyA7IqMgOyKzIDsiwksiIlsiOAFGh0dHBzOi8vb3Jhbmdlcy5tZW1lsicisgGztDxniYgAAiNDigAAJwVkIhJBAAOI/5wxACkiZomKAwAnBmSBDxJBABMrImcnBCJngAhHb29kYnllLrCJMgYyBoEFGAmM/ycKZIv/E0EAuipkJwVkcABMSEEAbihkJwRkDUEABicEZEIAAihkjP6xgQSyECcFZLIRKmSyFIv+shIisgGzJwcnB2SL/ghnKChki/4JZyhkIhJBAC4nBicGZCMIZycGZIEOEkEACigkJwdkCWdCABMoJCcHZAkhBApnJwQnBGQhBApnKmQ2MgBhQQAdKmQpYoz9KmQpi/0nCGQNQQAJi/0nCGQJQgABImYnCWQrZBZQsCcKi/9nKicJZGcnCCtkZysiZ4k2GgFJFYEgEkSIAAIjQ4oBAIv/NjIAKWNMSEQyBycNZA9EMQGBoJwBDkSAAEcCiP7iJwsnC2QxAQhnJwwnDGQjCGeL/ymL/yliMQEIZov/KWIrZA1BAAsnCYv/ZyuL/yliZ4kxG0H99oAEuER7NjYaAI4B/ekAgASrI3DMNhoAjgH/fQAAMRtB/nAA' + ), + clearStateProgram: base64ToBytes('CQ=='), + creator: algosdk.Address.fromString('ORANGESCU7XMR2TFXSFTOHCUHNP6OYEPIKZW3JZANTCDHVQYMGQFYFIDDA'), + globalState: [], + globalStateSchema: { + numByteSlice: 2, + numUint: 11, }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 1, + localStateSchema: { + numByteSlice: 0, + numUint: 1, }, }, }, { - id: 1276914366, + id: 1276914366n, params: { - 'approval-program': - 'CSAFAAGAgNGUtXQGAiYPDmhhbHZpbmdfc3VwcGx5Cmxhc3RfbWluZXIUY3VycmVudF9taW5lcl9lZmZvcnQMbWluZXJfcmV3YXJkEWxhc3RfbWluZXJfZWZmb3J0BmVmZm9ydAV0b2tlbgdoYWx2aW5nDG1pbmVkX3N1cHBseQ1jdXJyZW50X21pbmVyBWJsb2NrDHRvdGFsX2VmZm9ydBJ0b3RhbF90cmFuc2FjdGlvbnMPc3RhcnRfdGltZXN0YW1wADEYIg0lCzEZCI0IAioCSwAAAAAAAAAAAj0CTACIAAIjQ4oAACcGImcnCiJnJwsiZycMImcnByJnKIGAwKjKmjpnJwgiZyuBgICAAmcpMgNnJwQiZycJMgNnKiJnJw2BgIHIrAZniYoAACcGsYEDshCABk9yYW5nZbImgANPUkGyJTIKsikyA7IqMgOyKzIDsiwksiIlsiOAFGh0dHBzOi8vb3Jhbmdlcy5tZW1lsicisgGztDxniYgAAiNDigAAJwZkIhJBAAOI/5wxACcFImaJigMAJwdkgQ8SQQASKiJnKyJngAhHb29kYnllLrCJMgYyBoEFGAmM/ycKZIv/E0EAuClkJwZkcABMSEEAaihkK2QNQQAFK2RCAAIoZIz+sYEEshAnBmSyESlkshSL/rISIrIBsycIJwhki/4IZygoZIv+CWcoZCISQQAsJwcnB2QjCGcnB2SBDhJBAAooJCcIZAlnQgARKCQnCGQJIQQKZysrZCEECmcpZDYyAGFBAB8pZCcFYoz9KWQnBYv9JwRkDUEACYv9JwRkCUIAASJmJwlkKmQWULAnCov/ZyknCWRnJwQqZGcqImeJJw5JNhoBSRWBIBJEiAACI0OKAwCL/zYyACcFY0xIRDIHJw1kD0QxAYGgnAEORCcORwKI/uEnCycLZDEBCGcnDCcMZCMIZ4v/JwViMQEIjP6L/ycFi/5mi/6M/Slki/8SQQAVi/0nBGQNQQAJi/4nBGQJQgABIoz9i/0qZA1BAAknCYv/ZyqL/WeJMRtB/dKABLhEezY2GgCOAf3FAIAEqyNwzDYaAI4B/1YAADEbQf5LAA==', - 'clear-state-program': 'CQ==', - creator: 'ORANGESCU7XMR2TFXSFTOHCUHNP6OYEPIKZW3JZANTCDHVQYMGQFYFIDDA', - 'global-state': [], - 'global-state-schema': { - 'num-byte-slice': 2, - 'num-uint': 11, + approvalProgram: base64ToBytes( + 'CSAFAAGAgNGUtXQGAiYPDmhhbHZpbmdfc3VwcGx5Cmxhc3RfbWluZXIUY3VycmVudF9taW5lcl9lZmZvcnQMbWluZXJfcmV3YXJkEWxhc3RfbWluZXJfZWZmb3J0BmVmZm9ydAV0b2tlbgdoYWx2aW5nDG1pbmVkX3N1cHBseQ1jdXJyZW50X21pbmVyBWJsb2NrDHRvdGFsX2VmZm9ydBJ0b3RhbF90cmFuc2FjdGlvbnMPc3RhcnRfdGltZXN0YW1wADEYIg0lCzEZCI0IAioCSwAAAAAAAAAAAj0CTACIAAIjQ4oAACcGImcnCiJnJwsiZycMImcnByJnKIGAwKjKmjpnJwgiZyuBgICAAmcpMgNnJwQiZycJMgNnKiJnJw2BgIHIrAZniYoAACcGsYEDshCABk9yYW5nZbImgANPUkGyJTIKsikyA7IqMgOyKzIDsiwksiIlsiOAFGh0dHBzOi8vb3Jhbmdlcy5tZW1lsicisgGztDxniYgAAiNDigAAJwZkIhJBAAOI/5wxACcFImaJigMAJwdkgQ8SQQASKiJnKyJngAhHb29kYnllLrCJMgYyBoEFGAmM/ycKZIv/E0EAuClkJwZkcABMSEEAaihkK2QNQQAFK2RCAAIoZIz+sYEEshAnBmSyESlkshSL/rISIrIBsycIJwhki/4IZygoZIv+CWcoZCISQQAsJwcnB2QjCGcnB2SBDhJBAAooJCcIZAlnQgARKCQnCGQJIQQKZysrZCEECmcpZDYyAGFBAB8pZCcFYoz9KWQnBYv9JwRkDUEACYv9JwRkCUIAASJmJwlkKmQWULAnCov/ZyknCWRnJwQqZGcqImeJJw5JNhoBSRWBIBJEiAACI0OKAwCL/zYyACcFY0xIRDIHJw1kD0QxAYGgnAEORCcORwKI/uEnCycLZDEBCGcnDCcMZCMIZ4v/JwViMQEIjP6L/ycFi/5mi/6M/Slki/8SQQAVi/0nBGQNQQAJi/4nBGQJQgABIoz9i/0qZA1BAAknCYv/ZyqL/WeJMRtB/dKABLhEezY2GgCOAf3FAIAEqyNwzDYaAI4B/1YAADEbQf5LAA==' + ), + clearStateProgram: base64ToBytes('CQ=='), + creator: algosdk.Address.fromString('ORANGESCU7XMR2TFXSFTOHCUHNP6OYEPIKZW3JZANTCDHVQYMGQFYFIDDA'), + globalState: [], + globalStateSchema: { + numByteSlice: 2, + numUint: 11, }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 1, + localStateSchema: { + numByteSlice: 0, + numUint: 1, }, }, }, { - id: 1284326447, + id: 1284326447n, params: { - 'approval-program': - 'CSAFAAGAgKSPxPlaEAImDwpsYXN0X21pbmVyDmhhbHZpbmdfc3VwcGx5EWxhc3RfbWluZXJfZWZmb3J0BmVmZm9ydAV0b2tlbgdoYWx2aW5nDG1pbmVkX3N1cHBseQxtaW5lcl9yZXdhcmQUY3VycmVudF9taW5lcl9lZmZvcnQFYmxvY2sMdG90YWxfZWZmb3J0EnRvdGFsX3RyYW5zYWN0aW9ucw1jdXJyZW50X21pbmVyD3N0YXJ0X3RpbWVzdGFtcAAxGCINgQYLMRkIjQgDCgMrAAAAAAAAAAADHQMsAIgAAiNDigAAJwQiZycJImcnCiJnJwsiZycFImcpgYCA0ofivC1nJwYiZycHgYCAgDJnKDIDZyoiZycMMgNnJwgiZycNgYCByKwGZ4mKAAAnBLGBA7IQgAZPcmFuZ2WyJoADT1JBsiUyCrIpMgqyKjIDsisyA7IsJLIigQiyI4A6aXBmczovL1FtVWl0eEp1UEpKcmN1QWRBaVZkRUVwdXpHbXNFTEdnQXZoTGQ1RmlYUlNoRXUjYXJjM7IngCDT/VG+LujCsXp66CbTScDfIP6rik1oAwNAHHQVYMMkNrIoIrIBgKgBSm9obiBBbGFuIFdvb2RzIDAxL0RlYy8yMDIzIFlvdSBrbm93LCBJIGNhbiBwdWxsIG1ldHJpY3Mgb3V0IG9mIHRoZSBhaXIgdG9vLCB3aGF0ZXZlciwgOCBtaWxsaW9uIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBsYXN0IHdlZWssIEkgZG9uJ3Qga25vdywgbXkgbW9tIGhhcyBmb3VyIG9yYW5nZXMusgWztDxniYgAAiNDigAAJwRkIhJBAAOI/qQxACsiZomKAwAyBjIGgQUYCYz/Jwlki/8TQQC3KGQnBGRwAExIQQB0KWQnB2QNQQAGJwdkQgACKWSM/rGBBLIQJwRkshEoZLIUi/6yEiKyAbMoZCpkFlCwJwYnBmSL/ghnKSlki/4JZylkIhJBAC0nBScFZCMIZycFZCUPQQAKKSQnBmQJZ0IAEykkJwZkCSEECmcnBycHZCEECmcoZDYyAGFBABsoZCtijP0oZCuL/SpkDUEACIv9KmQJQgABImYnCYv/ZygnDGRnKicIZGcnCCJniScOSTYaAUkVgSASRIgAAiNDigMAi/82MgArY0xIRDIHJw1kD0QnBWQlDkQxAYGgnAEORCcORwKI/vgnCicKZDEBCGcnCycLZCMIZ4v/K2IxAQiM/ov/K4v+Zov+jP0oZIv/EkEAE4v9KmQNQQAIi/0qZAlCAAEijP2L/ScIZA1BAAonDIv/ZycIi/1niTEbQfzygAS4RHs2NhoAjgH85QCABKsjcMw2GgCOAf9TAAAxG0H+ZQA=', - 'clear-state-program': 'CQ==', - creator: 'ORANGESCU7XMR2TFXSFTOHCUHNP6OYEPIKZW3JZANTCDHVQYMGQFYFIDDA', - 'global-state': [], - 'global-state-schema': { - 'num-byte-slice': 2, - 'num-uint': 11, + approvalProgram: base64ToBytes( + 'CSAFAAGAgKSPxPlaEAImDwpsYXN0X21pbmVyDmhhbHZpbmdfc3VwcGx5EWxhc3RfbWluZXJfZWZmb3J0BmVmZm9ydAV0b2tlbgdoYWx2aW5nDG1pbmVkX3N1cHBseQxtaW5lcl9yZXdhcmQUY3VycmVudF9taW5lcl9lZmZvcnQFYmxvY2sMdG90YWxfZWZmb3J0EnRvdGFsX3RyYW5zYWN0aW9ucw1jdXJyZW50X21pbmVyD3N0YXJ0X3RpbWVzdGFtcAAxGCINgQYLMRkIjQgDCgMrAAAAAAAAAAADHQMsAIgAAiNDigAAJwQiZycJImcnCiJnJwsiZycFImcpgYCA0ofivC1nJwYiZycHgYCAgDJnKDIDZyoiZycMMgNnJwgiZycNgYCByKwGZ4mKAAAnBLGBA7IQgAZPcmFuZ2WyJoADT1JBsiUyCrIpMgqyKjIDsisyA7IsJLIigQiyI4A6aXBmczovL1FtVWl0eEp1UEpKcmN1QWRBaVZkRUVwdXpHbXNFTEdnQXZoTGQ1RmlYUlNoRXUjYXJjM7IngCDT/VG+LujCsXp66CbTScDfIP6rik1oAwNAHHQVYMMkNrIoIrIBgKgBSm9obiBBbGFuIFdvb2RzIDAxL0RlYy8yMDIzIFlvdSBrbm93LCBJIGNhbiBwdWxsIG1ldHJpY3Mgb3V0IG9mIHRoZSBhaXIgdG9vLCB3aGF0ZXZlciwgOCBtaWxsaW9uIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBsYXN0IHdlZWssIEkgZG9uJ3Qga25vdywgbXkgbW9tIGhhcyBmb3VyIG9yYW5nZXMusgWztDxniYgAAiNDigAAJwRkIhJBAAOI/qQxACsiZomKAwAyBjIGgQUYCYz/Jwlki/8TQQC3KGQnBGRwAExIQQB0KWQnB2QNQQAGJwdkQgACKWSM/rGBBLIQJwRkshEoZLIUi/6yEiKyAbMoZCpkFlCwJwYnBmSL/ghnKSlki/4JZylkIhJBAC0nBScFZCMIZycFZCUPQQAKKSQnBmQJZ0IAEykkJwZkCSEECmcnBycHZCEECmcoZDYyAGFBABsoZCtijP0oZCuL/SpkDUEACIv9KmQJQgABImYnCYv/ZygnDGRnKicIZGcnCCJniScOSTYaAUkVgSASRIgAAiNDigMAi/82MgArY0xIRDIHJw1kD0QnBWQlDkQxAYGgnAEORCcORwKI/vgnCicKZDEBCGcnCycLZCMIZ4v/K2IxAQiM/ov/K4v+Zov+jP0oZIv/EkEAE4v9KmQNQQAIi/0qZAlCAAEijP2L/ScIZA1BAAonDIv/ZycIi/1niTEbQfzygAS4RHs2NhoAjgH85QCABKsjcMw2GgCOAf9TAAAxG0H+ZQA=' + ), + clearStateProgram: base64ToBytes('CQ=='), + creator: algosdk.Address.fromString('ORANGESCU7XMR2TFXSFTOHCUHNP6OYEPIKZW3JZANTCDHVQYMGQFYFIDDA'), + globalState: [], + globalStateSchema: { + numByteSlice: 2, + numUint: 11, }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 1, + localStateSchema: { + numByteSlice: 0, + numUint: 1, }, }, }, { - id: 1439234347, + id: 1439234347n, params: { - 'approval-program': - 'CiASAAEQCECQTgaAAQSgnAEgkAEFoAEwOAqAAiYaAXAQAAAAAAAAAAEAAAAAAAAAABFtaW5pbmdBcHBsaWNhdGlvbg50b3RhbERlcG9zaXRlZAALcG9vbEFkZHJlc3MLcGVuZGluZ0Nvc3QLbWluaW5nVG9rZW4JcG9vbFRva2VuEP////////////////////8PcG9vbEFwcGxpY2F0aW9uCmJhc2VUeG5GZWUKdG90YWxTcGVudA1zcGVudFBlclRva2VuDnJld2FyZFBlclRva2VuCP//////////B21hbmFnZXIKbWluRGVwb3NpdA1tYXJrZXRSYXRlQnBzDnRvdGFsV2l0aGRyYXduCWxhc3RTcGVudAtsYXN0UmV3YXJkcw5sYXN0UHJpY2VSb3VuZBAAAAAAAAAAAAAAAAAAAAAABKsjcMwQAAAAAAAAAAAAAAAAAAAAZDEYFCEGCzEZCI0MCQwAAAAAAAAJOwAACPkAAAAAAAAAAAAAAIgAAiNDigAAJxAxAGcqga+IteQEZycHgZyivOQEZycFgCCcREx2mTTBM0y9VunNIYOfPfHwh6/l1mEhYtmARwl2SmcnCoGdpobeA2cnCIHMm7LpBGcnEYGgjQZnJwshCWcnEoGEUmcrImcnDCJnJxMiZycUImcnFSJnJw0nF2cnDicXZycWImcnBiJniYgAAiNDigAAMQAnEGQSRIk2GgMXNhoCFzYaAReIAAIjQ4oDADEAJxBkEkSL/jIAD0SL/iEJDkSL/4HAhD0ORIv/gdCGAw9Ei/0hCQ5EKL1MSBRBAAUoIQ25SDIKJwdkcABMSBRBADqxIQiyECcHZLIRMgqyFCKyEiKyAbOxIQayECpkshgjshkisgGzsSEIshAnCGSyETIKshQishIisgGzJxGL/2cnC4v+ZycSi/1niYoAACcERwUrZCINQQBzKYwAJwxkJxRkCRaMATIKJwhkcABIJxNkCIwCiwInFWQJFowDiwEpoytkFqKMBIsDKaMrZBaijAUnDUlkiwSgSZMhBw5EJwmsSRVJJAlMUmcnDklkiwWgSZMhBw5EJwmsSRVJJAlMUmcnFCcMZGcnFYsCZ4mKAgEnBEcFi/+9TEgUQQAPi/+BSLlIi/6BxNgCCYz+i/+MACmMAStJZIv/IiW6FwlnJw1ki/8kJLqhjAKL/yIluhcWiwKjKaJJkyEEDkQnD6xJFUklCUxSF4wDJw5ki/8hCiS6oYwEi/8iJboXFosEoymiSZMhBA5EJw+sSRVJJQlMUheMBSKL/yIluheL/giLAwkWiwBOArshBIv/IQQluheLBQgWiwBOArslMgcWiwBOArskJw1kiwBOArshCicOZIsATgK7IQ6L/yEOJboXiwMIFosATgK7K0lki/8iJboXCGeLA4wARgWJiAACI0OKAAAnBDEWIg1EMRYjCYwAiwA4ECMSRIsAOAcyChJEiP5siwA4CDEAiP7lMQC+RLCJigMAJwRJi/+MAIv/IQQluheL/QshBQqMAYsBIg1BAEKxIQiyECcIZLIRi/6yFIsBshIisgGzJxNJZIsBCGchD4v/IQ8luheLAQgWiwBOArshBIv/IQQluheLAQkWiwBOAruJigMAJwRJi/+MAIv/IiW6F4v9CyEFCowBiwEjDUEAErEjshCL/rIHiwEjCbIIIrIBsytJZIsBCWcii/8iJboXiwEJFosATgK7iTYaAhc2GgEXiAACI0OKAgCL/yEFDkSL/iEFDkSI/ZIiMQCI/g6L/zEAMQCI/yaL/jEAMQCI/4AxAL5EsIk2GgFJFSEKEkSIAAIjQ4oBACcERwQxFiINRDEWIwmMAIsAOBAjEkSLADgHMgoSRIj9Qov/jAGL/yIluheMAosAOAiL/4j9r4wDiwMnEWQIiwINRIsDiwINQQAWiwIhBQuLAwqMBCEFiwQJMQCL/4j+piEFMQCL/4j/AIv/vkSwiYoAAScERwYyBicWZAmMACmMAScKZCcFZIAQYXNzZXRfMV9yZXNlcnZlc0xOAmNEjAInCmQnBWSAEGFzc2V0XzJfcmVzZXJ2ZXNMTgJjRIwDiwMWKaOLAhaijASLACINQQFSiwAhEA1BAKUogKABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+LBCgiJLqkQQAdKIsESZMhBw5EJwmsSRVJJAlMUigiIQu6UL9CAH6LBCghCyS6p0EAHShJJCELuosESZMhBw5EJwmsSRVJJAlMUlC/QgBWI4wFiwUhEAxBAEuLBIsFJAskKE4CuqZBADMkiwULjAYoSb5EJIsGJAlYiwRJkyEHDkQnCaxJFUkkCUxSUCi+RIsGIQ2LBglYUL9CAAmLBSMIjAVC/60nFjIGZ4sEjABGBomKAgCxIQiyECcHZLIRi/+yEicFZLIUIrIBtiOyEIv+sggnBWSyByKyAbYhBrIQJwpkshiADWFkZF9saXF1aWRpdHmyGoAIZmxleGlibGWyGoAIAAAAAAAAAACyGicIZLIwJwVkshwisgGzJwxJZIv+CCcGZAhnJwYiZ4mIAAIjQ4oAACcERxMrZCINRDIGMgYhDBgJjACLACpkgAVibG9ja2VEE4wBKmSADWN1cnJlbnRfbWluZXJlRIwCiwFJQAAGMgqLAhMRRDIAjAOBA4wEiwFBAA2LAzIACIwDiwQjCIwEsSEGshAnGLIaKmSyGIsDsgEyCrIasycGSWSLAwhniP09jAUoIQQkuowGiwWLBqRBAAWLBUIAAosGjAcpjAgqZIAMbWluZXJfcmV3YXJkZUSMCScSZBaLCRajiwejgBAAAAAAAAAAAAAAAAAAACcQKaOiSZMhBA5EJw+sSRVJJQlMUheMCipkgApsYXN0X21pbmVyZUSMCypkgBFsYXN0X21pbmVyX2VmZm9ydGVEjAwqZIAGZWZmb3J0MgpOAmNEjA2LCzIKEkEAB4sNiwwJjA2BAjIAC4wOMgonB2RwAEiMD4AQAAAAAAAAAAAAAAAAAAAAX4sGoycZoowQgBAAAAAAAAAAAAAAAAAAAABpiwajJxmijBGLDyINSUEABosQiwWkEElBAAaLEYsFpRCMEosSQQARiw4hDDIACwiMDosEIQwIjASLCosNiw4IDUEAB4sKiw0JjA6LDiINSUEABosEIREMEEEAZ4sEIwiMBIsOJwtkDUEABicLZEIAAosOjBOLBCERE0lBAAaLE4sOExBJQQAJiw4yAIsTCAwQQQAHixMyAAmME4sOixMJjA4nBklkixMIZ7EhBrIQJxiyGipkshiLE7IBMgqyGrNC/4ixI7IQMQCyBzIAsggisgGzJwZJZDIACGeLEkEAHosPFosFoymiSZMhBA5EJw+sSRVJJQlMUheLD4j9E4kxG0H3A4AEuER7NjYaAI4B9vYAgATI07R7gASS4DscgATjrrJcgAQ8aaf3gAR4Srd6NhoAjgX3Zflz+lX6kv1NAAAxG0H3ToAERvdlMzYaAI4B90EA', - 'clear-state-program': 'Cg==', - creator: 'ORANGESCU7XMR2TFXSFTOHCUHNP6OYEPIKZW3JZANTCDHVQYMGQFYFIDDA', - 'extra-program-pages': 3, - 'global-state': [], - 'global-state-schema': { - 'num-byte-slice': 32, - 'num-uint': 32, + approvalProgram: base64ToBytes( + 'CiASAAEQCECQTgaAAQSgnAEgkAEFoAEwOAqAAiYaAXAQAAAAAAAAAAEAAAAAAAAAABFtaW5pbmdBcHBsaWNhdGlvbg50b3RhbERlcG9zaXRlZAALcG9vbEFkZHJlc3MLcGVuZGluZ0Nvc3QLbWluaW5nVG9rZW4JcG9vbFRva2VuEP////////////////////8PcG9vbEFwcGxpY2F0aW9uCmJhc2VUeG5GZWUKdG90YWxTcGVudA1zcGVudFBlclRva2VuDnJld2FyZFBlclRva2VuCP//////////B21hbmFnZXIKbWluRGVwb3NpdA1tYXJrZXRSYXRlQnBzDnRvdGFsV2l0aGRyYXduCWxhc3RTcGVudAtsYXN0UmV3YXJkcw5sYXN0UHJpY2VSb3VuZBAAAAAAAAAAAAAAAAAAAAAABKsjcMwQAAAAAAAAAAAAAAAAAAAAZDEYFCEGCzEZCI0MCQwAAAAAAAAJOwAACPkAAAAAAAAAAAAAAIgAAiNDigAAJxAxAGcqga+IteQEZycHgZyivOQEZycFgCCcREx2mTTBM0y9VunNIYOfPfHwh6/l1mEhYtmARwl2SmcnCoGdpobeA2cnCIHMm7LpBGcnEYGgjQZnJwshCWcnEoGEUmcrImcnDCJnJxMiZycUImcnFSJnJw0nF2cnDicXZycWImcnBiJniYgAAiNDigAAMQAnEGQSRIk2GgMXNhoCFzYaAReIAAIjQ4oDADEAJxBkEkSL/jIAD0SL/iEJDkSL/4HAhD0ORIv/gdCGAw9Ei/0hCQ5EKL1MSBRBAAUoIQ25SDIKJwdkcABMSBRBADqxIQiyECcHZLIRMgqyFCKyEiKyAbOxIQayECpkshgjshkisgGzsSEIshAnCGSyETIKshQishIisgGzJxGL/2cnC4v+ZycSi/1niYoAACcERwUrZCINQQBzKYwAJwxkJxRkCRaMATIKJwhkcABIJxNkCIwCiwInFWQJFowDiwEpoytkFqKMBIsDKaMrZBaijAUnDUlkiwSgSZMhBw5EJwmsSRVJJAlMUmcnDklkiwWgSZMhBw5EJwmsSRVJJAlMUmcnFCcMZGcnFYsCZ4mKAgEnBEcFi/+9TEgUQQAPi/+BSLlIi/6BxNgCCYz+i/+MACmMAStJZIv/IiW6FwlnJw1ki/8kJLqhjAKL/yIluhcWiwKjKaJJkyEEDkQnD6xJFUklCUxSF4wDJw5ki/8hCiS6oYwEi/8iJboXFosEoymiSZMhBA5EJw+sSRVJJQlMUheMBSKL/yIluheL/giLAwkWiwBOArshBIv/IQQluheLBQgWiwBOArslMgcWiwBOArskJw1kiwBOArshCicOZIsATgK7IQ6L/yEOJboXiwMIFosATgK7K0lki/8iJboXCGeLA4wARgWJiAACI0OKAAAnBDEWIg1EMRYjCYwAiwA4ECMSRIsAOAcyChJEiP5siwA4CDEAiP7lMQC+RLCJigMAJwRJi/+MAIv/IQQluheL/QshBQqMAYsBIg1BAEKxIQiyECcIZLIRi/6yFIsBshIisgGzJxNJZIsBCGchD4v/IQ8luheLAQgWiwBOArshBIv/IQQluheLAQkWiwBOAruJigMAJwRJi/+MAIv/IiW6F4v9CyEFCowBiwEjDUEAErEjshCL/rIHiwEjCbIIIrIBsytJZIsBCWcii/8iJboXiwEJFosATgK7iTYaAhc2GgEXiAACI0OKAgCL/yEFDkSL/iEFDkSI/ZIiMQCI/g6L/zEAMQCI/yaL/jEAMQCI/4AxAL5EsIk2GgFJFSEKEkSIAAIjQ4oBACcERwQxFiINRDEWIwmMAIsAOBAjEkSLADgHMgoSRIj9Qov/jAGL/yIluheMAosAOAiL/4j9r4wDiwMnEWQIiwINRIsDiwINQQAWiwIhBQuLAwqMBCEFiwQJMQCL/4j+piEFMQCL/4j/AIv/vkSwiYoAAScERwYyBicWZAmMACmMAScKZCcFZIAQYXNzZXRfMV9yZXNlcnZlc0xOAmNEjAInCmQnBWSAEGFzc2V0XzJfcmVzZXJ2ZXNMTgJjRIwDiwMWKaOLAhaijASLACINQQFSiwAhEA1BAKUogKABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+LBCgiJLqkQQAdKIsESZMhBw5EJwmsSRVJJAlMUigiIQu6UL9CAH6LBCghCyS6p0EAHShJJCELuosESZMhBw5EJwmsSRVJJAlMUlC/QgBWI4wFiwUhEAxBAEuLBIsFJAskKE4CuqZBADMkiwULjAYoSb5EJIsGJAlYiwRJkyEHDkQnCaxJFUkkCUxSUCi+RIsGIQ2LBglYUL9CAAmLBSMIjAVC/60nFjIGZ4sEjABGBomKAgCxIQiyECcHZLIRi/+yEicFZLIUIrIBtiOyEIv+sggnBWSyByKyAbYhBrIQJwpkshiADWFkZF9saXF1aWRpdHmyGoAIZmxleGlibGWyGoAIAAAAAAAAAACyGicIZLIwJwVkshwisgGzJwxJZIv+CCcGZAhnJwYiZ4mIAAIjQ4oAACcERxMrZCINRDIGMgYhDBgJjACLACpkgAVibG9ja2VEE4wBKmSADWN1cnJlbnRfbWluZXJlRIwCiwFJQAAGMgqLAhMRRDIAjAOBA4wEiwFBAA2LAzIACIwDiwQjCIwEsSEGshAnGLIaKmSyGIsDsgEyCrIasycGSWSLAwhniP09jAUoIQQkuowGiwWLBqRBAAWLBUIAAosGjAcpjAgqZIAMbWluZXJfcmV3YXJkZUSMCScSZBaLCRajiwejgBAAAAAAAAAAAAAAAAAAACcQKaOiSZMhBA5EJw+sSRVJJQlMUheMCipkgApsYXN0X21pbmVyZUSMCypkgBFsYXN0X21pbmVyX2VmZm9ydGVEjAwqZIAGZWZmb3J0MgpOAmNEjA2LCzIKEkEAB4sNiwwJjA2BAjIAC4wOMgonB2RwAEiMD4AQAAAAAAAAAAAAAAAAAAAAX4sGoycZoowQgBAAAAAAAAAAAAAAAAAAAABpiwajJxmijBGLDyINSUEABosQiwWkEElBAAaLEYsFpRCMEosSQQARiw4hDDIACwiMDosEIQwIjASLCosNiw4IDUEAB4sKiw0JjA6LDiINSUEABosEIREMEEEAZ4sEIwiMBIsOJwtkDUEABicLZEIAAosOjBOLBCERE0lBAAaLE4sOExBJQQAJiw4yAIsTCAwQQQAHixMyAAmME4sOixMJjA4nBklkixMIZ7EhBrIQJxiyGipkshiLE7IBMgqyGrNC/4ixI7IQMQCyBzIAsggisgGzJwZJZDIACGeLEkEAHosPFosFoymiSZMhBA5EJw+sSRVJJQlMUheLD4j9E4kxG0H3A4AEuER7NjYaAI4B9vYAgATI07R7gASS4DscgATjrrJcgAQ8aaf3gAR4Srd6NhoAjgX3Zflz+lX6kv1NAAAxG0H3ToAERvdlMzYaAI4B90EA' + ), + clearStateProgram: base64ToBytes('CQ=='), + creator: algosdk.Address.fromString('ORANGESCU7XMR2TFXSFTOHCUHNP6OYEPIKZW3JZANTCDHVQYMGQFYFIDDA'), + extraProgramPages: 3, + globalState: [], + globalStateSchema: { + numByteSlice: 32, + numUint: 32, }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, + localStateSchema: { + numByteSlice: 0, + numUint: 0, }, }, }, ], - 'created-assets': [ + createdAssets: [ { - index: 1336655079, + index: 1336655079n, params: { creator: 'ORANGESCU7XMR2TFXSFTOHCUHNP6OYEPIKZW3JZANTCDHVQYMGQFYFIDDA', decimals: 0, - 'default-frozen': false, - 'metadata-hash': encoder.encode('HbvUpgutrE/1EOdh9NYWQ92XiQrViveNl19QfX2y68Q='), + defaultFrozen: false, + metadataHash: encoder.encode('HbvUpgutrE/1EOdh9NYWQ92XiQrViveNl19QfX2y68Q='), name: 'Juicer Club Membership Card', - 'name-b64': encoder.encode('SnVpY2VyIENsdWIgTWVtYmVyc2hpcCBDYXJk'), - total: 1910, - 'unit-name': 'JUICER', - 'unit-name-b64': encoder.encode('SlVJQ0VS'), + nameB64: encoder.encode('SnVpY2VyIENsdWIgTWVtYmVyc2hpcCBDYXJk'), + total: 1910n, + unitName: 'JUICER', + unitNameB64: encoder.encode('SlVJQ0VS'), url: 'ipfs://QmeatcmRtwiyV3gWRAFbFmy2HvwFKk6qpJ825JK1Vo8839#arc3', - 'url-b64': encoder.encode('aXBmczovL1FtZWF0Y21SdHdpeVYzZ1dSQUZiRm15Mkh2d0ZLazZxcEo4MjVKSzFWbzg4MzkjYXJjMw=='), + urlB64: encoder.encode('aXBmczovL1FtZWF0Y21SdHdpeVYzZ1dSQUZiRm15Mkh2d0ZLazZxcEo4MjVKSzFWbzg4MzkjYXJjMw=='), }, }, ], - 'min-balance': 5281000, - 'pending-rewards': 0, - 'reward-base': 218288, - rewards: 0, - round: 39088730, + minBalance: 5281000n, + pendingRewards: 0n, + rewardBase: 218288n, + rewards: 0n, + round: 39088730n, status: AccountStatus.Offline, - 'total-apps-opted-in': 1, - 'total-assets-opted-in': 6, - 'total-created-apps': 4, - 'total-created-assets': 1, + totalAppsOptedIn: 1, + totalAssetsOptedIn: 6, + totalCreatedApps: 4, + totalCreatedAssets: 1, } satisfies AccountResult) }, ['mainnet-DGOANM6JL4VNSBJW737T24V4WVQINFWELRE3OKHQQFZ2JFMVKUF52D4AY4']: () => { return new AccountResultBuilder({ address: 'DGOANM6JL4VNSBJW737T24V4WVQINFWELRE3OKHQQFZ2JFMVKUF52D4AY4', - amount: 98433606, - 'amount-without-pending-rewards': 98433606, - 'apps-local-state': [ + amount: 98433606n, + amountWithoutPendingRewards: 98433606n, + appsLocalState: [ { - id: 811554792, + id: 811554792n, schema: { - 'num-byte-slice': 0, - 'num-uint': 0, + numByteSlice: 0, + numUint: 0, }, }, { - id: 811555774, + id: 811555774n, schema: { - 'num-byte-slice': 0, - 'num-uint': 0, + numByteSlice: 0, + numUint: 0, }, }, { - id: 811556459, + id: 811556459n, schema: { - 'num-byte-slice': 0, - 'num-uint': 0, + numByteSlice: 0, + numUint: 0, }, }, { - id: 811563899, + id: 811563899n, schema: { - 'num-byte-slice': 0, - 'num-uint': 0, + numByteSlice: 0, + numUint: 0, }, }, { - id: 811564745, + id: 811564745n, schema: { - 'num-byte-slice': 0, - 'num-uint': 0, + numByteSlice: 0, + numUint: 0, }, }, { - id: 811565811, + id: 811565811n, schema: { - 'num-byte-slice': 0, - 'num-uint': 0, + numByteSlice: 0, + numUint: 0, }, }, { - id: 812246978, + id: 812246978n, schema: { - 'num-byte-slice': 0, - 'num-uint': 0, + numByteSlice: 0, + numUint: 0, }, }, { - id: 829144306, - 'key-value': [], + id: 829144306n, + keyValue: [], schema: { - 'num-byte-slice': 0, - 'num-uint': 1, + numByteSlice: 0, + numUint: 1, }, }, ], - 'apps-total-schema': { - 'num-byte-slice': 0, - 'num-uint': 1, + appsTotalSchema: { + numByteSlice: 0, + numUint: 1, }, assets: [], - 'auth-addr': 'K7F3GQNOXIMJFF2NJSBHZ7OPNWVLIJM3BN6CYAZJBY3MS6C7TN24JTYX5E', - 'created-apps': [], - 'created-assets': [], - 'min-balance': 2228500, - 'pending-rewards': 0, - 'reward-base': 218288, - rewards: 0, - round: 39090114, + authAddr: algosdk.Address.fromString('K7F3GQNOXIMJFF2NJSBHZ7OPNWVLIJM3BN6CYAZJBY3MS6C7TN24JTYX5E'), + createdApps: [], + createdAssets: [], + minBalance: 2228500n, + pendingRewards: 0n, + rewardBase: 218288n, + rewards: 0n, + round: 39090114n, status: AccountStatus.Offline, - 'total-apps-opted-in': 8, - 'total-assets-opted-in': 0, - 'total-created-apps': 0, - 'total-created-assets': 0, + totalAppsOptedIn: 8, + totalAssetsOptedIn: 0, + totalCreatedApps: 0, + totalCreatedAssets: 0, }) }, ['mainnet-X6MNR4AVJQEMJRHAPZ6F4O4SVDIYN67ZRMD2O3ULPY4QFMANQNZOEYHODE']: () => { return new AccountResultBuilder({ address: 'X6MNR4AVJQEMJRHAPZ6F4O4SVDIYN67ZRMD2O3ULPY4QFMANQNZOEYHODE', - amount: 273116395038, - 'amount-without-pending-rewards': 273116395038, - 'apps-total-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, + amount: 273116395038n, + amountWithoutPendingRewards: 273116395038n, + appsTotalSchema: { + numByteSlice: 0, + numUint: 0, }, - 'auth-addr': 'NMR5PS2KYAEN73U4AK476QXEA3IPG2AUE6BSF73UA7EKHXZ76YX24HVRNQ', - 'min-balance': 98439400000, - 'pending-rewards': 0, - 'reward-base': 218288, - rewards: 0, - round: 40262299, + authAddr: algosdk.Address.fromString('NMR5PS2KYAEN73U4AK476QXEA3IPG2AUE6BSF73UA7EKHXZ76YX24HVRNQ'), + minBalance: 98439400000n, + pendingRewards: 0n, + rewardBase: 218288n, + rewards: 0n, + round: 40262299n, status: AccountStatus.Offline, - 'total-apps-opted-in': 0, - 'total-assets-opted-in': 984393, - 'total-created-apps': 0, - 'total-created-assets': 984393, + totalAppsOptedIn: 0, + totalAssetsOptedIn: 984393, + totalCreatedApps: 0, + totalCreatedAssets: 984393, }) }, ['mainnet-DHMCHBN4W5MBO72C3L3ZP6GGJHQ4OR6SW2EP3VDEJ5VHT4MERQLCTVW6PU']: () => { return new AccountResultBuilder({ address: 'DHMCHBN4W5MBO72C3L3ZP6GGJHQ4OR6SW2EP3VDEJ5VHT4MERQLCTVW6PU', - amount: 1915706350, - 'amount-without-pending-rewards': 1915706350, - 'apps-local-state': [], - 'apps-total-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, + amount: 1915706350n, + amountWithoutPendingRewards: 1915706350n, + appsLocalState: [], + appsTotalSchema: { + numByteSlice: 0, + numUint: 0, }, assets: [], - 'created-apps': [], - 'created-assets': [], - 'min-balance': 100000, - 'pending-rewards': 0, - 'reward-base': 218288, - rewards: 19424, - round: 43483662, + createdApps: [], + createdAssets: [], + minBalance: 100000n, + pendingRewards: 0n, + rewardBase: 218288n, + rewards: 19424n, + round: 43483662n, status: AccountStatus.Offline, - 'total-apps-opted-in': 0, - 'total-assets-opted-in': 0, - 'total-created-apps': 0, - 'total-created-assets': 0, + totalAppsOptedIn: 0, + totalAssetsOptedIn: 0, + totalCreatedApps: 0, + totalCreatedAssets: 0, } satisfies AccountResult) }, } diff --git a/src/tests/object-mother/application-result.ts b/src/tests/object-mother/application-result.ts index 0bef215bc..fca522c8b 100644 --- a/src/tests/object-mother/application-result.ts +++ b/src/tests/object-mother/application-result.ts @@ -1,5 +1,5 @@ import { ApplicationResultBuilder, applicationResultBuilder } from '../builders/application-result-builder' -import { modelsv2 } from 'algosdk' +import algosdk, { base64ToBytes, modelsv2 } from 'algosdk' export const applicationResultMother = { basic: () => { @@ -7,13 +7,14 @@ export const applicationResultMother = { }, 'mainnet-80441968': () => { return new ApplicationResultBuilder({ - id: 80441968, + id: 80441968n, params: { - 'approval-program': - 'AiAIAAUEAgEKkE5kJhMDYmlkBWRyYWluB0NyZWF0b3IGRXNjcm93Bldpbm5lcgNQb3QEQmlkcwpSb3VuZEJlZ2luCFJvdW5kRW5kBVByaWNlCk11bHRpcGxpZXIFVGltZXIKVGltZXJGaXJzdAtUaW1lclNlY29uZAlGZWVzRmlyc3QKRmVlc1NlY29uZAhEaXZpZGVuZANCaWQERmVlczEYIhJAAC4xGSMSQACTMRkkEkAApDEZJRJAALoxGSEEEkAAtyg2GgASQADQKTYaABJAAbIAMRshBRJAAAEAKjEAZys2GgBnJwQxAGcnBSJnJwYiZycHMgdnJwgyBzYaARcIZycJNhoCF2cnCjYaAxdnJws2GgQXZycMNhoFF2cnDTYaBhdnJw42GgcXZycPNhoIF2cnEDYaCRdnIQRDQgGBMQAqZBJAAAEAJwVkIhJAAAEAIQRDQgFpMQAqZBJAAAEAMRshBBJAAAEAKzYaAGchBENCAUwiQ0IBRzIHJwdkDzIHJwhkDhBAAAEAIicRImYiJxIiZiEEQ0IBJjIEJRIzAQgnCWQSMwEIJwlkJw5kCBIRMwEIJwlkJw9kCBIREDMAACpkEhAzAQcrZBIQMwEQIQQSEEAAAQAnBScFZCcJZAgnBWQnCWQIJxBkCyEGCglnJwQzAQBnJwknCWQnCWQnCmQLIQcKCGchBCcRIQQnEWInCWQIZjMBCCcJZBJBAAonCCcIZCcLZAhnMwEIJwlkJw5kCBJBABghBCcSIQQnEmInDmQIZicIJwhkJwxkCGczAQgnCWQnD2QIEkEAGCEEJxIhBCcSYicPZAhmJwgnCGQnDWQIZycGJwZkIQQIZyEEQ0IAPDIEJRJAAAEAMwAAKmQSQAABADMBACtkEkAAAQAzAQgiEkAAAQAzAQcyAxJAAAEAMwEJKmQSQAABACEEQw==', - 'clear-state-program': 'AiABASJD', - creator: '24YD4UNKUGVNGZ6QGXWIUPQ5L456FBH7LB5L6KFGQJ65YLQHXX4CQNPCZA', - 'global-state': [ + approvalProgram: base64ToBytes( + 'AiAIAAUEAgEKkE5kJhMDYmlkBWRyYWluB0NyZWF0b3IGRXNjcm93Bldpbm5lcgNQb3QEQmlkcwpSb3VuZEJlZ2luCFJvdW5kRW5kBVByaWNlCk11bHRpcGxpZXIFVGltZXIKVGltZXJGaXJzdAtUaW1lclNlY29uZAlGZWVzRmlyc3QKRmVlc1NlY29uZAhEaXZpZGVuZANCaWQERmVlczEYIhJAAC4xGSMSQACTMRkkEkAApDEZJRJAALoxGSEEEkAAtyg2GgASQADQKTYaABJAAbIAMRshBRJAAAEAKjEAZys2GgBnJwQxAGcnBSJnJwYiZycHMgdnJwgyBzYaARcIZycJNhoCF2cnCjYaAxdnJws2GgQXZycMNhoFF2cnDTYaBhdnJw42GgcXZycPNhoIF2cnEDYaCRdnIQRDQgGBMQAqZBJAAAEAJwVkIhJAAAEAIQRDQgFpMQAqZBJAAAEAMRshBBJAAAEAKzYaAGchBENCAUwiQ0IBRzIHJwdkDzIHJwhkDhBAAAEAIicRImYiJxIiZiEEQ0IBJjIEJRIzAQgnCWQSMwEIJwlkJw5kCBIRMwEIJwlkJw9kCBIREDMAACpkEhAzAQcrZBIQMwEQIQQSEEAAAQAnBScFZCcJZAgnBWQnCWQIJxBkCyEGCglnJwQzAQBnJwknCWQnCWQnCmQLIQcKCGchBCcRIQQnEWInCWQIZjMBCCcJZBJBAAonCCcIZCcLZAhnMwEIJwlkJw5kCBJBABghBCcSIQQnEmInDmQIZicIJwhkJwxkCGczAQgnCWQnD2QIEkEAGCEEJxIhBCcSYicPZAhmJwgnCGQnDWQIZycGJwZkIQQIZyEEQ0IAPDIEJRJAAAEAMwAAKmQSQAABADMBACtkEkAAAQAzAQgiEkAAAQAzAQcyAxJAAAEAMwEJKmQSQAABACEEQw==' + ), + clearStateProgram: base64ToBytes('AiABASJD'), + creator: algosdk.Address.fromString('24YD4UNKUGVNGZ6QGXWIUPQ5L456FBH7LB5L6KFGQJ65YLQHXX4CQNPCZA'), + globalState: [ toTealKeyValue({ key: 'Qmlkcw==', value: { bytes: '', type: 2, uint: 0 } }), toTealKeyValue({ key: 'VGltZXI=', value: { bytes: '', type: 2, uint: 20 } }), toTealKeyValue({ key: 'RGl2aWRlbmQ=', value: { bytes: '', type: 2, uint: 5 } }), @@ -30,20 +31,21 @@ export const applicationResultMother = { toTealKeyValue({ key: 'UHJpY2U=', value: { bytes: '', type: 2, uint: 1000000 } }), toTealKeyValue({ key: 'Um91bmRFbmQ=', value: { bytes: '', type: 2, uint: 1607905675 } }), ], - 'global-state-schema': { 'num-byte-slice': 3, 'num-uint': 12 }, - 'local-state-schema': { 'num-byte-slice': 0, 'num-uint': 2 }, + globalStateSchema: { numByteSlice: 3, numUint: 12 }, + localStateSchema: { numByteSlice: 0, numUint: 2 }, }, }) }, 'mainnet-1196727051': () => { return new ApplicationResultBuilder({ - id: 1196727051, + id: 1196727051n, params: { - 'approval-program': - 'CSAEAAEGAiYJDG5mdGlja2V0X2FwcAABAA9tYW5hZ2VyX2FkZHJlc3MBAQQuU0kZBGg0o6oSbWV0aG9kX3Blcm1pc3Npb25zB2FpcmxpbmUxGyISQAEtNhoAgAThNZDwEkABETYaAIAEnNbuoRJAAPU2GgCABF5iYz4SQADZNhoAgAS2olF1EkAAvTYaAIAE+Qj2KRJAAKE2GgCABB0UDY4SQACFNhoAgATG43mkEkAAaTYaACcFEkAAUTYaAIAEnvUJRhJAADU2GgCABE+i3akSQAAZNhoAJwYSQAABADEZIhIxGCITEESIBBYjQzEZIhIxGCITEESIA+wjQzEZIhIxGCITEESIA7IjQzEZIhIxGCITEESIA34jQzEZIhIxGCITEESIA0wjQzEZIhIxGCITEESIAxAjQzEZIhIxGCISEESIAuAjQzEZIhIxGCITEESIArcjQzEZIhIxGCITEESIApcjQzEZIhIxGCITEESIAncjQzEZIhIxGCITEESIAlcjQzEZIxJAADYxGSUSQAAlMRmBBBJAABMxGYEFEkAAAQAxGCITRIgAViNDMRgiE0SIAEEjQzEYIhNEiABSI0MxGCITRIgAQyNDigIBi/4yCGFAAAQiQgAbi/4iJwdjNQE1ADQBQAAHIov/U0IABTQAQv/1iYoAADEAMgkSRCNDigAAMQAyCRJEI0OKAAAjQ4oAACNDigEAMQAyCRJEK4v/wBxniYoBADEAK2QSRLEkshAjshmL/8AyshgisgGziYoBADEAK2QSRLEkshAlshmL/8AyshgisgGziYoCADEAK2QSRIv+wBwnB4v/ZomKAgGL/icIZBJAAAqL/ov/iP9JQgABI4mKAwAoi/7AMmcri/1nJwiL/2cjQ4oFADEAIoj/y0SxJLIQKGSyGIAEWOGHaLIai/uyGov8shqL/bIai/6yGov/shoisgGziYoDADEAJIj/mESxJLIQKGSyGIv/wByyHIv+wDCyMIAErnlpMLIai/2yGiqyGicEshoisgGziYoDADEAgQOI/2FEsSSyEChkshiL/sAcshyL/8AcshyL/cAwsjAnBbIaKrIaJwSyGoABArIaIrIBs4mKBAAxAIEFiP8nRLEkshAoZLIYi/zAMLIwgAQ7tliRshoqshqL/bIai/4WVwQAshqL/7IaIrIBs4mKAgAxAIEEiP7uRLEkshAoZLIYi/7AMLIwgARMfzwNshoqshoqIov/VrIaIrIBs4mKAwAxACWI/r9EsSSyEChkshiL/8AcshyL/sAwsjAnBrIai/2yGiqyGicEshoisgGziYoAACI2GgEiVYwAiwCI/i2JigAAIjYaASJVjACLAIj+LImKAAAiNhoBIlWMAIsAiP42iYoAACJJNhoBIlWMADYaAheMAYsAiwGI/jeJigAAKSIpNhoBjAA2GgIiVYwBNhoDjAKLAIsBiwKI/kGJigAAKUcENhoBjAA2GgKMATYaA4wCNhoEjAM2GgWMBIsAiwGLAosDiwSI/iiJigAAKSJJNhoBjAA2GgIiVYwBNhoDIlWMAosAiwGLAoj+OImKAAAiRwI2GgEiVYwANhoCIlWMATYaAyJVjAKLAIsBiwKI/kmJigAAIikiKTYaASJVjAA2GgKMATYaAyJajAI2GgSMA4sAiwGLAosDiP5YiYoAACJJNhoBIlWMADYaAiJVjAGLAIsBiP52iYoAACkiSTYaAYwANhoCIlWMATYaAyJVjAKLAIsBiwKI/oOJ', - 'clear-state-program': 'CYEAQw==', - creator: '52MVNW6FNW7L6W7IAKSROD5FYZGZNLVKT6WUWNUFEE3DT737RYIIL2YQ3Y', - 'global-state': [ + approvalProgram: base64ToBytes( + 'CSAEAAEGAiYJDG5mdGlja2V0X2FwcAABAA9tYW5hZ2VyX2FkZHJlc3MBAQQuU0kZBGg0o6oSbWV0aG9kX3Blcm1pc3Npb25zB2FpcmxpbmUxGyISQAEtNhoAgAThNZDwEkABETYaAIAEnNbuoRJAAPU2GgCABF5iYz4SQADZNhoAgAS2olF1EkAAvTYaAIAE+Qj2KRJAAKE2GgCABB0UDY4SQACFNhoAgATG43mkEkAAaTYaACcFEkAAUTYaAIAEnvUJRhJAADU2GgCABE+i3akSQAAZNhoAJwYSQAABADEZIhIxGCITEESIBBYjQzEZIhIxGCITEESIA+wjQzEZIhIxGCITEESIA7IjQzEZIhIxGCITEESIA34jQzEZIhIxGCITEESIA0wjQzEZIhIxGCITEESIAxAjQzEZIhIxGCISEESIAuAjQzEZIhIxGCITEESIArcjQzEZIhIxGCITEESIApcjQzEZIhIxGCITEESIAncjQzEZIhIxGCITEESIAlcjQzEZIxJAADYxGSUSQAAlMRmBBBJAABMxGYEFEkAAAQAxGCITRIgAViNDMRgiE0SIAEEjQzEYIhNEiABSI0MxGCITRIgAQyNDigIBi/4yCGFAAAQiQgAbi/4iJwdjNQE1ADQBQAAHIov/U0IABTQAQv/1iYoAADEAMgkSRCNDigAAMQAyCRJEI0OKAAAjQ4oAACNDigEAMQAyCRJEK4v/wBxniYoBADEAK2QSRLEkshAjshmL/8AyshgisgGziYoBADEAK2QSRLEkshAlshmL/8AyshgisgGziYoCADEAK2QSRIv+wBwnB4v/ZomKAgGL/icIZBJAAAqL/ov/iP9JQgABI4mKAwAoi/7AMmcri/1nJwiL/2cjQ4oFADEAIoj/y0SxJLIQKGSyGIAEWOGHaLIai/uyGov8shqL/bIai/6yGov/shoisgGziYoDADEAJIj/mESxJLIQKGSyGIv/wByyHIv+wDCyMIAErnlpMLIai/2yGiqyGicEshoisgGziYoDADEAgQOI/2FEsSSyEChkshiL/sAcshyL/8AcshyL/cAwsjAnBbIaKrIaJwSyGoABArIaIrIBs4mKBAAxAIEFiP8nRLEkshAoZLIYi/zAMLIwgAQ7tliRshoqshqL/bIai/4WVwQAshqL/7IaIrIBs4mKAgAxAIEEiP7uRLEkshAoZLIYi/7AMLIwgARMfzwNshoqshoqIov/VrIaIrIBs4mKAwAxACWI/r9EsSSyEChkshiL/8AcshyL/sAwsjAnBrIai/2yGiqyGicEshoisgGziYoAACI2GgEiVYwAiwCI/i2JigAAIjYaASJVjACLAIj+LImKAAAiNhoBIlWMAIsAiP42iYoAACJJNhoBIlWMADYaAheMAYsAiwGI/jeJigAAKSIpNhoBjAA2GgIiVYwBNhoDjAKLAIsBiwKI/kGJigAAKUcENhoBjAA2GgKMATYaA4wCNhoEjAM2GgWMBIsAiwGLAosDiwSI/iiJigAAKSJJNhoBjAA2GgIiVYwBNhoDIlWMAosAiwGLAoj+OImKAAAiRwI2GgEiVYwANhoCIlWMATYaAyJVjAKLAIsBiwKI/kmJigAAIikiKTYaASJVjAA2GgKMATYaAyJajAI2GgSMA4sAiwGLAosDiP5YiYoAACJJNhoBIlWMADYaAiJVjAGLAIsBiP52iYoAACkiSTYaAYwANhoCIlWMATYaAyJVjAKLAIsBiwKI/oOJ' + ), + clearStateProgram: base64ToBytes('CYEAQw=='), + creator: algosdk.Address.fromString('52MVNW6FNW7L6W7IAKSROD5FYZGZNLVKT6WUWNUFEE3DT737RYIIL2YQ3Y'), + globalState: [ toTealKeyValue({ key: 'bWFuYWdlcl9hZGRyZXNz', value: { @@ -69,31 +71,31 @@ export const applicationResultMother = { }, }), ], - 'global-state-schema': { - 'num-byte-slice': 2, - 'num-uint': 1, + globalStateSchema: { + numByteSlice: 2, + numUint: 1, }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 1, + localStateSchema: { + numByteSlice: 0, + numUint: 1, }, }, }) }, 'testnet-718348254': () => { return new ApplicationResultBuilder({ - id: 718348254, + id: 718348254n, params: { - 'approval-program': 'CiABATEbQQAmgASlPlpBNhoAjgEAAQAxGRREMRhENhoBiAAVgAQVH3x1TFCwIkMxGRREMRgURCJDigEBi/+J', - 'clear-state-program': 'CoEBQw==', - creator: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, + approvalProgram: base64ToBytes('CiABATEbQQAmgASlPlpBNhoAjgEAAQAxGRREMRhENhoBiAAVgAQVH3x1TFCwIkMxGRREMRgURCJDigEBi/+J'), + clearStateProgram: base64ToBytes('CoEBQw=='), + creator: algosdk.Address.fromString('25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE'), + globalStateSchema: { + numByteSlice: 0, + numUint: 0, }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, + localStateSchema: { + numByteSlice: 0, + numUint: 0, }, }, }) @@ -101,13 +103,14 @@ export const applicationResultMother = { // This app is associated with the Arc56 sample-one app spec 'localnet-3771': () => { return new ApplicationResultBuilder({ - id: 3771, + id: 3771n, params: { - 'approval-program': - 'CiACAdIJJgEGYm94S2V5MRgUgQYLMRkIjQwA3gDsAAAAAAAAAAAA0AAAAAAAAAAAAAAAgAQVH3x1NhoBSRWBIBJEiAAEULAiQ4oBAYv/VxAIF4v/VxgIFwxBAAEAgAlnbG9iYWxLZXkjZ4AGcAADZm9vgAQADQAlZ4v/VwAIF4v/VwgIFwgWi/9XEAgXi/9XGAgXCRZQiYgAAiJDigAAMQCACGxvY2FsS2V5I2YxAIAEcGZvb4AFAANiYXJmKEm8SIAFAANiYXq/gCFwAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAOAEAAAAAAAAAADAAAAAAAAAAG/iSJDgAS4RHs2NhoAjgH/8QCABDltVQ42GgCOAf8WAIAEAaOj/zYaAI4B/2wA', - 'clear-state-program': 'Cg==', - creator: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', - 'global-state': [ + approvalProgram: base64ToBytes( + 'CiACAdIJJgEGYm94S2V5MRgUgQYLMRkIjQwA3gDsAAAAAAAAAAAA0AAAAAAAAAAAAAAAgAQVH3x1NhoBSRWBIBJEiAAEULAiQ4oBAYv/VxAIF4v/VxgIFwxBAAEAgAlnbG9iYWxLZXkjZ4AGcAADZm9vgAQADQAlZ4v/VwAIF4v/VwgIFwgWi/9XEAgXi/9XGAgXCRZQiYgAAiJDigAAMQCACGxvY2FsS2V5I2YxAIAEcGZvb4AFAANiYXJmKEm8SIAFAANiYXq/gCFwAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAOAEAAAAAAAAAADAAAAAAAAAAG/iSJDgAS4RHs2NhoAjgH/8QCABDltVQ42GgCOAf8WAIAEAaOj/zYaAI4B/2wA' + ), + clearStateProgram: base64ToBytes('Cg=='), + creator: algosdk.Address.fromString('25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE'), + globalState: [ toTealKeyValue({ key: 'Z2xvYmFsS2V5', value: { @@ -125,13 +128,13 @@ export const applicationResultMother = { }, }), ], - 'global-state-schema': { - 'num-byte-slice': 37, - 'num-uint': 1, + globalStateSchema: { + numByteSlice: 37, + numUint: 1, }, - 'local-state-schema': { - 'num-byte-slice': 13, - 'num-uint': 1, + localStateSchema: { + numByteSlice: 13, + numUint: 1, }, }, }) @@ -139,13 +142,14 @@ export const applicationResultMother = { // This app is associated with the Arc56 sample-three app spec 'localnet-5103': () => { return new ApplicationResultBuilder({ - id: 5103, + id: 5103n, params: { - 'approval-program': - 'CiABATEYFIEGCzEZCI0MALQAwgAAAAAAAAAAAKYAAAAAAAAAAAAAAIAEFR98dTYaAUkVgSASRIgABFCwIkOKAQGL/1cQCBeL/1cYCBcMQQABAIAFAANmb2+ABAANACVni/9XAAgXi/9XCAgXCBaL/1cQCBeL/1cYCBcJFlCJiAACIkOKAAAxAIADZm9vgAUAA2JhcmaAIAAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAADgBAAAAAAAAAAAwAAAAAAAAABv4kiQ4AEuER7NjYaAI4B//EAgAQ5bVUONhoAjgH/QACABAGjo/82GgCOAf+IAA==', - 'clear-state-program': 'Cg==', - creator: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', - 'global-state': [ + approvalProgram: base64ToBytes( + 'CiABATEYFIEGCzEZCI0MALQAwgAAAAAAAAAAAKYAAAAAAAAAAAAAAIAEFR98dTYaAUkVgSASRIgABFCwIkOKAQGL/1cQCBeL/1cYCBcMQQABAIAFAANmb2+ABAANACVni/9XAAgXi/9XCAgXCBaL/1cQCBeL/1cYCBcJFlCJiAACIkOKAAAxAIADZm9vgAUAA2JhcmaAIAAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAADgBAAAAAAAAAAAwAAAAAAAAABv4kiQ4AEuER7NjYaAI4B//EAgAQ5bVUONhoAjgH/QACABAGjo/82GgCOAf+IAA==' + ), + clearStateProgram: base64ToBytes('Cg=='), + creator: algosdk.Address.fromString('25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE'), + globalState: [ toTealKeyValue({ key: 'AANmb28=', value: { @@ -155,13 +159,13 @@ export const applicationResultMother = { }, }), ], - 'global-state-schema': { - 'num-byte-slice': 37, - 'num-uint': 0, + globalStateSchema: { + numByteSlice: 37, + numUint: 0, }, - 'local-state-schema': { - 'num-byte-slice': 13, - 'num-uint': 0, + localStateSchema: { + numByteSlice: 13, + numUint: 0, }, }, }) diff --git a/src/tests/object-mother/asset-result.ts b/src/tests/object-mother/asset-result.ts index 4da05b5c5..1c94a9d6c 100644 --- a/src/tests/object-mother/asset-result.ts +++ b/src/tests/object-mother/asset-result.ts @@ -1,502 +1,502 @@ -import { AssetResult } from '@algorandfoundation/algokit-utils/types/indexer' import { AssetResultBuilder } from '../builders/asset-result-builder' +import { AssetResult } from '@/features/assets/data/types' const encoder = new TextEncoder() export const assetResultMother = { ['mainnet-140479105']: () => { return new AssetResultBuilder({ - index: 140479105, + index: 140479105n, params: { clawback: 'LINTQTVHWUFZR677Z6GD3MTVWEXDX26Z2V7Q7QSD6NOQ6WOZTMSIMYCQE4', creator: 'LINTQTVHWUFZR677Z6GD3MTVWEXDX26Z2V7Q7QSD6NOQ6WOZTMSIMYCQE4', decimals: 2, - 'default-frozen': false, + defaultFrozen: false, freeze: 'LINTQTVHWUFZR677Z6GD3MTVWEXDX26Z2V7Q7QSD6NOQ6WOZTMSIMYCQE4', manager: 'LINTQTVHWUFZR677Z6GD3MTVWEXDX26Z2V7Q7QSD6NOQ6WOZTMSIMYCQE4', name: 'Clyders', - 'name-b64': encoder.encode('Q2x5ZGVycw=='), + nameB64: encoder.encode('Q2x5ZGVycw=='), reserve: 'LINTQTVHWUFZR677Z6GD3MTVWEXDX26Z2V7Q7QSD6NOQ6WOZTMSIMYCQE4', - total: 1000000000, - 'unit-name': 'CLY', - 'unit-name-b64': encoder.encode('Q0xZ'), + total: 1000000000n, + unitName: 'CLY', + unitNameB64: encoder.encode('Q0xZ'), url: 'https://www.joinclyde.com/', - 'url-b64': encoder.encode('aHR0cHM6Ly93d3cuam9pbmNseWRlLmNvbS8='), + urlB64: encoder.encode('aHR0cHM6Ly93d3cuam9pbmNseWRlLmNvbS8='), }, } satisfies AssetResult) }, ['mainnet-523683256']: () => { return new AssetResultBuilder({ - index: 523683256, + index: 523683256n, params: { creator: 'QUUQHH4HJ3FHUWMKTKFBUA72XTSW6F7YLLTRI7FWENJBKQYWTESSCZPQLU', decimals: 6, - 'default-frozen': false, + defaultFrozen: false, manager: 'QUUQHH4HJ3FHUWMKTKFBUA72XTSW6F7YLLTRI7FWENJBKQYWTESSCZPQLU', name: 'AKITA INU', - 'name-b64': encoder.encode('QUtJVEEgSU5V'), + nameB64: encoder.encode('QUtJVEEgSU5V'), reserve: 'QUUQHH4HJ3FHUWMKTKFBUA72XTSW6F7YLLTRI7FWENJBKQYWTESSCZPQLU', - total: 1000000000000000, - 'unit-name': 'AKTA', - 'unit-name-b64': encoder.encode('QUtUQQ=='), + total: 1000000000000000n, + unitName: 'AKTA', + unitNameB64: encoder.encode('QUtUQQ=='), url: 'https://akita.community/', - 'url-b64': encoder.encode('aHR0cHM6Ly9ha2l0YS5jb21tdW5pdHkv'), + urlB64: encoder.encode('aHR0cHM6Ly9ha2l0YS5jb21tdW5pdHkv'), }, } satisfies AssetResult) }, ['mainnet-312769']: () => { return new AssetResultBuilder({ - index: 312769, + index: 312769n, params: { clawback: 'XIU7HGGAJ3QOTATPDSIIHPFVKMICXKHMOR2FJKHTVLII4FAOA3CYZQDLG4', creator: 'XIU7HGGAJ3QOTATPDSIIHPFVKMICXKHMOR2FJKHTVLII4FAOA3CYZQDLG4', decimals: 6, - 'default-frozen': false, + defaultFrozen: false, freeze: 'XIU7HGGAJ3QOTATPDSIIHPFVKMICXKHMOR2FJKHTVLII4FAOA3CYZQDLG4', manager: 'XIU7HGGAJ3QOTATPDSIIHPFVKMICXKHMOR2FJKHTVLII4FAOA3CYZQDLG4', name: 'Tether USDt', - 'name-b64': encoder.encode('VGV0aGVyIFVTRHQ='), + nameB64: encoder.encode('VGV0aGVyIFVTRHQ='), reserve: 'XIU7HGGAJ3QOTATPDSIIHPFVKMICXKHMOR2FJKHTVLII4FAOA3CYZQDLG4', total: 18446744073709552000n, - 'unit-name': 'USDt', - 'unit-name-b64': encoder.encode('VVNEdA=='), + unitName: 'USDt', + unitNameB64: encoder.encode('VVNEdA=='), url: 'tether.to', - 'url-b64': encoder.encode('dGV0aGVyLnRv'), + urlB64: encoder.encode('dGV0aGVyLnRv'), }, } satisfies AssetResult) }, ['testnet-642327435']: () => { return new AssetResultBuilder({ - index: 642327435, + index: 642327435n, params: { clawback: 'ATJJRFAQVMD3YVX47HZLK2GRNKZLS3YDRLJ62JJPLUCZPDJE7QPQZDTVGY', creator: 'ATJJRFAQVMD3YVX47HZLK2GRNKZLS3YDRLJ62JJPLUCZPDJE7QPQZDTVGY', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, freeze: 'ATJJRFAQVMD3YVX47HZLK2GRNKZLS3YDRLJ62JJPLUCZPDJE7QPQZDTVGY', manager: 'ATJJRFAQVMD3YVX47HZLK2GRNKZLS3YDRLJ62JJPLUCZPDJE7QPQZDTVGY', name: 'ASA $11_$28_$100', - 'name-b64': encoder.encode('QVNBICQxMV8kMjhfJDEwMA=='), + nameB64: encoder.encode('QVNBICQxMV8kMjhfJDEwMA=='), reserve: 'ATJJRFAQVMD3YVX47HZLK2GRNKZLS3YDRLJ62JJPLUCZPDJE7QPQZDTVGY', - total: 100, + total: 100n, url: 'https://path/to/my/asset/details', - 'url-b64': encoder.encode('aHR0cHM6Ly9wYXRoL3RvL215L2Fzc2V0L2RldGFpbHM='), + urlB64: encoder.encode('aHR0cHM6Ly9wYXRoL3RvL215L2Fzc2V0L2RldGFpbHM='), }, } satisfies AssetResult) }, ['mainnet-971381860']: () => { return new AssetResultBuilder({ - index: 971381860, + index: 971381860n, params: { creator: '2ZPNLKXWCOUJ2ONYWZEIWOUYRXL36VCIBGJ4ZJ2AAGET5SIRTHKSNFDJJ4', decimals: 6, - 'default-frozen': false, + defaultFrozen: false, name: 'Folks V2 Algo', - 'name-b64': encoder.encode('Rm9sa3MgVjIgQWxnbw=='), + nameB64: encoder.encode('Rm9sa3MgVjIgQWxnbw=='), reserve: '2ZPNLKXWCOUJ2ONYWZEIWOUYRXL36VCIBGJ4ZJ2AAGET5SIRTHKSNFDJJ4', total: 10000000000000000n, - 'unit-name': 'fALGO', - 'unit-name-b64': encoder.encode('ZkFMR08='), + unitName: 'fALGO', + unitNameB64: encoder.encode('ZkFMR08='), }, } satisfies AssetResult) }, ['mainnet-31566704']: () => { return new AssetResultBuilder({ - index: 31566704, + index: 31566704n, params: { creator: '2UEQTE5QDNXPI7M3TU44G6SYKLFWLPQO7EBZM7K7MHMQQMFI4QJPLHQFHM', decimals: 6, - 'default-frozen': false, + defaultFrozen: false, freeze: '3ERES6JFBIJ7ZPNVQJNH2LETCBQWUPGTO4ROA6VFUR25WFSYKGX3WBO5GE', manager: '37XL3M57AXBUJARWMT5R7M35OERXMH3Q22JMMEFLBYNDXXADGFN625HAL4', name: 'USDC', - 'name-b64': encoder.encode('VVNEQw=='), + nameB64: encoder.encode('VVNEQw=='), reserve: '2UEQTE5QDNXPI7M3TU44G6SYKLFWLPQO7EBZM7K7MHMQQMFI4QJPLHQFHM', total: 18446744073709552000n, - 'unit-name': 'USDC', - 'unit-name-b64': encoder.encode('VVNEQw=='), + unitName: 'USDC', + unitNameB64: encoder.encode('VVNEQw=='), url: 'https://www.centre.io/usdc', - 'url-b64': encoder.encode('aHR0cHM6Ly93d3cuY2VudHJlLmlvL3VzZGM='), + urlB64: encoder.encode('aHR0cHM6Ly93d3cuY2VudHJlLmlvL3VzZGM='), }, } satisfies AssetResult) }, ['mainnet-386195940']: () => { return new AssetResultBuilder({ - index: 386195940, + index: 386195940n, params: { creator: 'ETGSQKACKC56JWGMDAEP5S2JVQWRKTQUVKCZTMPNUGZLDVCWPY63LSI3H4', decimals: 8, - 'default-frozen': false, + defaultFrozen: false, manager: 'PXLRHMSOTI5LDPRNMMM5F4NDPLCBTHNDLLSZSWFU722PNPMNKBZ2V3ONT4', - 'metadata-hash': encoder.encode('NGI5MjRiOWM0ZTU5NmUxMDU5OWNkZDg5YjkxZDQyMzk='), + metadataHash: encoder.encode('NGI5MjRiOWM0ZTU5NmUxMDU5OWNkZDg5YjkxZDQyMzk='), name: 'goETH', - 'name-b64': encoder.encode('Z29FVEg='), + nameB64: encoder.encode('Z29FVEg='), reserve: 'NLTFR6Y7AAQ6BFFE7NMNJRK3CIZ5U7KSSD6UDMVZ3WOW2TPALOEV57MEEA', total: 15000000000000000n, - 'unit-name': 'goETH', - 'unit-name-b64': encoder.encode('Z29FVEg='), + unitName: 'goETH', + unitNameB64: encoder.encode('Z29FVEg='), url: 'https://algomint.io', - 'url-b64': encoder.encode('aHR0cHM6Ly9hbGdvbWludC5pbw=='), + urlB64: encoder.encode('aHR0cHM6Ly9hbGdvbWludC5pbw=='), }, } satisfies AssetResult) }, ['mainnet-408898501']: () => { return new AssetResultBuilder({ - index: 408898501, + index: 408898501n, params: { creator: 'LOOTHTGZ5LIF6M5P6URZMW4BX5UO4IS7KBELOVQDTOJFPS4VGLGD2GA5I4', decimals: 1, - 'default-frozen': false, + defaultFrozen: false, manager: 'QZWWSDFQA6PMVEZF6MTNXHKGLT7KOWG62SFU2W4XQOUK7ENDHDZUVRBCYU', name: 'Loot Box', - 'name-b64': encoder.encode('TG9vdCBCb3g='), + nameB64: encoder.encode('TG9vdCBCb3g='), reserve: 'LOOTHTGZ5LIF6M5P6URZMW4BX5UO4IS7KBELOVQDTOJFPS4VGLGD2GA5I4', - total: 100000000, - 'unit-name': 'LTBX', - 'unit-name-b64': encoder.encode('TFRCWA=='), + total: 100000000n, + unitName: 'LTBX', + unitNameB64: encoder.encode('TFRCWA=='), }, } satisfies AssetResult) }, ['mainnet-1707148495']: () => { return new AssetResultBuilder({ - index: 1707148495, + index: 1707148495n, params: { creator: 'E4A6FVIHXSZ3F7QXRCOTYDDILVQYEBFH56HYDIIYX4SVXS2QX5GUTBVZHY', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, freeze: 'E4A6FVIHXSZ3F7QXRCOTYDDILVQYEBFH56HYDIIYX4SVXS2QX5GUTBVZHY', manager: 'E4A6FVIHXSZ3F7QXRCOTYDDILVQYEBFH56HYDIIYX4SVXS2QX5GUTBVZHY', name: 'Verification Lofty #29297', - 'name-b64': encoder.encode('VmVyaWZpY2F0aW9uIExvZnR5ICMyOTI5Nw=='), + nameB64: encoder.encode('VmVyaWZpY2F0aW9uIExvZnR5ICMyOTI5Nw=='), reserve: '3XAU3CYHZ3QX4M2DSTEMHPVKKJXSSDMMHADPM6SYRGQDCDQOAAYL3SQY5I', - total: 1, - 'unit-name': 'VL029297', - 'unit-name-b64': encoder.encode('VkwwMjkyOTc='), + total: 1n, + unitName: 'VL029297', + unitNameB64: encoder.encode('VkwwMjkyOTc='), url: 'template-ipfs://{ipfscid:1:raw:reserve:sha2-256}', - 'url-b64': encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6cmF3OnJlc2VydmU6c2hhMi0yNTZ9'), + urlB64: encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6cmF3OnJlc2VydmU6c2hhMi0yNTZ9'), }, } satisfies AssetResult) }, 'mainnet-1284444444': () => { return new AssetResultBuilder({ - 'created-at-round': 34632901, + createdAtRound: 34632901n, deleted: false, - index: 1284444444, + index: 1284444444n, params: { clawback: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', creator: 'JP3ENKDQC2BOYRMLFGKBS7RB2IVNF7VNHCFHVTRNHOENRQ6R4UN7MCNXPI', decimals: 8, - 'default-frozen': false, + defaultFrozen: false, freeze: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', manager: 'JP3ENKDQC2BOYRMLFGKBS7RB2IVNF7VNHCFHVTRNHOENRQ6R4UN7MCNXPI', - 'metadata-hash': encoder.encode('0/1Rvi7owrF6eugm00nA3yD+q4pNaAMDQBx0FWDDJDY='), + metadataHash: encoder.encode('0/1Rvi7owrF6eugm00nA3yD+q4pNaAMDQBx0FWDDJDY='), name: 'Orange', - 'name-b64': encoder.encode('T3Jhbmdl'), + nameB64: encoder.encode('T3Jhbmdl'), reserve: 'JP3ENKDQC2BOYRMLFGKBS7RB2IVNF7VNHCFHVTRNHOENRQ6R4UN7MCNXPI', - total: 400000000000000, - 'unit-name': 'ORA', - 'unit-name-b64': encoder.encode('T1JB'), + total: 400000000000000n, + unitName: 'ORA', + unitNameB64: encoder.encode('T1JB'), url: 'ipfs://QmUitxJuPJJrcuAdAiVdEEpuzGmsELGgAvhLd5FiXRShEu#arc3', - 'url-b64': encoder.encode('aXBmczovL1FtVWl0eEp1UEpKcmN1QWRBaVZkRUVwdXpHbXNFTEdnQXZoTGQ1RmlYUlNoRXUjYXJjMw=='), + urlB64: encoder.encode('aXBmczovL1FtVWl0eEp1UEpKcmN1QWRBaVZkRUVwdXpHbXNFTEdnQXZoTGQ1RmlYUlNoRXUjYXJjMw=='), }, }) }, 'mainnet-1494117806': () => { return new AssetResultBuilder({ - 'created-at-round': 36012728, + createdAtRound: 36012728n, deleted: false, - index: 1494117806, + index: 1494117806n, params: { clawback: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', creator: 'UF5DSSCT3GO62CSTSFB4QN5GNKFIMO7HCF2OIY6D57Z37IETEXRKUUNOPU', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, freeze: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', manager: 'UF5DSSCT3GO62CSTSFB4QN5GNKFIMO7HCF2OIY6D57Z37IETEXRKUUNOPU', name: 'Zappy #1620', - 'name-b64': encoder.encode('WmFwcHkgIzE2MjA='), + nameB64: encoder.encode('WmFwcHkgIzE2MjA='), reserve: 'OPL3M2ZOKLSPVIM32MRK45O6IQMHTJPVWOWPVTEGXVHC3GHFLJK2YC5OWE', - total: 1, - 'unit-name': 'ZAPP1620', - 'unit-name-b64': encoder.encode('WkFQUDE2MjA='), + total: 1n, + unitName: 'ZAPP1620', + unitNameB64: encoder.encode('WkFQUDE2MjA='), url: 'template-ipfs://{ipfscid:1:raw:reserve:sha2-256}#arc3', - 'url-b64': encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6cmF3OnJlc2VydmU6c2hhMi0yNTZ9I2FyYzM='), + urlB64: encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6cmF3OnJlc2VydmU6c2hhMi0yNTZ9I2FyYzM='), }, }) }, 'mainnet-1800979729': () => { return new AssetResultBuilder({ - 'created-at-round': 38393946, + createdAtRound: 38393946n, deleted: false, - index: 1800979729, + index: 1800979729n, params: { clawback: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', creator: 'EHYQCYHUC6CIWZLBX5TDTLVJ4SSVE4RRTMKFDCG4Z4Q7QSQ2XWIQPMKBPU', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, freeze: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', manager: 'EHYQCYHUC6CIWZLBX5TDTLVJ4SSVE4RRTMKFDCG4Z4Q7QSQ2XWIQPMKBPU', name: 'DHMα: M1 Solar Flare SCQCSO', - 'name-b64': encoder.encode('REhNzrE6IE0xIFNvbGFyIEZsYXJlIFNDUUNTTw=='), + nameB64: encoder.encode('REhNzrE6IE0xIFNvbGFyIEZsYXJlIFNDUUNTTw=='), reserve: 'ESK3ZHVALWTRWTEQVRO4ZGZGGOFCKCJNVE5ODFMPWICXVSJVJZYINHHYHE', - total: 1, - 'unit-name': 'SOLFLARE', - 'unit-name-b64': encoder.encode('U09MRkxBUkU='), + total: 1n, + unitName: 'SOLFLARE', + unitNameB64: encoder.encode('U09MRkxBUkU='), url: 'https://assets.datahistory.org/solar/SCQCSO.mp4#v', - 'url-b64': encoder.encode('aHR0cHM6Ly9hc3NldHMuZGF0YWhpc3Rvcnkub3JnL3NvbGFyL1NDUUNTTy5tcDQjdg=='), + urlB64: encoder.encode('aHR0cHM6Ly9hc3NldHMuZGF0YWhpc3Rvcnkub3JnL3NvbGFyL1NDUUNTTy5tcDQjdg=='), }, }) }, 'mainnet-854081201': () => { return new AssetResultBuilder({ - 'created-at-round': 23110800, + createdAtRound: 23110800n, deleted: false, - index: 854081201, + index: 854081201n, params: { clawback: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', creator: 'JUT54SRAQLZ34MZ7I45KZJG63H3VLJ65VLLOLVVXPIBE3B2C7GFKBF5QAE', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, freeze: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', manager: 'JUT54SRAQLZ34MZ7I45KZJG63H3VLJ65VLLOLVVXPIBE3B2C7GFKBF5QAE', name: 'Bad Bunny Society #587', - 'name-b64': encoder.encode('QmFkIEJ1bm55IFNvY2lldHkgIzU4Nw=='), + nameB64: encoder.encode('QmFkIEJ1bm55IFNvY2lldHkgIzU4Nw=='), reserve: 'V4UCC2YXBHLELD7Y6HYSKZI4GABLUG5HE6HAQQ36OBXFEZS7W4VMWB6DUQ', - total: 1, - 'unit-name': 'bbs587', - 'unit-name-b64': encoder.encode('YmJzNTg3'), + total: 1n, + unitName: 'bbs587', + unitNameB64: encoder.encode('YmJzNTg3'), url: 'template-ipfs://{ipfscid:1:raw:reserve:sha2-256}', - 'url-b64': encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6cmF3OnJlc2VydmU6c2hhMi0yNTZ9'), + urlB64: encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6cmF3OnJlc2VydmU6c2hhMi0yNTZ9'), }, }) }, 'mainnet-917559': () => { return new AssetResultBuilder({ - 'created-at-round': 6354271, + createdAtRound: 6354271n, deleted: true, - 'destroyed-at-round': 6354625, - index: 917559, + destroyedAtRound: 6354625n, + index: 917559n, params: { clawback: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', creator: 'YA2XBMS34J27VKLIWJQ5AWU7FJASZ6PUNICQOB4PJ2NW4CAX5AHB7RVGMY', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, freeze: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', manager: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', reserve: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', - total: 0, + total: 0n, }, }) }, 'mainnet-1820067164': () => { return new AssetResultBuilder({ - index: 1820067164, + index: 1820067164n, params: { creator: 'COOPLFOESCTQJVLSFKAA4QURNBDZGMRYJVRH7BRRREB7FFZSHIIA4AVIBE', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, manager: 'COOPLFOESCTQJVLSFKAA4QURNBDZGMRYJVRH7BRRREB7FFZSHIIA4AVIBE', name: 'Coop #48', - 'name-b64': encoder.encode('Q29vcCAjNDg='), + nameB64: encoder.encode('Q29vcCAjNDg='), reserve: '6ZTNQ3SPQEYOWIXZHQR6HSX6CZSQ4FLYOXOCPNJSNRRT6QA2FFD6JIBDSI', - total: 1, - 'unit-name': 'Coop48', - 'unit-name-b64': encoder.encode('Q29vcDQ4'), + total: 1n, + unitName: 'Coop48', + unitNameB64: encoder.encode('Q29vcDQ4'), url: 'template-ipfs://{ipfscid:1:raw:reserve:sha2-256}', - 'url-b64': encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6cmF3OnJlc2VydmU6c2hhMi0yNTZ9'), + urlB64: encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6cmF3OnJlc2VydmU6c2hhMi0yNTZ9'), }, }) }, 'mainnet-924268058': () => { return new AssetResultBuilder({ - index: 924268058, + index: 924268058n, params: { creator: 'V6SGZIWO6OAKUTKERDUFACQBPXMGPCNGEYMUANHRZA475YONW5B4BBLVL4', decimals: 6, - 'default-frozen': false, + defaultFrozen: false, manager: 'ATPVJYGEGP5H6GCZ4T6CG4PK7LH5OMWXHLXZHDPGO7RO6T3EHWTF6UUY6E', name: 'FrysCrypto', - 'name-b64': encoder.encode('RnJ5c0NyeXB0bw=='), + nameB64: encoder.encode('RnJ5c0NyeXB0bw=='), reserve: 'ATPVJYGEGP5H6GCZ4T6CG4PK7LH5OMWXHLXZHDPGO7RO6T3EHWTF6UUY6E', - total: 8000000000000000, - 'unit-name': 'FRY', - 'unit-name-b64': encoder.encode('RlJZ'), + total: 8000000000000000n, + unitName: 'FRY', + unitNameB64: encoder.encode('RlJZ'), url: 'https://fryscryptoexcursions.com', - 'url-b64': encoder.encode('aHR0cHM6Ly9mcnlzY3J5cHRvZXhjdXJzaW9ucy5jb20='), + urlB64: encoder.encode('aHR0cHM6Ly9mcnlzY3J5cHRvZXhjdXJzaW9ucy5jb20='), }, }) }, 'mainnet-1010208883': () => { return new AssetResultBuilder({ - index: 1010208883, + index: 1010208883n, params: { creator: 'XSKED5VKZZCSYNDWXZJI65JM2HP7HZFJWCOBIMOONKHTK5UVKENBNVDEYM', decimals: 6, - 'default-frozen': false, - 'metadata-hash': encoder.encode('AAAAADcXNhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='), + defaultFrozen: false, + metadataHash: encoder.encode('AAAAADcXNhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='), name: 'TinymanPool2.0 FRY-ALGO', - 'name-b64': encoder.encode('VGlueW1hblBvb2wyLjAgRlJZLUFMR08='), + nameB64: encoder.encode('VGlueW1hblBvb2wyLjAgRlJZLUFMR08='), reserve: 'YLNMUHDGH2G7G2PQMSU7K4TEQ6JPNE752LLXECCA7XCE3AB7JO3I3HQTDQ', total: 18446744073709551615n, - 'unit-name': 'TMPOOL2', - 'unit-name-b64': encoder.encode('VE1QT09MMg=='), + unitName: 'TMPOOL2', + unitNameB64: encoder.encode('VE1QT09MMg=='), url: 'https://tinyman.org', - 'url-b64': encoder.encode('aHR0cHM6Ly90aW55bWFuLm9yZw=='), + urlB64: encoder.encode('aHR0cHM6Ly90aW55bWFuLm9yZw=='), }, }) }, 'mainnet-1096015467': () => { return new AssetResultBuilder({ - index: 1096015467, + index: 1096015467n, params: { creator: 'B34VMB7AAF2JZHLUZL4ROAFAV7Q5TY2JXFCDGAJFYHNQAMVE5BCGGVEGAE', decimals: 4, - 'default-frozen': false, + defaultFrozen: false, manager: 'B34VMB7AAF2JZHLUZL4ROAFAV7Q5TY2JXFCDGAJFYHNQAMVE5BCGGVEGAE', - 'metadata-hash': encoder.encode('MWQ3NWYwNGYwZmE5NDA3MDkxOWZkZDNlY2FhMmM1ZmQ='), + metadataHash: encoder.encode('MWQ3NWYwNGYwZmE5NDA3MDkxOWZkZDNlY2FhMmM1ZmQ='), name: 'Pepe', - 'name-b64': encoder.encode('UGVwZQ=='), + nameB64: encoder.encode('UGVwZQ=='), total: 4206899999999990000n, - 'unit-name': 'PEPE', - 'unit-name-b64': encoder.encode('UEVQRQ=='), + unitName: 'PEPE', + unitNameB64: encoder.encode('UEVQRQ=='), }, }) }, 'mainnet-1162292622': () => { return new AssetResultBuilder({ - index: 1162292622, + index: 1162292622n, params: { clawback: 'X2GAK5VORHXKCO54XYSP3AMP2MRFLGJTLDTZ66OA5XH4UEXIMPWHFWTQTA', creator: 'X2GAK5VORHXKCO54XYSP3AMP2MRFLGJTLDTZ66OA5XH4UEXIMPWHFWTQTA', decimals: 0, - 'default-frozen': true, + defaultFrozen: true, manager: 'X2GAK5VORHXKCO54XYSP3AMP2MRFLGJTLDTZ66OA5XH4UEXIMPWHFWTQTA', name: 'orange.algo', - 'name-b64': encoder.encode('b3JhbmdlLmFsZ28='), + nameB64: encoder.encode('b3JhbmdlLmFsZ28='), reserve: 'D5SUIQBFNJTDKF6SQLSQHOBFIO72C3NT3B24LLA6IQFB6CY2AQZU3Z7A2M', - total: 1, - 'unit-name': 'NFD', - 'unit-name-b64': encoder.encode('TkZE'), + total: 1n, + unitName: 'NFD', + unitNameB64: encoder.encode('TkZE'), url: 'template-ipfs://{ipfscid:1:dag-pb:reserve:sha2-256}/nfd.json', - 'url-b64': encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6ZGFnLXBiOnJlc2VydmU6c2hhMi0yNTZ9L25mZC5qc29u'), + urlB64: encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6ZGFnLXBiOnJlc2VydmU6c2hhMi0yNTZ9L25mZC5qc29u'), }, }) }, 'mainnet-1294765516': () => { return new AssetResultBuilder({ - index: 1294765516, + index: 1294765516n, params: { creator: 'XSKED5VKZZCSYNDWXZJI65JM2HP7HZFJWCOBIMOONKHTK5UVKENBNVDEYM', decimals: 6, - 'default-frozen': false, - 'metadata-hash': encoder.encode('AAAAAEyPERwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='), + defaultFrozen: false, + metadataHash: encoder.encode('AAAAAEyPERwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='), name: 'TinymanPool2.0 ORA-ALGO', - 'name-b64': encoder.encode('VGlueW1hblBvb2wyLjAgT1JBLUFMR08='), + nameB64: encoder.encode('VGlueW1hblBvb2wyLjAgT1JBLUFMR08='), reserve: 'TRCEY5UZGTATGTF5K3U42IMDT467D4EHV7S5MYJBMLMYARYJOZFATORMUM', total: 18446744073709551615n, - 'unit-name': 'TMPOOL2', - 'unit-name-b64': encoder.encode('VE1QT09MMg=='), + unitName: 'TMPOOL2', + unitNameB64: encoder.encode('VE1QT09MMg=='), url: 'https://tinyman.org', - 'url-b64': encoder.encode('aHR0cHM6Ly90aW55bWFuLm9yZw=='), + urlB64: encoder.encode('aHR0cHM6Ly90aW55bWFuLm9yZw=='), }, }) }, 'mainnet-1355858325': () => { return new AssetResultBuilder({ - index: 1355858325, + index: 1355858325n, params: { clawback: 'JTVFQXCOHCRFZ6FE3WRNAKXTV32OWIJLG6XVVQPYNWGTWO3R3PIQEFVXEU', creator: 'JTVFQXCOHCRFZ6FE3WRNAKXTV32OWIJLG6XVVQPYNWGTWO3R3PIQEFVXEU', decimals: 0, - 'default-frozen': true, + defaultFrozen: true, manager: 'JTVFQXCOHCRFZ6FE3WRNAKXTV32OWIJLG6XVVQPYNWGTWO3R3PIQEFVXEU', name: 'ora.algo', - 'name-b64': encoder.encode('b3JhLmFsZ28='), + nameB64: encoder.encode('b3JhLmFsZ28='), reserve: 'QFHY7RDHAEEEG6JUPJWNSELKAUDEUCL6QQNVB3JZFSEFSQG75DYVODMPMU', - total: 1, - 'unit-name': 'NFD', - 'unit-name-b64': encoder.encode('TkZE'), + total: 1n, + unitName: 'NFD', + unitNameB64: encoder.encode('TkZE'), url: 'template-ipfs://{ipfscid:1:dag-pb:reserve:sha2-256}/nfd.json', - 'url-b64': encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6ZGFnLXBiOnJlc2VydmU6c2hhMi0yNTZ9L25mZC5qc29u'), + urlB64: encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6ZGFnLXBiOnJlc2VydmU6c2hhMi0yNTZ9L25mZC5qc29u'), }, }) }, 'mainnet-1355898842': () => { return new AssetResultBuilder({ - index: 1355898842, + index: 1355898842n, params: { clawback: 'OOHFIBQPTGCV7XVSFC7A73ZW5GQRWX2Q2HM5SISPMTA3FN6S7N7ZPEJZLI', creator: 'OOHFIBQPTGCV7XVSFC7A73ZW5GQRWX2Q2HM5SISPMTA3FN6S7N7ZPEJZLI', decimals: 0, - 'default-frozen': true, + defaultFrozen: true, manager: 'OOHFIBQPTGCV7XVSFC7A73ZW5GQRWX2Q2HM5SISPMTA3FN6S7N7ZPEJZLI', name: 'rita.ora.algo', - 'name-b64': encoder.encode('cml0YS5vcmEuYWxnbw=='), + nameB64: encoder.encode('cml0YS5vcmEuYWxnbw=='), reserve: 'NOR6VRUCOVUMD2FSP2XGUHXCEROOC7OHW6C4WK2NHVQMZN6LUWBZ4ERVJI', - total: 1, - 'unit-name': 'NFD', - 'unit-name-b64': encoder.encode('TkZE'), + total: 1n, + unitName: 'NFD', + unitNameB64: encoder.encode('TkZE'), url: 'template-ipfs://{ipfscid:1:dag-pb:reserve:sha2-256}/nfd.json', - 'url-b64': encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6ZGFnLXBiOnJlc2VydmU6c2hhMi0yNTZ9L25mZC5qc29u'), + urlB64: encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6ZGFnLXBiOnJlc2VydmU6c2hhMi0yNTZ9L25mZC5qc29u'), }, }) }, 'mainnet-1024439078': () => { return new AssetResultBuilder({ - index: 1024439078, + index: 1024439078n, params: { clawback: 'KPVZ66IFE7KHQ6623XHTPVS3IL7BXBE3HXQG35J65CVDA54VLRPP4SVOU4', creator: 'KPVZ66IFE7KHQ6623XHTPVS3IL7BXBE3HXQG35J65CVDA54VLRPP4SVOU4', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, freeze: 'KPVZ66IFE7KHQ6623XHTPVS3IL7BXBE3HXQG35J65CVDA54VLRPP4SVOU4', manager: 'KPVZ66IFE7KHQ6623XHTPVS3IL7BXBE3HXQG35J65CVDA54VLRPP4SVOU4', name: 'Fracctal Token', - 'name-b64': encoder.encode('RnJhY2N0YWwgVG9rZW4='), + nameB64: encoder.encode('RnJhY2N0YWwgVG9rZW4='), reserve: 'YQTVEPKB4O5F26H76L5I7BA6VGCMRC6P2QSWRKG4KVJLJ62MVYTDJPM6KE', - total: 10000000000, - 'unit-name': 'FRACC', - 'unit-name-b64': encoder.encode('RlJBQ0M='), + total: 10000000000n, + unitName: 'FRACC', + unitNameB64: encoder.encode('RlJBQ0M='), url: 'template-ipfs://{ipfscid:0:dag-pb:reserve:sha2-256}', - 'url-b64': encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjA6ZGFnLXBiOnJlc2VydmU6c2hhMi0yNTZ9'), + urlB64: encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjA6ZGFnLXBiOnJlc2VydmU6c2hhMi0yNTZ9'), }, }) }, 'mainnet-850924184': () => { return new AssetResultBuilder({ - index: 850924184, + index: 850924184n, params: { creator: 'MDIVKI64M2HEKCWKH7SOTUXEEW6KNOYSAOBTDTS32KUQOGUT75D43MSP5M', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, manager: 'MDIVKI64M2HEKCWKH7SOTUXEEW6KNOYSAOBTDTS32KUQOGUT75D43MSP5M', name: 'Forest', - 'name-b64': encoder.encode('Rm9yZXN0'), + nameB64: encoder.encode('Rm9yZXN0'), reserve: 'MDIVKI64M2HEKCWKH7SOTUXEEW6KNOYSAOBTDTS32KUQOGUT75D43MSP5M', - total: 1, - 'unit-name': 'GEMS NFT', - 'unit-name-b64': encoder.encode('R0VNUyBORlQ='), + total: 1n, + unitName: 'GEMS NFT', + unitNameB64: encoder.encode('R0VNUyBORlQ='), url: 'ipfs://QmWJo2KjMnsjpnNusxLPSzyVMMiYPPVTSTGSHJQhJGUavr', - 'url-b64': encoder.encode('aXBmczovL1FtV0pvMktqTW5zanBuTnVzeExQU3p5Vk1NaVlQUFZUU1RHU0hKUWhKR1VhdnI='), + urlB64: encoder.encode('aXBmczovL1FtV0pvMktqTW5zanBuTnVzeExQU3p5Vk1NaVlQUFZUU1RHU0hKUWhKR1VhdnI='), }, }) }, 'mainnet-847594689': () => { return new AssetResultBuilder({ - index: 847594689, + index: 847594689n, params: { creator: 'PZNGYF4Y25GGO674BW4CRDHFKOKHMHZXSFXIKMYPEJCQAUTDH52WV24XTY', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, manager: 'PZNGYF4Y25GGO674BW4CRDHFKOKHMHZXSFXIKMYPEJCQAUTDH52WV24XTY', name: 'Headline(Rare)', - 'name-b64': encoder.encode('SGVhZGxpbmUoUmFyZSk='), + nameB64: encoder.encode('SGVhZGxpbmUoUmFyZSk='), reserve: 'PZNGYF4Y25GGO674BW4CRDHFKOKHMHZXSFXIKMYPEJCQAUTDH52WV24XTY', - total: 250, - 'unit-name': 'HEAD-1', - 'unit-name-b64': encoder.encode('SEVBRC0x'), + total: 250n, + unitName: 'HEAD-1', + unitNameB64: encoder.encode('SEVBRC0x'), url: 'https://algoleagues.mypinata.cloud/ipfs/QmZMLEVGvBqHWMGb3MbkfCKR7G5bnLMRUZnquJE1FsEucZ', - 'url-b64': encoder.encode( + urlB64: encoder.encode( 'aHR0cHM6Ly9hbGdvbGVhZ3Vlcy5teXBpbmF0YS5jbG91ZC9pcGZzL1FtWk1MRVZHdkJxSFdNR2IzTWJrZkNLUjdHNWJuTE1SVVpucXVKRTFGc0V1Y1o=' ), }, @@ -504,135 +504,135 @@ export const assetResultMother = { }, 'mainnet-880903652': () => { return new AssetResultBuilder({ - index: 880903652, + index: 880903652n, params: { clawback: 'EP3I5HF6N3B7NSLVJ5YOZNTW3B4L46RUTELW6GIWZZ6ZCV5XOVT5PTOHAI', creator: 'X6MNR4AVJQEMJRHAPZ6F4O4SVDIYN67ZRMD2O3ULPY4QFMANQNZOEYHODE', decimals: 0, - 'default-frozen': true, + defaultFrozen: true, freeze: 'EMWPXNULSR3US737FFOSEJJB4B3R5BJQRYCVYPJSP7IUBRXUN3LF4MG2NA', manager: 'EMWPXNULSR3US737FFOSEJJB4B3R5BJQRYCVYPJSP7IUBRXUN3LF4MG2NA', - 'metadata-hash': encoder.encode('GXcG0xwqXopAsImnHMHXwZCWETndsst2oWvmEOa2Vg4='), + metadataHash: encoder.encode('GXcG0xwqXopAsImnHMHXwZCWETndsst2oWvmEOa2Vg4='), name: 'D01-04 #6588', - 'name-b64': encoder.encode('RDAxLTA0ICM2NTg4'), + nameB64: encoder.encode('RDAxLTA0ICM2NTg4'), reserve: 'EMWPXNULSR3US737FFOSEJJB4B3R5BJQRYCVYPJSP7IUBRXUN3LF4MG2NA', - total: 1, - 'unit-name': 'D01-04', - 'unit-name-b64': encoder.encode('RDAxLTA0'), + total: 1n, + unitName: 'D01-04', + unitNameB64: encoder.encode('RDAxLTA0'), url: 'ipfs://QmPsu35dDEbyQeNiTRPvTLgxbsjMSQB3GAQopi9Li15Qo2#arc3', - 'url-b64': encoder.encode('aXBmczovL1FtUHN1MzVkREVieVFlTmlUUlB2VExneGJzak1TUUIzR0FRb3BpOUxpMTVRbzIjYXJjMw==)'), + urlB64: encoder.encode('aXBmczovL1FtUHN1MzVkREVieVFlTmlUUlB2VExneGJzak1TUUIzR0FRb3BpOUxpMTVRbzIjYXJjMw==)'), }, }) }, 'testnet-210971834': () => { return new AssetResultBuilder({ - index: 210971834, + index: 210971834n, params: { clawback: 'LTBSRXEMYSIPDDKNSJUHMKJQSK3JJHZVGSSPXHDYBC5GTOU6V7HQTM7RHI', creator: 'LTBSRXEMYSIPDDKNSJUHMKJQSK3JJHZVGSSPXHDYBC5GTOU6V7HQTM7RHI', decimals: 6, - 'default-frozen': false, + defaultFrozen: false, freeze: 'LTBSRXEMYSIPDDKNSJUHMKJQSK3JJHZVGSSPXHDYBC5GTOU6V7HQTM7RHI', manager: 'LTBSRXEMYSIPDDKNSJUHMKJQSK3JJHZVGSSPXHDYBC5GTOU6V7HQTM7RHI', name: 'CT-TEF - Laza-Touza', - 'name-b64': encoder.encode('Q1QtVEVGIC0gTGF6YS1Ub3V6YQ=='), + nameB64: encoder.encode('Q1QtVEVGIC0gTGF6YS1Ub3V6YQ=='), reserve: 'LTBSRXEMYSIPDDKNSJUHMKJQSK3JJHZVGSSPXHDYBC5GTOU6V7HQTM7RHI', - total: 9223372036854776000, - 'unit-name': 'CO2P', - 'unit-name-b64': encoder.encode('Q08yUA=='), + total: 9223372036854776000n, + unitName: 'CO2P', + unitNameB64: encoder.encode('Q08yUA=='), url: 'https://www.climatetrade.com', - 'url-b64': encoder.encode('aHR0cHM6Ly93d3cuY2xpbWF0ZXRyYWRlLmNvbQ=='), + urlB64: encoder.encode('aHR0cHM6Ly93d3cuY2xpbWF0ZXRyYWRlLmNvbQ=='), }, }) }, 'mainnet-909935715': () => { return new AssetResultBuilder({ - index: 909935715, + index: 909935715n, params: { creator: 'CB3KEWUQUTDHQ3TC4P65UQLHC3S7KNBWPTHOFAL7CV4QCDUPDNVY5J3BT4', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, manager: 'CB3KEWUQUTDHQ3TC4P65UQLHC3S7KNBWPTHOFAL7CV4QCDUPDNVY5J3BT4', - 'metadata-hash': encoder.encode('oI4v6jtZzOWqm+GCfJaLS/FU8QjgR+1EawzZMvonXA0='), + metadataHash: encoder.encode('oI4v6jtZzOWqm+GCfJaLS/FU8QjgR+1EawzZMvonXA0='), name: 'NK 0217', - 'name-b64': encoder.encode('TksgMDIxNw=='), - total: 1, - 'unit-name': 'NK 0217', - 'unit-name-b64': encoder.encode('TksgMDIxNw=='), + nameB64: encoder.encode('TksgMDIxNw=='), + total: 1n, + unitName: 'NK 0217', + unitNameB64: encoder.encode('TksgMDIxNw=='), url: 'ipfs://QmfYFvNon3vfxbwtcetjYc1uZZ1Faw7AsQtSzz45sxXnaj#arc3', - 'url-b64': encoder.encode('aXBmczovL1FtZllGdk5vbjN2Znhid3RjZXRqWWMxdVpaMUZhdzdBc1F0U3p6NDVzeFhuYWojYXJjMw=='), + urlB64: encoder.encode('aXBmczovL1FtZllGdk5vbjN2Znhid3RjZXRqWWMxdVpaMUZhdzdBc1F0U3p6NDVzeFhuYWojYXJjMw=='), }, }) }, 'testnet-705735468': () => { return new AssetResultBuilder({ - index: 705735468, + index: 705735468n, params: { clawback: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', creator: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, manager: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', name: 'Test', - 'name-b64': encoder.encode('VGVzdA=='), - total: 1, - 'unit-name': 'test', - 'unit-name-b64': encoder.encode('dGVzdA=='), + nameB64: encoder.encode('VGVzdA=='), + total: 1n, + unitName: 'test', + unitNameB64: encoder.encode('dGVzdA=='), }, }) }, 'testnet-705736233': () => { return new AssetResultBuilder({ - index: 705736233, + index: 705736233n, params: { clawback: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', creator: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, manager: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', name: 'Test', - 'name-b64': encoder.encode('VGVzdA=='), - total: 1, - 'unit-name': 'test', - 'unit-name-b64': encoder.encode('dGVzdA=='), + nameB64: encoder.encode('VGVzdA=='), + total: 1n, + unitName: 'test', + unitNameB64: encoder.encode('dGVzdA=='), }, }) }, 'testnet-705736805': () => { return new AssetResultBuilder({ - index: 705736805, + index: 705736805n, params: { clawback: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', creator: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, manager: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', name: 'Test', - 'name-b64': encoder.encode('VGVzdA=='), - total: 1, - 'unit-name': 'test', - 'unit-name-b64': encoder.encode('dGVzdA=='), + nameB64: encoder.encode('VGVzdA=='), + total: 1n, + unitName: 'test', + unitNameB64: encoder.encode('dGVzdA=='), }, }) }, 'testnet-705457144': () => { return new AssetResultBuilder({ - index: 705457144, + index: 705457144n, params: { clawback: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', creator: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, freeze: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', manager: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', name: 'gold nugget', - 'name-b64': encoder.encode('Z29sZCBudWdnZXQ='), + nameB64: encoder.encode('Z29sZCBudWdnZXQ='), reserve: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', - total: 1, - 'unit-name': 'piece', - 'unit-name-b64': encoder.encode('cGllY2U='), + total: 1n, + unitName: 'piece', + unitNameB64: encoder.encode('cGllY2U='), url: 'https://path/to/my/asset/details', - 'url-b64': encoder.encode('aHR0cHM6Ly9wYXRoL3RvL215L2Fzc2V0L2RldGFpbHM='), + urlB64: encoder.encode('aHR0cHM6Ly9wYXRoL3RvL215L2Fzc2V0L2RldGFpbHM='), }, }) }, diff --git a/src/tests/object-mother/block-result.ts b/src/tests/object-mother/block-result.ts index cf034fb43..bb516bf92 100644 --- a/src/tests/object-mother/block-result.ts +++ b/src/tests/object-mother/block-result.ts @@ -1,4 +1,4 @@ -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' import { blockResultBuilder } from '../builders/block-result-builder' export const blockResultMother = { diff --git a/src/tests/object-mother/group-result.ts b/src/tests/object-mother/group-result.ts index 4906abf91..a03a515b1 100644 --- a/src/tests/object-mother/group-result.ts +++ b/src/tests/object-mother/group-result.ts @@ -1,4 +1,4 @@ -import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' +import { TransactionResult } from '@/features/transactions/data/types' import { groupResultBuilder } from '../builders/group-result-builder' export const groupResultMother = { diff --git a/src/tests/object-mother/transaction-result.ts b/src/tests/object-mother/transaction-result.ts index 8215fab4d..2bac2eaa3 100644 --- a/src/tests/object-mother/transaction-result.ts +++ b/src/tests/object-mother/transaction-result.ts @@ -1,6 +1,8 @@ -import { ApplicationOnComplete, AssetResult, TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer' import { TransactionResultBuilder, transactionResultBuilder } from '../builders/transaction-result-builder' -import { TransactionType } from 'algosdk' +import algosdk, { TransactionType } from 'algosdk' +import { AssetResult } from '@/features/assets/data/types' +import { ApplicationOnComplete } from '@algorandfoundation/algokit-utils/types/indexer' +import { base64ToBytes } from '@/utils/base64-to-bytes' const encoder = new TextEncoder() @@ -24,16 +26,16 @@ export const transactionResultMother = { multisig: { subsignature: [ { - 'public-key': 'hYkIN+Iyt2675q+XuYwoAzwR8B0P17WTUFGYn456E4o=', - signature: 'eBLuSsmbqXTtKcoDpI88t7CNyQ7ggJ8ZMGjpy+hLWnvjNi938/5U6Eb25Dmes0WLkCxnDZG7gsj3YIDmZfFLAA==', + publicKey: base64ToBytes('hYkIN+Iyt2675q+XuYwoAzwR8B0P17WTUFGYn456E4o='), + signature: base64ToBytes('eBLuSsmbqXTtKcoDpI88t7CNyQ7ggJ8ZMGjpy+hLWnvjNi938/5U6Eb25Dmes0WLkCxnDZG7gsj3YIDmZfFLAA=='), }, { - 'public-key': '5ChQFEXiHWTeXoJCRymNn8rmEAJAxpaigu4wIgcaODU=', - signature: '45ndEdxV115jUGBmqt4WSjcBDg847CiPlE0w5omziLftSRzOtJSd5zrF1zkHOa1B1GJV4AE8E2qriMIbifnYBw==', + publicKey: base64ToBytes('5ChQFEXiHWTeXoJCRymNn8rmEAJAxpaigu4wIgcaODU='), + signature: base64ToBytes('45ndEdxV115jUGBmqt4WSjcBDg847CiPlE0w5omziLftSRzOtJSd5zrF1zkHOa1B1GJV4AE8E2qriMIbifnYBw=='), }, { - 'public-key': 'RjQ91+zvYumrPm9UOEMN+GnlHW+0gliRCCV2b6KOlwk=', - signature: 'LbmMSdKaqD/s9M1ldNAvLYGRMwxWdVPbl4i2zBVKwRnrRLM1Ape9zWMAxX1yJGxk/mAKGa9lZwAfQUlyus58Cw==', + publicKey: base64ToBytes('RjQ91+zvYumrPm9UOEMN+GnlHW+0gliRCCV2b6KOlwk='), + signature: base64ToBytes('LbmMSdKaqD/s9M1ldNAvLYGRMwxWdVPbl4i2zBVKwRnrRLM1Ape9zWMAxX1yJGxk/mAKGa9lZwAfQUlyus58Cw=='), }, ], threshold: 3, @@ -45,117 +47,117 @@ export const transactionResultMother = { return transactionResultBuilder() .paymentTransaction() .withSignature({ - logicsig: { logic: 'CIEBQw==' }, + logicsig: { logic: base64ToBytes('CIEBQw==') }, }) }, assetConfig: () => { return transactionResultBuilder() - ['withTx-type'](TransactionType.acfg) - ['withAsset-config-transaction']({ - 'asset-id': 1234, + .withTxType(TransactionType.acfg) + .withAssetConfigTransaction({ + assetId: 1234n, params: { creator: 'EHYQCYHUC6CIWZLBX5TDTLVJ4SSVE4RRTMKFDCG4Z4Q7QSQ2XWIQPMKBPU', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, manager: 'EHYQCYHUC6CIWZLBX5TDTLVJ4SSVE4RRTMKFDCG4Z4Q7QSQ2XWIQPMKBPU', reserve: 'POMY37RQ5PYG2NHKEFVDVDKGWZLZ4NHUWUW57CVGZVIPZCTNAFE2JM7XQU', - total: 0, + total: 0n, }, }) }, ['mainnet-HEARTBEAT1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ']: () => { return new TransactionResultBuilder({ id: 'HEARTBEATHS44RJ4BQ6HOMWZCGOJW5WWOQ5CR7XHSZHFP2ZQCDOA', - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 34675056, - fee: 1000, - 'first-valid': 34675052, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', - 'intra-round-offset': 26, - 'last-valid': 34676052, - 'heartbeat-transaction': { - 'hb-address': '3WPMTZURXXNEB6CWHGHXQUSESVHYE3HK4G4XDW475BWSZBAUTW5YR7CY4E', - 'hb-key-dilution': 1001, - 'hb-proof': { - 'hb-pk': '6BDFpmMdLXhssJ9fCdVdnClCHe69LqnD70jik+AHANM=', - 'hb-pk1sig': 'IxENwM5zMaRkpeD/Iey3hunGVyVVV7c8c9b/p30ISn4t7NeRDwduAJtrL0IN29b32+Iw+aRDxSCDCZQfXGG3Ag==', - 'hb-pk2': 'EMBIuwJ9FOl7dce/JBgUJloa1DQwCIv+aVN6bxO4AF0=', - 'hb-pk2sig': 'Uj5lV61RtbCl0WjmeX+6AKAX93unmpjXxw7QST+np0VQhiei0qcp0feKj1oz8tEJScB/vHtvQM4uC8yNELBMCQ==', - 'hb-sig': 'NGIPT/Q+2EaBkU/wPOK0bJrQdc2TNj08IaZRZxrL4tJnq1vT87p6m2kF5wYyrPK4cdhhaw4pK7lxPOlKQ+YHAg==', - }, - 'hb-seed': 'OU1+MWj4jCD4xstyaYpS/6ec7aHxqaQpdJO1h3e3Uu0=', - 'hb-vote-id': 'wibDDqw0IqhBTI4Kz7bBGC1KU4rpjVyLH75aXWnQ8Q8=', - }, - 'receiver-rewards': 0, - 'round-time': 1703439471, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 34675056n, + fee: 1000n, + firstValid: 34675052n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', + intraRoundOffset: 26, + lastValid: 34676052n, + heartbeatTransaction: new algosdk.indexerModels.TransactionHeartbeat({ + hbAddress: '3WPMTZURXXNEB6CWHGHXQUSESVHYE3HK4G4XDW475BWSZBAUTW5YR7CY4E', + hbKeyDilution: 1001n, + hbProof: new algosdk.indexerModels.HbProofFields({ + hbPk: base64ToBytes('6BDFpmMdLXhssJ9fCdVdnClCHe69LqnD70jik+AHANM='), + hbPk1sig: base64ToBytes('IxENwM5zMaRkpeD/Iey3hunGVyVVV7c8c9b/p30ISn4t7NeRDwduAJtrL0IN29b32+Iw+aRDxSCDCZQfXGG3Ag=='), + hbPk2: base64ToBytes('EMBIuwJ9FOl7dce/JBgUJloa1DQwCIv+aVN6bxO4AF0='), + hbPk2sig: base64ToBytes('Uj5lV61RtbCl0WjmeX+6AKAX93unmpjXxw7QST+np0VQhiei0qcp0feKj1oz8tEJScB/vHtvQM4uC8yNELBMCQ=='), + hbSig: base64ToBytes('NGIPT/Q+2EaBkU/wPOK0bJrQdc2TNj08IaZRZxrL4tJnq1vT87p6m2kF5wYyrPK4cdhhaw4pK7lxPOlKQ+YHAg=='), + }), + hbSeed: base64ToBytes('OU1+MWj4jCD4xstyaYpS/6ec7aHxqaQpdJO1h3e3Uu0='), + hbVoteId: base64ToBytes('wibDDqw0IqhBTI4Kz7bBGC1KU4rpjVyLH75aXWnQ8Q8='), + }), + receiverRewards: 0n, + roundTime: 1703439471, sender: 'HEARTBEATADDRESS123456789ABCDEFGHIJKLMNOPQRSTUVW', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'HEARTBEATSIGNATURE123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ==', + sig: base64ToBytes('HEARTBEATSIGNATURE123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ=='), }, - 'tx-type': TransactionType.hb, + txType: TransactionType.hb, }) }, 'localnet-HEARTBEAT1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ': () => { return new TransactionResultBuilder({ - 'confirmed-round': 1000, - fee: 1000, - 'first-valid': 34675052, - 'genesis-hash': 'x9maOhZVCNkkZCgV6CcLpxd1ZgIgHwuAfg6fdG2FJo8=', - 'genesis-id': 'dockernet-v1', - 'heartbeat-transaction': { - 'hb-address': '3WPMTZURXXNEB6CWHGHXQUSESVHYE3HK4G4XDW475BWSZBAUTW5YR7CY4E', - 'hb-key-dilution': 1001, - 'hb-proof': { - 'hb-pk': '6BDFpmMdLXhssJ9fCdVdnClCHe69LqnD70jik+AHANM=', - 'hb-pk1sig': 'IxENwM5zMaRkpeD/Iey3hunGVyVVV7c8c9b/p30ISn4t7NeRDwduAJtrL0IN29b32+Iw+aRDxSCDCZQfXGG3Ag==', - 'hb-pk2': 'EMBIuwJ9FOl7dce/JBgUJloa1DQwCIv+aVN6bxO4AF0=', - 'hb-pk2sig': 'Uj5lV61RtbCl0WjmeX+6AKAX93unmpjXxw7QST+np0VQhiei0qcp0feKj1oz8tEJScB/vHtvQM4uC8yNELBMCQ==', - 'hb-sig': 'NGIPT/Q+2EaBkU/wPOK0bJrQdc2TNj08IaZRZxrL4tJnq1vT87p6m2kF5wYyrPK4cdhhaw4pK7lxPOlKQ+YHAg==', - }, - 'hb-seed': 'OU1+MWj4jCD4xstyaYpS/6ec7aHxqaQpdJO1h3e3Uu0=', - 'hb-vote-id': 'wibDDqw0IqhBTI4Kz7bBGC1KU4rpjVyLH75aXWnQ8Q8=', - }, + confirmedRound: 1000n, + fee: 1000n, + firstValid: 34675052n, + genesisHash: base64ToBytes('x9maOhZVCNkkZCgV6CcLpxd1ZgIgHwuAfg6fdG2FJo8='), + genesisId: 'dockernet-v1', + heartbeatTransaction: new algosdk.indexerModels.TransactionHeartbeat({ + hbAddress: '3WPMTZURXXNEB6CWHGHXQUSESVHYE3HK4G4XDW475BWSZBAUTW5YR7CY4E', + hbKeyDilution: 1001n, + hbProof: new algosdk.indexerModels.HbProofFields({ + hbPk: base64ToBytes('6BDFpmMdLXhssJ9fCdVdnClCHe69LqnD70jik+AHANM='), + hbPk1sig: base64ToBytes('IxENwM5zMaRkpeD/Iey3hunGVyVVV7c8c9b/p30ISn4t7NeRDwduAJtrL0IN29b32+Iw+aRDxSCDCZQfXGG3Ag=='), + hbPk2: base64ToBytes('EMBIuwJ9FOl7dce/JBgUJloa1DQwCIv+aVN6bxO4AF0='), + hbPk2sig: base64ToBytes('Uj5lV61RtbCl0WjmeX+6AKAX93unmpjXxw7QST+np0VQhiei0qcp0feKj1oz8tEJScB/vHtvQM4uC8yNELBMCQ=='), + hbSig: base64ToBytes('NGIPT/Q+2EaBkU/wPOK0bJrQdc2TNj08IaZRZxrL4tJnq1vT87p6m2kF5wYyrPK4cdhhaw4pK7lxPOlKQ+YHAg=='), + }), + hbSeed: base64ToBytes('OU1+MWj4jCD4xstyaYpS/6ec7aHxqaQpdJO1h3e3Uu0='), + hbVoteId: base64ToBytes('wibDDqw0IqhBTI4Kz7bBGC1KU4rpjVyLH75aXWnQ8Q8='), + }), id: 'HEARTBEATHS44RJ4BQ6HOMWZCGOJW5WWOQ5CR7XHSZHFP2ZQCDOA', - 'last-valid': 34676052, - 'round-time': 1703439471, + lastValid: 34676052n, + roundTime: 1703439471, sender: 'GAU5WA6DT2EPFS6LKOA333BQP67NXIHZ7JPOOHMZWJDPZRL4XMHDDDUCKA', - 'tx-type': TransactionType.hb, - 'close-rewards': 0, - 'closing-amount': 0, - 'intra-round-offset': 0, - 'receiver-rewards': 0, - 'sender-rewards': 0, + txType: TransactionType.hb, + closeRewards: 0n, + closingAmount: 0n, + intraRoundOffset: 0, + receiverRewards: 0n, + senderRewards: 0n, }) }, ['mainnet-FBORGSDC4ULLWHWZUMUFIYQLSDC26HGLTFD7EATQDY37FHCIYBBQ']: () => { return new TransactionResultBuilder({ id: 'FBORGSDC4ULLWHWZUMUFIYQLSDC26HGLTFD7EATQDY37FHCIYBBQ', - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36570178, - fee: 1000, - 'first-valid': 36570176, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', - 'intra-round-offset': 86, - 'last-valid': 36571176, - note: 'MTM0MDI4MzIxNDIxMjQ3NzQ6NjM5NDYxOTE2MDI4MzUwNzcxMg==', - 'payment-transaction': { - amount: 236070000, - 'close-amount': 0, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36570178n, + fee: 1000n, + firstValid: 36570176n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', + intraRoundOffset: 86, + lastValid: 36571176n, + note: base64ToBytes('MTM0MDI4MzIxNDIxMjQ3NzQ6NjM5NDYxOTE2MDI4MzUwNzcxMg=='), + paymentTransaction: { + amount: 236070000n, + closeAmount: 0n, receiver: 'KIZLH4HUM5ZIB5RVP6DR2IGXB44TGJ6HZUZIAYZFZ63KWCAQB2EZGPU5BQ', }, - 'receiver-rewards': 0, - 'round-time': 1709189521, + receiverRewards: 0n, + roundTime: 1709189521, sender: 'M3IAMWFYEIJWLWFIIOEDFOLGIVMEOB3F4I3CA4BIAHJENHUUSX63APOXXM', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: '4cwwpWiOnldnkW+M8Epwg2iaJvxdIvnUa9jM+uZxRcBTESRCD/BcsvbPVYrqEf6YwGCtsupNbNo6SwdUQRa2CQ==', + sig: base64ToBytes('4cwwpWiOnldnkW+M8Epwg2iaJvxdIvnUa9jM+uZxRcBTESRCD/BcsvbPVYrqEf6YwGCtsupNbNo6SwdUQRa2CQ=='), }, - 'tx-type': TransactionType.pay, + txType: TransactionType.pay, }) }, ['mainnet-ILDCD5Z64CYSLEZIHBG5DVME2ITJI2DIVZAPDPEWPCYMTRA5SVGA']: () => { @@ -163,217 +165,231 @@ export const transactionResultMother = { // - Same sender and receiver return new TransactionResultBuilder({ id: 'ILDCD5Z64CYSLEZIHBG5DVME2ITJI2DIVZAPDPEWPCYMTRA5SVGA', - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 34675056, - fee: 0, - 'first-valid': 34675052, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', - group: '5HGmi2n3M2zk/mzPEFkLnNomDu/jvwHs1k+bCZzIbNs=', - 'intra-round-offset': 26, - 'last-valid': 34676052, - note: 'aXBmczovL2JhZnliZWlhZGg2bGVia3A0d3l6dHZnNDRhdHp4aXg0NmduNWZ6bnJnN2tlNGEyd200NXNpazJ6d3Zt', - 'payment-transaction': { - amount: 0, - 'close-amount': 0, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 34675056n, + fee: 0n, + firstValid: 34675052n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', + group: base64ToBytes('5HGmi2n3M2zk/mzPEFkLnNomDu/jvwHs1k+bCZzIbNs='), + intraRoundOffset: 26, + lastValid: 34676052n, + note: base64ToBytes('aXBmczovL2JhZnliZWlhZGg2bGVia3A0d3l6dHZnNDRhdHp4aXg0NmduNWZ6bnJnN2tlNGEyd200NXNpazJ6d3Zt'), + paymentTransaction: { + amount: 0n, + closeAmount: 0n, receiver: 'TDV4LF2HO7NWHQPDQWTQWXWXKZ4W6N7UA2N6GJ6PKP6WSP6J2YIPUCQNHM', }, - 'receiver-rewards': 0, - 'round-time': 1703439471, + receiverRewards: 0n, + roundTime: 1703439471, sender: 'TDV4LF2HO7NWHQPDQWTQWXWXKZ4W6N7UA2N6GJ6PKP6WSP6J2YIPUCQNHM', - 'sender-rewards': 0, + senderRewards: 0n, signature: { logicsig: { args: [], - logic: - 'BiACAQAyBIECEjMAECISEDMBECISEEAAAQAzABAiEjMAAIAgmuynOZoqgz+a/xcbx+bwgMhYYxATBclcyl1ZYTKM4XQSEDMABzMBABIQMwAgMgMSEDMACTIDEhAzARAiEjMBCCMSEDMBADMBBxIQMwEFVwAHgAdpcGZzOi8vEhAzAQEjEhAzASAyAxIQMwEJMgMSEBBD', + logic: base64ToBytes( + 'BiACAQAyBIECEjMAECISEDMBECISEEAAAQAzABAiEjMAAIAgmuynOZoqgz+a/xcbx+bwgMhYYxATBclcyl1ZYTKM4XQSEDMABzMBABIQMwAgMgMSEDMACTIDEhAzARAiEjMBCCMSEDMBADMBBxIQMwEFVwAHgAdpcGZzOi8vEhAzAQEjEhAzASAyAxIQMwEJMgMSEBBD' + ), }, }, - 'tx-type': TransactionType.pay, + txType: TransactionType.pay, }) }, ['mainnet-JBDSQEI37W5KWPQICT2IGCG2FWMUGJEUYYK3KFKNSYRNAXU2ARUA']: () => { // Asset transfer transaction return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 300000, - 'asset-id': 523683256, - 'close-amount': 0, + assetTransferTransaction: { + amount: 300000n, + assetId: 523683256n, + closeAmount: 0n, receiver: 'OCD5PQECXPYOVTLWVS3FHIODQX5FOV4QNNVMU22BSVDMP2FAJD52OV4IFA', }, - 'auth-addr': 'P5F3CASEUYS5MBY56CZCKZM4EMJRG5MTYXIGVK6EHEB6FXRYMLE5VCTSUU', - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 37351572, - fee: 1000, - 'first-valid': 37351570, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', + authAddr: algosdk.Address.fromString('P5F3CASEUYS5MBY56CZCKZM4EMJRG5MTYXIGVK6EHEB6FXRYMLE5VCTSUU'), + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 37351572n, + fee: 1000n, + firstValid: 37351570n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', id: 'JBDSQEI37W5KWPQICT2IGCG2FWMUGJEUYYK3KFKNSYRNAXU2ARUA', - 'intra-round-offset': 114, - 'last-valid': 37352570, - note: 'AEYAcgBhAGMAYwB0AGEAbAAgAEEAbABlAHIAdAA6ACAAQQBjAHQAaQB2AGUAIABQAGwAYQB5AGUAcgAgAFIAZQB3AGEAcgBkAC4AIABUAGgAYQBuAGsAcwAgAGYAbwByACAAcABsAGEAeQBpAG4AZwAh', - 'receiver-rewards': 0, - 'round-time': 1711438129, + intraRoundOffset: 114, + lastValid: 37352570n, + note: base64ToBytes( + 'AEYAcgBhAGMAYwB0AGEAbAAgAEEAbABlAHIAdAA6ACAAQQBjAHQAaQB2AGUAIABQAGwAYQB5AGUAcgAgAFIAZQB3AGEAcgBkAC4AIABUAGgAYQBuAGsAcwAgAGYAbwByACAAcABsAGEAeQBpAG4AZwAh' + ), + receiverRewards: 0n, + roundTime: 1711438129, sender: '6MO6VE4DBZ2ZKNHHY747LABB5QGSH6V6IQ4EZZW2HXDFXHHQVKRIVRHSJM', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'hk4FtHwulzfGDFq13MFsJfVS4UVdQAGhqFvsp9CjF9F6dD3V/P0XtW4V3cv2l8u0M1TDQoUsNbueW+SaQbD7DA==', + sig: base64ToBytes('hk4FtHwulzfGDFq13MFsJfVS4UVdQAGhqFvsp9CjF9F6dD3V/P0XtW4V3cv2l8u0M1TDQoUsNbueW+SaQbD7DA=='), }, - 'tx-type': TransactionType.axfer, + txType: TransactionType.axfer, }) }, ['mainnet-V7GQPE5TDMB4BIW2GCTPCBMXYMCF3HQGLYOYHGWP256GQHN5QAXQ']: () => { // Asset transfer transaction with close remainder. It is an asset opt-out transaction. return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 0, - 'asset-id': 140479105, - 'close-amount': 0, - 'close-to': 'LINTQTVHWUFZR677Z6GD3MTVWEXDX26Z2V7Q7QSD6NOQ6WOZTMSIMYCQE4', + assetTransferTransaction: { + amount: 0n, + assetId: 140479105n, + closeAmount: 0n, + closeTo: 'LINTQTVHWUFZR677Z6GD3MTVWEXDX26Z2V7Q7QSD6NOQ6WOZTMSIMYCQE4', receiver: 'LINTQTVHWUFZR677Z6GD3MTVWEXDX26Z2V7Q7QSD6NOQ6WOZTMSIMYCQE4', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 30666726, - fee: 1000, - 'first-valid': 30666724, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 30666726n, + fee: 1000n, + firstValid: 30666724n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), id: 'V7GQPE5TDMB4BIW2GCTPCBMXYMCF3HQGLYOYHGWP256GQHN5QAXQ', - 'intra-round-offset': 18, - 'last-valid': 30667724, - 'receiver-rewards': 0, - 'round-time': 1689880083, + intraRoundOffset: 18, + lastValid: 30667724n, + receiverRewards: 0n, + roundTime: 1689880083, sender: 'J2WKA2P622UGRYLEQJPTM3K62RLWOKWSIY32A7HUNJ7HKQCRJANHNBFLBQ', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'fK9vks0Sk2Sfa0PN+9wHSYYh2OKCFxSGBN2B4agVmVNoui17XcwXj4DbLJZWoknbVH/0gaKweKEYMIz4Oe8tDw==', + sig: base64ToBytes('fK9vks0Sk2Sfa0PN+9wHSYYh2OKCFxSGBN2B4agVmVNoui17XcwXj4DbLJZWoknbVH/0gaKweKEYMIz4Oe8tDw=='), }, - 'tx-type': TransactionType.axfer, + txType: TransactionType.axfer, }) }, ['mainnet-563MNGEL2OF4IBA7CFLIJNMBETT5QNKZURSLIONJBTJFALGYOAUA']: () => { // Asset opt-in return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 0, - 'asset-id': 312769, - 'close-amount': 0, + assetTransferTransaction: { + amount: 0n, + assetId: 312769n, + closeAmount: 0n, receiver: 'SMO6HD4QPUGP2PI5HVE6SXQPBXGXOHB6HFKXY4RMUWM56S7BVDK2U7ALKU', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 6325026, - fee: 1000, - 'first-valid': 6324488, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 6325026n, + fee: 1000n, + firstValid: 6324488n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', id: '563MNGEL2OF4IBA7CFLIJNMBETT5QNKZURSLIONJBTJFALGYOAUA', - 'intra-round-offset': 0, - 'last-valid': 6325488, - note: 'MTU4ODAxMjcyNjU5OTgzNDM2OA==', - 'receiver-rewards': 0, - 'round-time': 1588015047, + intraRoundOffset: 0, + lastValid: 6325488n, + note: base64ToBytes('MTU4ODAxMjcyNjU5OTgzNDM2OA=='), + receiverRewards: 0n, + roundTime: 1588015047, sender: 'SMO6HD4QPUGP2PI5HVE6SXQPBXGXOHB6HFKXY4RMUWM56S7BVDK2U7ALKU', - 'sender-rewards': 0, - signature: { sig: 'eXs6In2s6DdoRIBHLesRRS9BX+UWykWX4YGPuTdOLJTn33NXM5paD7kZiB+4FQ27a+F7W2QEWJYU8QEzDHTVAQ==' }, - 'tx-type': TransactionType.axfer, + senderRewards: 0n, + signature: { + sig: base64ToBytes('eXs6In2s6DdoRIBHLesRRS9BX+UWykWX4YGPuTdOLJTn33NXM5paD7kZiB+4FQ27a+F7W2QEWJYU8QEzDHTVAQ=='), + }, + txType: TransactionType.axfer, }) }, ['mainnet-UFYPQDLWCVK3L5XVVHE7WBQWTW4YMHHKZSDIWXXV2AGCS646HTQA']: () => { return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 1, - 'asset-id': 1753701469, - 'close-amount': 0, + assetTransferTransaction: { + amount: 1n, + assetId: 1753701469n, + closeAmount: 0n, receiver: 'JQ76KXBOL3Z2EKRW43OPHOHKBZJQUULDAH33IIWDX2UWEYEMTKSX2PRS54', }, - 'auth-addr': '7R7I3FN4ACXN2CEU5WPDZJZR475OYQP43QESNXA3NDC4SUQZZSI5OGCVME', - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 38008738, - fee: 1000, - 'first-valid': 38008732, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', - group: 'XeNQmhxvtoWpue/7SAk6RNfuu/8Fp8tw8Nfn+HnIz00=', + authAddr: algosdk.Address.fromString('7R7I3FN4ACXN2CEU5WPDZJZR475OYQP43QESNXA3NDC4SUQZZSI5OGCVME'), + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 38008738n, + fee: 1000n, + firstValid: 38008732n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', + group: base64ToBytes('XeNQmhxvtoWpue/7SAk6RNfuu/8Fp8tw8Nfn+HnIz00='), id: 'UFYPQDLWCVK3L5XVVHE7WBQWTW4YMHHKZSDIWXXV2AGCS646HTQA', - 'intra-round-offset': 16, - 'last-valid': 38009732, - 'receiver-rewards': 0, - 'round-time': 1713332366, + intraRoundOffset: 16, + lastValid: 38009732n, + receiverRewards: 0n, + roundTime: 1713332366, sender: 'QUESTA6XV2JZ2XAV3EK3GKBHYCJO57JWUX6L6ENHGNLR6UE3OPCUCT2WLI', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: '2+WUUuw7ZHKjBFx3/ct+rdGQK/sv0u5ZSCN3+cnEE2KtvSbAMN3HYJaId9+tCWTlThGwHU0po4aCn1zFSh8hBg==', + sig: base64ToBytes('2+WUUuw7ZHKjBFx3/ct+rdGQK/sv0u5ZSCN3+cnEE2KtvSbAMN3HYJaId9+tCWTlThGwHU0po4aCn1zFSh8hBg=='), }, - 'tx-type': TransactionType.axfer, + txType: TransactionType.axfer, }) }, ['testnet-VIXTUMAPT7NR4RB2WVOGMETW4QY43KIDA3HWDWWXS3UEDKGTEECQ']: () => { // Asset clawback return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 5, - 'asset-id': 642327435, - 'close-amount': 0, + assetTransferTransaction: { + amount: 5n, + assetId: 642327435n, + closeAmount: 0n, receiver: 'ATSGPNTPGMJ2U3GQRSEXA2OZGFPMKPO66NNPIKFD4LHETHYIYRIRIN6GJE', sender: 'AT3QNHSO7VZ2CPEZGI4BG7M3TIUG7YE5KZXNAE55Z4QHHAGBEU6K2LCJUA', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 39050091, - fee: 1000, - 'first-valid': 39050089, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 39050091n, + fee: 1000n, + firstValid: 39050089n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', id: 'VIXTUMAPT7NR4RB2WVOGMETW4QY43KIDA3HWDWWXS3UEDKGTEECQ', - 'intra-round-offset': 9, - 'last-valid': 39051089, - note: 'VHJhbnNmZXIgNSBhc3NldHMgd2l0IGlkICQ2NDIzMjc0MzU=', - 'receiver-rewards': 0, - 'round-time': 1713177404, + intraRoundOffset: 9, + lastValid: 39051089n, + note: base64ToBytes('VHJhbnNmZXIgNSBhc3NldHMgd2l0IGlkICQ2NDIzMjc0MzU='), + receiverRewards: 0n, + roundTime: 1713177404, sender: 'ATJJRFAQVMD3YVX47HZLK2GRNKZLS3YDRLJ62JJPLUCZPDJE7QPQZDTVGY', - 'sender-rewards': 0, - signature: { sig: 'LYTng1fmA+JQ8AocqDfp/OBvrds/WXa936muT3b4Ym98qIzouEnbMf7cOj099GV+ABecBzmw6+JrzOH/WU7TDQ==' }, - 'tx-type': TransactionType.axfer, + senderRewards: 0n, + signature: { + sig: base64ToBytes('LYTng1fmA+JQ8AocqDfp/OBvrds/WXa936muT3b4Ym98qIzouEnbMf7cOj099GV+ABecBzmw6+JrzOH/WU7TDQ=='), + }, + txType: TransactionType.axfer, }) }, ['mainnet-KMNBSQ4ZFX252G7S4VYR4ZDZ3RXIET5CNYQVJUO5OXXPMHAMJCCQ']: () => { // App Call transaction with 2 inner transactions return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [], - 'application-args': ['6r6CnQ==', 'AAAAAAAAAAA=', 'AA==', 'AA==', 'AQ==', 'AQ=='], - 'application-id': 971368268, - 'foreign-apps': [971350278], - 'foreign-assets': [0, 971381860], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': ApplicationOnComplete.noop, - }, - 'auth-addr': '7ML3SONQTSKIPPWPFVVKBSEIKJS5FZXY3ABGPT43C3PP4SEKV3W7FAJOTE', - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 5000, - 'first-valid': 36591738, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', - 'global-state-delta': [ + applicationArgs: [ + base64ToBytes('6r6CnQ=='), + base64ToBytes('AAAAAAAAAAA='), + base64ToBytes('AA=='), + base64ToBytes('AA=='), + base64ToBytes('AQ=='), + base64ToBytes('AQ=='), + ], + applicationId: 971368268n, + foreignApps: [971350278n], + foreignAssets: [0n, 971381860n], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: ApplicationOnComplete.noop, + }, + authAddr: algosdk.Address.fromString('7ML3SONQTSKIPPWPFVVKBSEIKJS5FZXY3ABGPT43C3PP4SEKV3W7FAJOTE'), + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 5000n, + firstValid: 36591738n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', + globalStateDelta: [ { key: 'aQ==', value: { action: 1, bytes: 'AAONfqTGgAAAAAkYTnKgAAAca/UmNAAAAABZC8sUiKAAARg1PuJHngAAYtCCAWTGAAAAAGXhHFY=', - uint: 0, + uint: 0n, }, }, { @@ -382,7 +398,7 @@ export const transactionResultMother = { action: 1, bytes: 'AADMouUTEAAAAMyi5RMQAABHDeTfggAAAAqoe+5TgAAABxr9SY0AAAAf+XPK+oAAABHDeTfggAAABxr9SY0AAAAAAQXS3+IfAAR2O9R9MEEAAAAABGJpIfE2cs7Vt0ol', - uint: 0, + uint: 0n, }, }, { @@ -390,1005 +406,1042 @@ export const transactionResultMother = { value: { action: 1, bytes: 'AAC15iD0gAAAAzKLlExAAABHDeTfggAAAAAoa8i0brcAApIbjWwBBgAAZ/7Fy4wR', - uint: 0, + uint: 0n, }, }, ], - group: 'Tjo3cLO5x5GeMwmJLuJCQ1YT2FHkmUpVlSLbxRQDJ30=', + group: base64ToBytes('Tjo3cLO5x5GeMwmJLuJCQ1YT2FHkmUpVlSLbxRQDJ30='), id: 'KMNBSQ4ZFX252G7S4VYR4ZDZ3RXIET5CNYQVJUO5OXXPMHAMJCCQ', - 'inner-txns': [ - { - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 0, - 'first-valid': 36591738, - 'intra-round-offset': 93, - 'last-valid': 36592738, - 'payment-transaction': { - amount: 236706032, - 'close-amount': 0, + innerTxns: [ + { + id: 'KMNBSQ4ZFX252G7S4VYR4ZDZ3RXIET5CNYQVJUO5OXXPMHAMJCCQ/inner/1', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 0n, + firstValid: 36591738n, + intraRoundOffset: 93, + lastValid: 36592738n, + paymentTransaction: { + amount: 236706032n, + closeAmount: 0n, receiver: 'W2IZ3EHDRW2IQNPC33CI2CXSLMFCFICVKQVWIYLJWXCTD765RW47ONNCEY', }, - 'receiver-rewards': 0, - 'round-time': 1709251673, + receiverRewards: 0n, + roundTime: 1709251673, sender: '2ZPNLKXWCOUJ2ONYWZEIWOUYRXL36VCIBGJ4ZJ2AAGET5SIRTHKSNFDJJ4', - 'sender-rewards': 0, - 'tx-type': TransactionType.pay, - id: 'Inner 1', + senderRewards: 0n, + txType: TransactionType.pay, }, { - 'application-transaction': { + id: 'KMNBSQ4ZFX252G7S4VYR4ZDZ3RXIET5CNYQVJUO5OXXPMHAMJCCQ/inner/2', + applicationTransaction: { accounts: [], - 'application-args': ['NFDStA==', 'AA==', 'AAKSG41sAQY=', 'AABn/sXLjBE=', 'AAEYNT7iR54=', 'AABi0IIBZMY='], - 'application-id': 971350278, - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': ApplicationOnComplete.noop, - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 0, - 'first-valid': 36591738, - 'global-state-delta': [ + applicationArgs: [ + base64ToBytes('NFDStA=='), + base64ToBytes('AA=='), + base64ToBytes('AAKSG41sAQY='), + base64ToBytes('AABn/sXLjBE='), + base64ToBytes('AAEYNT7iR54='), + base64ToBytes('AABi0IIBZMY='), + ], + applicationId: 971350278n, + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: ApplicationOnComplete.noop, + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 0n, + firstValid: 36591738n, + globalStateDelta: [ { key: 'AA==', value: { action: 1, bytes: 'AAA55edMAAKSG41sAQYAAGf+xcuMEQABGDU+4keeAABi0IIBZMZl4RxWAAA55e5xAAAAAAAAAAAAAFrzEHpAAAAAAAAAAAAAAABa8xB6QABl4RwiAAA55fbNAATYpqnWEogAAGMuFh/4DQADIOTd7ygiAABfpOnjsPJl4RxW', - uint: 0, + uint: 0n, }, }, ], - 'intra-round-offset': 93, - 'last-valid': 36592738, - 'receiver-rewards': 0, - 'round-time': 1709251673, + intraRoundOffset: 93, + lastValid: 36592738n, + receiverRewards: 0n, + roundTime: 1709251673, sender: '2ZPNLKXWCOUJ2ONYWZEIWOUYRXL36VCIBGJ4ZJ2AAGET5SIRTHKSNFDJJ4', - 'sender-rewards': 0, - 'tx-type': TransactionType.appl, - id: 'Inner 2', + senderRewards: 0n, + txType: TransactionType.appl, }, ], - 'intra-round-offset': 93, - 'last-valid': 36592738, - logs: ['FR98dQAAAAAOG9jw'], - 'receiver-rewards': 0, - 'round-time': 1709251673, + intraRoundOffset: 93, + lastValid: 36592738n, + logs: [base64ToBytes('FR98dQAAAAAOG9jw')], + receiverRewards: 0n, + roundTime: 1709251673, sender: 'W2IZ3EHDRW2IQNPC33CI2CXSLMFCFICVKQVWIYLJWXCTD765RW47ONNCEY', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'trh33yIw7Tp52x0vgBmXhDB8um8QbIo6ncEL47vlzEt8DFZkVIeRYDwwiIPFipWTe99JEGK/T/fjYp9PGNRaCQ==', + sig: base64ToBytes('trh33yIw7Tp52x0vgBmXhDB8um8QbIo6ncEL47vlzEt8DFZkVIeRYDwwiIPFipWTe99JEGK/T/fjYp9PGNRaCQ=='), }, - 'tx-type': TransactionType.appl, - } as unknown as TransactionResult) // The type definition for App Call transaction in indexer seems to be wrong + txType: TransactionType.appl, + }) }, ['mainnet-INDQXWQXHF22SO45EZY7V6FFNI6WUD5FHRVDV6NCU6HD424BJGGA']: () => { // Big app call transaction with 9 inner transactions return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [ - 'EOXLRDMDV4Y7GEWY5GEDCIJV7SQM3A3TBHYAPBTWHS7JTOOYHZXPUEGCE4', - 'FCHEP67BCAA64RTZZNHLOUJF22TDWPWKSWO4FDRLLHC3NMKCCMRCKPIYSM', - '2PIFZW53RHCSFSYMCFUBW4XOCXOMB7XOYQSQ6KGT3KVGJTL4HM6COZRNMM', + algosdk.Address.fromString('EOXLRDMDV4Y7GEWY5GEDCIJV7SQM3A3TBHYAPBTWHS7JTOOYHZXPUEGCE4'), + algosdk.Address.fromString('FCHEP67BCAA64RTZZNHLOUJF22TDWPWKSWO4FDRLLHC3NMKCCMRCKPIYSM'), + algosdk.Address.fromString('2PIFZW53RHCSFSYMCFUBW4XOCXOMB7XOYQSQ6KGT3KVGJTL4HM6COZRNMM'), ], - 'application-args': ['AAAAAAAqRH0=', 'AAAAAAAAAAA=', '//8=', 'AAAAAAIAAw==', 'AAACAAIAAg==', 'AAABAAIAAQ==', 'Av//AAE='], - 'application-id': 1201559522, - 'foreign-apps': [645869114, 1002541853], - 'foreign-assets': [31566704, 386195940, 408898501], - 'global-state-schema': { 'num-byte-slice': 0, 'num-uint': 0 }, - 'local-state-schema': { 'num-byte-slice': 0, 'num-uint': 0 }, - 'on-completion': ApplicationOnComplete.noop, - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 1000, - 'first-valid': 36591810, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', - group: '/oRSr2uMFemQhwQliJO18b64Nl1QIkjA39ZszRCeSCI=', + applicationArgs: [ + base64ToBytes('AAAAAAAqRH0='), + base64ToBytes('AAAAAAAAAAA='), + base64ToBytes('//8='), + base64ToBytes('AAAAAAIAAw=='), + base64ToBytes('AAACAAIAAg=='), + base64ToBytes('AAABAAIAAQ=='), + base64ToBytes('Av//AAE='), + ], + applicationId: 1201559522n, + foreignApps: [645869114n, 1002541853n], + foreignAssets: [31566704n, 386195940n, 408898501n], + globalStateSchema: { numByteSlice: 0, numUint: 0 }, + localStateSchema: { numByteSlice: 0, numUint: 0 }, + onCompletion: ApplicationOnComplete.noop, + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 1000n, + firstValid: 36591810n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', + group: base64ToBytes('/oRSr2uMFemQhwQliJO18b64Nl1QIkjA39ZszRCeSCI='), id: 'INDQXWQXHF22SO45EZY7V6FFNI6WUD5FHRVDV6NCU6HD424BJGGA', - 'inner-txns': [ - { - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 1000, - 'first-valid': 36591810, - group: 'aWpPwlog0oZYHQe9uDlwReKzIgb9HVKLv8Z4GX0wMO0=', - 'intra-round-offset': 111, - 'last-valid': 36591814, - 'payment-transaction': { - amount: 2770045, - 'close-amount': 0, + innerTxns: [ + { + id: 'INDQXWQXHF22SO45EZY7V6FFNI6WUD5FHRVDV6NCU6HD424BJGGA/inner/1', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 1000n, + firstValid: 36591810n, + group: base64ToBytes('aWpPwlog0oZYHQe9uDlwReKzIgb9HVKLv8Z4GX0wMO0='), + intraRoundOffset: 111, + lastValid: 36591814n, + paymentTransaction: { + amount: 2770045n, + closeAmount: 0n, receiver: '2PIFZW53RHCSFSYMCFUBW4XOCXOMB7XOYQSQ6KGT3KVGJTL4HM6COZRNMM', }, - 'receiver-rewards': 0, - 'round-time': 1709251673, + receiverRewards: 0n, + roundTime: 1709251673, sender: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A', - 'sender-rewards': 0, - 'tx-type': TransactionType.pay, - }, - { - 'application-transaction': { - accounts: ['2PIFZW53RHCSFSYMCFUBW4XOCXOMB7XOYQSQ6KGT3KVGJTL4HM6COZRNMM'], - 'application-args': ['c3dhcA==', 'Zml4ZWQtaW5wdXQ=', 'AAAAAAAAAAA='], - 'application-id': 1002541853, - 'foreign-apps': [], - 'foreign-assets': [31566704], - 'global-state-schema': { 'num-byte-slice': 0, 'num-uint': 0 }, - 'local-state-schema': { 'num-byte-slice': 0, 'num-uint': 0 }, - 'on-completion': ApplicationOnComplete.noop, - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 2000, - 'first-valid': 36591810, - group: 'aWpPwlog0oZYHQe9uDlwReKzIgb9HVKLv8Z4GX0wMO0=', - 'inner-txns': [ + senderRewards: 0n, + txType: TransactionType.pay, + }, + { + id: 'INDQXWQXHF22SO45EZY7V6FFNI6WUD5FHRVDV6NCU6HD424BJGGA/inner/2', + applicationTransaction: { + accounts: [algosdk.Address.fromString('2PIFZW53RHCSFSYMCFUBW4XOCXOMB7XOYQSQ6KGT3KVGJTL4HM6COZRNMM')], + applicationArgs: [base64ToBytes('c3dhcA=='), base64ToBytes('Zml4ZWQtaW5wdXQ='), base64ToBytes('AAAAAAAAAAA=')], + applicationId: 1002541853n, + foreignApps: [], + foreignAssets: [31566704n], + globalStateSchema: { numByteSlice: 0, numUint: 0 }, + localStateSchema: { numByteSlice: 0, numUint: 0 }, + onCompletion: ApplicationOnComplete.noop, + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 2000n, + firstValid: 36591810n, + group: base64ToBytes('aWpPwlog0oZYHQe9uDlwReKzIgb9HVKLv8Z4GX0wMO0='), + innerTxns: [ { - 'asset-transfer-transaction': { - amount: 586582, - 'asset-id': 31566704, - 'close-amount': 0, + id: 'INDQXWQXHF22SO45EZY7V6FFNI6WUD5FHRVDV6NCU6HD424BJGGA/inner/2/1', + assetTransferTransaction: { + amount: 586582n, + assetId: 31566704n, + closeAmount: 0n, receiver: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 0, - 'first-valid': 36591810, - 'intra-round-offset': 111, - 'last-valid': 36591814, - 'receiver-rewards': 0, - 'round-time': 1709251673, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 0n, + firstValid: 36591810n, + intraRoundOffset: 111, + lastValid: 36591814n, + receiverRewards: 0n, + roundTime: 1709251673, sender: '2PIFZW53RHCSFSYMCFUBW4XOCXOMB7XOYQSQ6KGT3KVGJTL4HM6COZRNMM', - 'sender-rewards': 0, - 'tx-type': 'axfer', + senderRewards: 0n, + txType: TransactionType.axfer, }, ], - 'intra-round-offset': 111, - 'last-valid': 36591814, - 'local-state-delta': [ + intraRoundOffset: 111, + lastValid: 36591814n, + localStateDelta: [ { address: '2PIFZW53RHCSFSYMCFUBW4XOCXOMB7XOYQSQ6KGT3KVGJTL4HM6COZRNMM', delta: [ - { key: 'YXNzZXRfMV9yZXNlcnZlcw==', value: { action: 2, uint: 1624171900529 } }, - { key: 'YXNzZXRfMl9wcm90b2NvbF9mZWVz', value: { action: 2, uint: 177107130743 } }, - { key: 'YXNzZXRfMl9yZXNlcnZlcw==', value: { action: 2, uint: 7646891725226 } }, + { key: 'YXNzZXRfMV9yZXNlcnZlcw==', value: { action: 2, uint: 1624171900529n } }, + { key: 'YXNzZXRfMl9wcm90b2NvbF9mZWVz', value: { action: 2, uint: 177107130743n } }, + { key: 'YXNzZXRfMl9yZXNlcnZlcw==', value: { action: 2, uint: 7646891725226n } }, ], }, ], logs: [ - 'aW5wdXRfYXNzZXRfaWQgJWkAAAAAAAAAAA==', - 'aW5wdXRfYW1vdW50ICVpAAAAAAAqRH0=', - 'c3dhcF9hbW91bnQgJWkAAAAAACokBw==', - 'Y2hhbmdlICVpAAAAAAAAAAA=', - 'b3V0cHV0X2Fzc2V0X2lkICVpAAAAAAHhq3A=', - 'b3V0cHV0X2Ftb3VudCAlaQAAAAAACPNW', - 'cG9vbGVyc19mZWVfYW1vdW50ICVpAAAAAAAAGw0=', - 'cHJvdG9jb2xfZmVlX2Ftb3VudCAlaQAAAAAAAAVp', - 'dG90YWxfZmVlX2Ftb3VudCAlaQAAAAAAACB2', + base64ToBytes('aW5wdXRfYXNzZXRfaWQgJWkAAAAAAAAAAA=='), + base64ToBytes('aW5wdXRfYW1vdW50ICVpAAAAAAAqRH0='), + base64ToBytes('c3dhcF9hbW91bnQgJWkAAAAAACokBw=='), + base64ToBytes('Y2hhbmdlICVpAAAAAAAAAAA='), + base64ToBytes('b3V0cHV0X2Fzc2V0X2lkICVpAAAAAAHhq3A='), + base64ToBytes('b3V0cHV0X2Ftb3VudCAlaQAAAAAACPNW'), + base64ToBytes('cG9vbGVyc19mZWVfYW1vdW50ICVpAAAAAAAAGw0='), + base64ToBytes('cHJvdG9jb2xfZmVlX2Ftb3VudCAlaQAAAAAAAAVp'), + base64ToBytes('dG90YWxfZmVlX2Ftb3VudCAlaQAAAAAAACB2'), ], - 'receiver-rewards': 0, - 'round-time': 1709251673, + receiverRewards: 0n, + roundTime: 1709251673, sender: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'asset-transfer-transaction': { - amount: 586582, - 'asset-id': 31566704, - 'close-amount': 0, + id: 'INDQXWQXHF22SO45EZY7V6FFNI6WUD5FHRVDV6NCU6HD424BJGGA/inner/3', + assetTransferTransaction: { + amount: 586582n, + assetId: 31566704n, + closeAmount: 0n, receiver: 'FCHEP67BCAA64RTZZNHLOUJF22TDWPWKSWO4FDRLLHC3NMKCCMRCKPIYSM', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 1000, - 'first-valid': 36591810, - group: 'BRZQp521ytgGO4sumex5qXU1LtDPEXtvuSZ84nLmX8M=', - 'intra-round-offset': 111, - 'last-valid': 36591814, - 'receiver-rewards': 0, - 'round-time': 1709251673, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 1000n, + firstValid: 36591810n, + group: base64ToBytes('BRZQp521ytgGO4sumex5qXU1LtDPEXtvuSZ84nLmX8M='), + intraRoundOffset: 111, + lastValid: 36591814n, + receiverRewards: 0n, + roundTime: 1709251673, sender: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A', - 'sender-rewards': 0, - 'tx-type': 'axfer', - }, - { - 'application-transaction': { - accounts: ['FCHEP67BCAA64RTZZNHLOUJF22TDWPWKSWO4FDRLLHC3NMKCCMRCKPIYSM'], - 'application-args': ['c3dhcA==', 'Zml4ZWQtaW5wdXQ=', 'AAAAAAAAAAA='], - 'application-id': 1002541853, - 'foreign-apps': [], - 'foreign-assets': [408898501, 31566704], - 'global-state-schema': { 'num-byte-slice': 0, 'num-uint': 0 }, - 'local-state-schema': { 'num-byte-slice': 0, 'num-uint': 0 }, - 'on-completion': ApplicationOnComplete.noop, - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 2000, - 'first-valid': 36591810, - group: 'BRZQp521ytgGO4sumex5qXU1LtDPEXtvuSZ84nLmX8M=', - 'inner-txns': [ + senderRewards: 0n, + txType: TransactionType.axfer, + }, + { + id: 'INDQXWQXHF22SO45EZY7V6FFNI6WUD5FHRVDV6NCU6HD424BJGGA/inner/4', + applicationTransaction: { + accounts: [algosdk.Address.fromString('FCHEP67BCAA64RTZZNHLOUJF22TDWPWKSWO4FDRLLHC3NMKCCMRCKPIYSM')], + applicationArgs: [base64ToBytes('c3dhcA=='), base64ToBytes('Zml4ZWQtaW5wdXQ='), base64ToBytes('AAAAAAAAAAA=')], + applicationId: 1002541853n, + foreignApps: [], + foreignAssets: [408898501n, 31566704n], + globalStateSchema: { numByteSlice: 0, numUint: 0 }, + localStateSchema: { numByteSlice: 0, numUint: 0 }, + onCompletion: ApplicationOnComplete.noop, + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 2000n, + firstValid: 36591810n, + group: base64ToBytes('BRZQp521ytgGO4sumex5qXU1LtDPEXtvuSZ84nLmX8M='), + innerTxns: [ { - 'asset-transfer-transaction': { - amount: 1465, - 'asset-id': 408898501, - 'close-amount': 0, + id: 'INDQXWQXHF22SO45EZY7V6FFNI6WUD5FHRVDV6NCU6HD424BJGGA/inner/4/1', + assetTransferTransaction: { + amount: 1465n, + assetId: 408898501n, + closeAmount: 0n, receiver: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 0, - 'first-valid': 36591810, - 'intra-round-offset': 111, - 'last-valid': 36591814, - 'receiver-rewards': 0, - 'round-time': 1709251673, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 0n, + firstValid: 36591810n, + intraRoundOffset: 111, + lastValid: 36591814n, + receiverRewards: 0n, + roundTime: 1709251673, sender: 'FCHEP67BCAA64RTZZNHLOUJF22TDWPWKSWO4FDRLLHC3NMKCCMRCKPIYSM', - 'sender-rewards': 0, - 'tx-type': 'axfer', + senderRewards: 0n, + txType: TransactionType.axfer, }, ], - 'intra-round-offset': 111, - 'last-valid': 36591814, - 'local-state-delta': [ + intraRoundOffset: 111, + lastValid: 36591814n, + localStateDelta: [ { address: 'FCHEP67BCAA64RTZZNHLOUJF22TDWPWKSWO4FDRLLHC3NMKCCMRCKPIYSM', delta: [ - { key: 'YXNzZXRfMV9jdW11bGF0aXZlX3ByaWNl', value: { action: 1, bytes: 'AY7tooRxn5BSd/Z58A==', uint: 0 } }, - { key: 'YXNzZXRfMV9yZXNlcnZlcw==', value: { action: 2, uint: 543874 } }, - { key: 'YXNzZXRfMl9jdW11bGF0aXZlX3ByaWNl', value: { action: 1, bytes: 'Ah1HJQhgSKFZacY=', uint: 0 } }, - { key: 'YXNzZXRfMl9wcm90b2NvbF9mZWVz', value: { action: 2, uint: 507738 } }, - { key: 'YXNzZXRfMl9yZXNlcnZlcw==', value: { action: 2, uint: 217612310 } }, - { key: 'Y3VtdWxhdGl2ZV9wcmljZV91cGRhdGVfdGltZXN0YW1w', value: { action: 2, uint: 1709251670 } }, + { key: 'YXNzZXRfMV9jdW11bGF0aXZlX3ByaWNl', value: { action: 1, bytes: 'AY7tooRxn5BSd/Z58A==', uint: 0n } }, + { key: 'YXNzZXRfMV9yZXNlcnZlcw==', value: { action: 2, uint: 543874n } }, + { key: 'YXNzZXRfMl9jdW11bGF0aXZlX3ByaWNl', value: { action: 1, bytes: 'Ah1HJQhgSKFZacY=', uint: 0n } }, + { key: 'YXNzZXRfMl9wcm90b2NvbF9mZWVz', value: { action: 2, uint: 507738n } }, + { key: 'YXNzZXRfMl9yZXNlcnZlcw==', value: { action: 2, uint: 217612310n } }, + { key: 'Y3VtdWxhdGl2ZV9wcmljZV91cGRhdGVfdGltZXN0YW1w', value: { action: 2, uint: 1709251670n } }, ], }, ], logs: [ - 'aW5wdXRfYXNzZXRfaWQgJWkAAAAAAeGrcA==', - 'aW5wdXRfYW1vdW50ICVpAAAAAAAI81Y=', - 'c3dhcF9hbW91bnQgJWkAAAAAAAjsdw==', - 'Y2hhbmdlICVpAAAAAAAAAAA=', - 'b3V0cHV0X2Fzc2V0X2lkICVpAAAAABhfS8U=', - 'b3V0cHV0X2Ftb3VudCAlaQAAAAAAAAW5', - 'cG9vbGVyc19mZWVfYW1vdW50ICVpAAAAAAAABbo=', - 'cHJvdG9jb2xfZmVlX2Ftb3VudCAlaQAAAAAAAAEl', - 'dG90YWxfZmVlX2Ftb3VudCAlaQAAAAAAAAbf', + base64ToBytes('aW5wdXRfYXNzZXRfaWQgJWkAAAAAAeGrcA=='), + base64ToBytes('aW5wdXRfYW1vdW50ICVpAAAAAAAI81Y='), + base64ToBytes('c3dhcF9hbW91bnQgJWkAAAAAAAjsdw=='), + base64ToBytes('Y2hhbmdlICVpAAAAAAAAAAA='), + base64ToBytes('b3V0cHV0X2Fzc2V0X2lkICVpAAAAABhfS8U='), + base64ToBytes('b3V0cHV0X2Ftb3VudCAlaQAAAAAAAAW5'), + base64ToBytes('cG9vbGVyc19mZWVfYW1vdW50ICVpAAAAAAAABbo='), + base64ToBytes('cHJvdG9jb2xfZmVlX2Ftb3VudCAlaQAAAAAAAAEl'), + base64ToBytes('dG90YWxfZmVlX2Ftb3VudCAlaQAAAAAAAAbf'), ], - 'receiver-rewards': 0, - 'round-time': 1709251673, + receiverRewards: 0n, + roundTime: 1709251673, sender: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'asset-transfer-transaction': { - amount: 1465, - 'asset-id': 408898501, - 'close-amount': 0, + id: 'INDQXWQXHF22SO45EZY7V6FFNI6WUD5FHRVDV6NCU6HD424BJGGA/inner/5', + assetTransferTransaction: { + amount: 1465n, + assetId: 408898501n, + closeAmount: 0n, receiver: 'EOXLRDMDV4Y7GEWY5GEDCIJV7SQM3A3TBHYAPBTWHS7JTOOYHZXPUEGCE4', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 1000, - 'first-valid': 36591810, - group: 'FVTJgJEmvmU+8kHPC9mKKqEn7QZIR1r5rnH56yNh3bE=', - 'intra-round-offset': 111, - 'last-valid': 36591814, - 'receiver-rewards': 0, - 'round-time': 1709251673, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 1000n, + firstValid: 36591810n, + group: base64ToBytes('FVTJgJEmvmU+8kHPC9mKKqEn7QZIR1r5rnH56yNh3bE='), + intraRoundOffset: 111, + lastValid: 36591814n, + receiverRewards: 0n, + roundTime: 1709251673, sender: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A', - 'sender-rewards': 0, - 'tx-type': 'axfer', - }, - { - 'application-transaction': { - accounts: ['EOXLRDMDV4Y7GEWY5GEDCIJV7SQM3A3TBHYAPBTWHS7JTOOYHZXPUEGCE4'], - 'application-args': ['c3dhcA==', 'Zml4ZWQtaW5wdXQ=', 'AAAAAAAAAAA='], - 'application-id': 1002541853, - 'foreign-apps': [], - 'foreign-assets': [408898501, 386195940], - 'global-state-schema': { 'num-byte-slice': 0, 'num-uint': 0 }, - 'local-state-schema': { 'num-byte-slice': 0, 'num-uint': 0 }, - 'on-completion': ApplicationOnComplete.noop, - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 2000, - 'first-valid': 36591810, - group: 'FVTJgJEmvmU+8kHPC9mKKqEn7QZIR1r5rnH56yNh3bE=', - 'inner-txns': [ + senderRewards: 0n, + txType: TransactionType.axfer, + }, + { + id: 'INDQXWQXHF22SO45EZY7V6FFNI6WUD5FHRVDV6NCU6HD424BJGGA/inner/6', + applicationTransaction: { + accounts: [algosdk.Address.fromString('EOXLRDMDV4Y7GEWY5GEDCIJV7SQM3A3TBHYAPBTWHS7JTOOYHZXPUEGCE4')], + applicationArgs: [base64ToBytes('c3dhcA=='), base64ToBytes('Zml4ZWQtaW5wdXQ='), base64ToBytes('AAAAAAAAAAA=')], + applicationId: 1002541853n, + foreignApps: [], + foreignAssets: [408898501n, 386195940n], + globalStateSchema: { numByteSlice: 0, numUint: 0 }, + localStateSchema: { numByteSlice: 0, numUint: 0 }, + onCompletion: ApplicationOnComplete.noop, + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 2000n, + firstValid: 36591810n, + group: base64ToBytes('FVTJgJEmvmU+8kHPC9mKKqEn7QZIR1r5rnH56yNh3bE='), + innerTxns: [ { - 'asset-transfer-transaction': { - amount: 17647, - 'asset-id': 386195940, - 'close-amount': 0, + id: 'INDQXWQXHF22SO45EZY7V6FFNI6WUD5FHRVDV6NCU6HD424BJGGA/inner/6/1', + assetTransferTransaction: { + amount: 17647n, + assetId: 386195940n, + closeAmount: 0n, receiver: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 0, - 'first-valid': 36591810, - 'intra-round-offset': 111, - 'last-valid': 36591814, - 'receiver-rewards': 0, - 'round-time': 1709251673, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 0n, + firstValid: 36591810n, + intraRoundOffset: 111, + lastValid: 36591814n, + receiverRewards: 0n, + roundTime: 1709251673, sender: 'EOXLRDMDV4Y7GEWY5GEDCIJV7SQM3A3TBHYAPBTWHS7JTOOYHZXPUEGCE4', - 'sender-rewards': 0, - 'tx-type': 'axfer', + senderRewards: 0n, + txType: TransactionType.axfer, }, ], - 'intra-round-offset': 111, - 'last-valid': 36591814, - 'local-state-delta': [ + intraRoundOffset: 111, + lastValid: 36591814n, + localStateDelta: [ { address: 'EOXLRDMDV4Y7GEWY5GEDCIJV7SQM3A3TBHYAPBTWHS7JTOOYHZXPUEGCE4', delta: [ - { key: 'YXNzZXRfMV9jdW11bGF0aXZlX3ByaWNl', value: { action: 1, bytes: 'EeM24SfPxVrkC4pj', uint: 0 } }, - { key: 'YXNzZXRfMV9yZXNlcnZlcw==', value: { action: 2, uint: 443907 } }, - { key: 'YXNzZXRfMl9jdW11bGF0aXZlX3ByaWNl', value: { action: 1, bytes: 'JAcUxhg+OOdzh64=', uint: 0 } }, - { key: 'YXNzZXRfMl9yZXNlcnZlcw==', value: { action: 2, uint: 5344350 } }, - { key: 'Y3VtdWxhdGl2ZV9wcmljZV91cGRhdGVfdGltZXN0YW1w', value: { action: 2, uint: 1709251670 } }, + { key: 'YXNzZXRfMV9jdW11bGF0aXZlX3ByaWNl', value: { action: 1, bytes: 'EeM24SfPxVrkC4pj', uint: 0n } }, + { key: 'YXNzZXRfMV9yZXNlcnZlcw==', value: { action: 2, uint: 443907n } }, + { key: 'YXNzZXRfMl9jdW11bGF0aXZlX3ByaWNl', value: { action: 1, bytes: 'JAcUxhg+OOdzh64=', uint: 0n } }, + { key: 'YXNzZXRfMl9yZXNlcnZlcw==', value: { action: 2, uint: 5344350n } }, + { key: 'Y3VtdWxhdGl2ZV9wcmljZV91cGRhdGVfdGltZXN0YW1w', value: { action: 2, uint: 1709251670n } }, ], }, ], logs: [ - 'aW5wdXRfYXNzZXRfaWQgJWkAAAAAGF9LxQ==', - 'aW5wdXRfYW1vdW50ICVpAAAAAAAABbk=', - 'c3dhcF9hbW91bnQgJWkAAAAAAAAFtQ==', - 'Y2hhbmdlICVpAAAAAAAAAAA=', - 'b3V0cHV0X2Fzc2V0X2lkICVpAAAAABcE4eQ=', - 'b3V0cHV0X2Ftb3VudCAlaQAAAAAAAETv', - 'cG9vbGVyc19mZWVfYW1vdW50ICVpAAAAAAAAAAQ=', - 'cHJvdG9jb2xfZmVlX2Ftb3VudCAlaQAAAAAAAAAA', - 'dG90YWxfZmVlX2Ftb3VudCAlaQAAAAAAAAAE', + base64ToBytes('aW5wdXRfYXNzZXRfaWQgJWkAAAAAGF9LxQ=='), + base64ToBytes('aW5wdXRfYW1vdW50ICVpAAAAAAAABbk='), + base64ToBytes('c3dhcF9hbW91bnQgJWkAAAAAAAAFtQ=='), + base64ToBytes('Y2hhbmdlICVpAAAAAAAAAAA='), + base64ToBytes('b3V0cHV0X2Fzc2V0X2lkICVpAAAAABcE4eQ='), + base64ToBytes('b3V0cHV0X2Ftb3VudCAlaQAAAAAAAETv'), + base64ToBytes('cG9vbGVyc19mZWVfYW1vdW50ICVpAAAAAAAAAAQ='), + base64ToBytes('cHJvdG9jb2xfZmVlX2Ftb3VudCAlaQAAAAAAAAAA'), + base64ToBytes('dG90YWxfZmVlX2Ftb3VudCAlaQAAAAAAAAAE'), ], - 'receiver-rewards': 0, - 'round-time': 1709251673, + receiverRewards: 0n, + roundTime: 1709251673, sender: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'asset-transfer-transaction': { - amount: 17647, - 'asset-id': 386195940, - 'close-amount': 0, + id: 'INDQXWQXHF22SO45EZY7V6FFNI6WUD5FHRVDV6NCU6HD424BJGGA/inner/7', + assetTransferTransaction: { + amount: 17647n, + assetId: 386195940n, + closeAmount: 0n, receiver: 'IWT4WOUKYQBCAO76UKWZ5E4CPIJVLBE5R3NX5QH3BXMTG34WU7ZCLJ4RVY', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 1000, - 'first-valid': 36591810, - group: 'ugsPSBZ9wnfXr1sH8ErEfCEhXNG2F28SyHcJa26ctO0=', - 'intra-round-offset': 111, - 'last-valid': 36591814, - 'receiver-rewards': 0, - 'round-time': 1709251673, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 1000n, + firstValid: 36591810n, + group: base64ToBytes('ugsPSBZ9wnfXr1sH8ErEfCEhXNG2F28SyHcJa26ctO0='), + intraRoundOffset: 111, + lastValid: 36591814n, + receiverRewards: 0n, + roundTime: 1709251673, sender: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A', - 'sender-rewards': 0, - 'tx-type': 'axfer', + senderRewards: 0n, + txType: TransactionType.axfer, }, { - 'application-transaction': { + id: 'INDQXWQXHF22SO45EZY7V6FFNI6WUD5FHRVDV6NCU6HD424BJGGA/inner/8', + applicationTransaction: { accounts: [], - 'application-args': ['U1dBUA==', 'AAAAAAAAAAA='], - 'application-id': 645869114, - 'foreign-apps': [], - 'foreign-assets': [0, 386195940], - 'global-state-schema': { 'num-byte-slice': 0, 'num-uint': 0 }, - 'local-state-schema': { 'num-byte-slice': 0, 'num-uint': 0 }, - 'on-completion': ApplicationOnComplete.noop, - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 2000, - 'first-valid': 36591810, - 'global-state-delta': [ - { key: 'QQ==', value: { action: 2, uint: 118457344272 } }, - { key: 'Qg==', value: { action: 2, uint: 748025794 } }, + applicationArgs: [base64ToBytes('U1dBUA=='), base64ToBytes('AAAAAAAAAAA=')], + applicationId: 645869114n, + foreignApps: [], + foreignAssets: [0n, 386195940n], + globalStateSchema: { numByteSlice: 0, numUint: 0 }, + localStateSchema: { numByteSlice: 0, numUint: 0 }, + onCompletion: ApplicationOnComplete.noop, + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 2000n, + firstValid: 36591810n, + globalStateDelta: [ + { key: 'QQ==', value: { action: 2, uint: 118457344272n } }, + { key: 'Qg==', value: { action: 2, uint: 748025794n } }, ], - group: 'ugsPSBZ9wnfXr1sH8ErEfCEhXNG2F28SyHcJa26ctO0=', - 'inner-txns': [ + group: base64ToBytes('ugsPSBZ9wnfXr1sH8ErEfCEhXNG2F28SyHcJa26ctO0='), + innerTxns: [ { - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 0, - 'first-valid': 36591810, - 'intra-round-offset': 111, - 'last-valid': 36591814, - 'payment-transaction': { - amount: 2786260, - 'close-amount': 0, + id: 'INDQXWQXHF22SO45EZY7V6FFNI6WUD5FHRVDV6NCU6HD424BJGGA/inner/8/1', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 0n, + firstValid: 36591810n, + intraRoundOffset: 111, + lastValid: 36591814n, + paymentTransaction: { + amount: 2786260n, + closeAmount: 0n, receiver: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A', }, - 'receiver-rewards': 0, - 'round-time': 1709251673, + receiverRewards: 0n, + roundTime: 1709251673, sender: 'IWT4WOUKYQBCAO76UKWZ5E4CPIJVLBE5R3NX5QH3BXMTG34WU7ZCLJ4RVY', - 'sender-rewards': 0, - 'tx-type': TransactionType.pay, + senderRewards: 0n, + txType: TransactionType.pay, }, ], - 'intra-round-offset': 111, - 'last-valid': 36591814, - 'receiver-rewards': 0, - 'round-time': 1709251673, + intraRoundOffset: 111, + lastValid: 36591814n, + receiverRewards: 0n, + roundTime: 1709251673, sender: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A', - 'sender-rewards': 0, - 'tx-type': 'appl', - }, - { - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 1000, - 'first-valid': 36591810, - 'intra-round-offset': 111, - 'last-valid': 36591814, - 'payment-transaction': { amount: 0, 'close-amount': 0, receiver: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A' }, - 'receiver-rewards': 0, - 'rekey-to': 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A', - 'round-time': 1709251673, + senderRewards: 0n, + txType: TransactionType.appl, + }, + { + id: 'INDQXWQXHF22SO45EZY7V6FFNI6WUD5FHRVDV6NCU6HD424BJGGA/inner/9', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 1000n, + firstValid: 36591810n, + intraRoundOffset: 111, + lastValid: 36591814n, + paymentTransaction: { amount: 0n, closeAmount: 0n, receiver: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A' }, + receiverRewards: 0n, + rekeyTo: algosdk.Address.fromString('AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A'), + roundTime: 1709251673, sender: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A', - 'sender-rewards': 0, - 'tx-type': TransactionType.pay, + senderRewards: 0n, + txType: TransactionType.pay, }, ], - 'intra-round-offset': 111, - 'last-valid': 36591814, - lease: 'Gvgsil8YwDJH4I9KsGqx4t0GkPqJxFpLldBGIq1klAI=', - note: 'AAHOu8yhPy8SoRmmHsKmDSPsAL5Cap8uJ47IkmHXVYavS26egWoIW7hGSsWoByA=', - 'receiver-rewards': 0, - 'rekey-to': 'GEAW6VVQY2QPYKEI6HAHAH3MNQNMXYOVKYVVI3B7X72CPW74HRVYXWGITU', - 'round-time': 1709251673, + intraRoundOffset: 111, + lastValid: 36591814n, + lease: base64ToBytes('Gvgsil8YwDJH4I9KsGqx4t0GkPqJxFpLldBGIq1klAI='), + note: base64ToBytes('AAHOu8yhPy8SoRmmHsKmDSPsAL5Cap8uJ47IkmHXVYavS26egWoIW7hGSsWoByA='), + receiverRewards: 0n, + rekeyTo: algosdk.Address.fromString('GEAW6VVQY2QPYKEI6HAHAH3MNQNMXYOVKYVVI3B7X72CPW74HRVYXWGITU'), + roundTime: 1709251673, sender: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A', - 'sender-rewards': 0, - signature: { sig: 'nay7aDZL7TCxfX/ZOLncmGlCmjlBbB/ZxifrtBCKns9Jpotb/eMEcyvp1QmBUXyO5Ft/77x+gRN0O6lIbcxlDg==' }, - 'tx-type': 'appl', - } as unknown as TransactionResult) // The type definition for App Call transaction in indexer seems to be wrong + senderRewards: 0n, + signature: { sig: base64ToBytes('nay7aDZL7TCxfX/ZOLncmGlCmjlBbB/ZxifrtBCKns9Jpotb/eMEcyvp1QmBUXyO5Ft/77x+gRN0O6lIbcxlDg==') }, + txType: TransactionType.appl, + }) // The type definition for App Call transaction in indexer seems to be wrong }, ['mainnet-U4XH6AS5UUYQI4IZ3E5JSUEIU64Y3FGNYKLH26W4HRY7T6PK745A']: () => { // Asset config destroy asset for 917559 return new TransactionResultBuilder({ - 'asset-config-transaction': { - 'asset-id': 917559, - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 6354625, - fee: 1000, - 'first-valid': 6354623, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', + assetConfigTransaction: { + assetId: 917559n, + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 6354625n, + fee: 1000n, + firstValid: 6354623n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), id: 'U4XH6AS5UUYQI4IZ3E5JSUEIU64Y3FGNYKLH26W4HRY7T6PK745A', - 'intra-round-offset': 0, - 'last-valid': 6355623, - note: 'fSaN7lZKDoU=', - 'receiver-rewards': 0, - 'round-time': 1588143174, + intraRoundOffset: 0, + lastValid: 6355623n, + note: base64ToBytes('fSaN7lZKDoU='), + receiverRewards: 0n, + roundTime: 1588143174, sender: 'MBX2M6J44LQ22L3FROYRBKUAG4FWENPSLPTI7EBR4ECQ2APDMI6XTENHWQ', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: '54NGN00vwOQdEeoev5qb7NFV5a8JNY+L/GgNgQrCVjWQtb2rzlO+/OMOY3o984zs2zOYY75Hdy0SXD25GmJvCw==', + sig: base64ToBytes('54NGN00vwOQdEeoev5qb7NFV5a8JNY+L/GgNgQrCVjWQtb2rzlO+/OMOY3o984zs2zOYY75Hdy0SXD25GmJvCw=='), }, - 'tx-type': TransactionType.acfg, + txType: TransactionType.acfg, }) }, ['mainnet-ZXQMOO6KBSG4LFJ5CSN3HEQVIL5A5FIF46VDAS6N24JWXOC3U3PQ']: () => { // Asset config creation return new TransactionResultBuilder({ - 'asset-config-transaction': { - 'asset-id': 0, + assetConfigTransaction: { + assetId: 0n, params: { creator: 'EHYQCYHUC6CIWZLBX5TDTLVJ4SSVE4RRTMKFDCG4Z4Q7QSQ2XWIQPMKBPU', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, manager: 'EHYQCYHUC6CIWZLBX5TDTLVJ4SSVE4RRTMKFDCG4Z4Q7QSQ2XWIQPMKBPU', name: 'DHM: M5+ Quake us6000mt40', - 'name-b64': encoder.encode('REhNOiBNNSsgUXVha2UgdXM2MDAwbXQ0MA=='), + nameB64: base64ToBytes('REhNOiBNNSsgUXVha2UgdXM2MDAwbXQ0MA=='), reserve: 'VHHSUDWVVP43DUTX5ILBU2C5MGTHOKL2KVM2WBHNJK4B5YTBRQGZ5SW6QQ', - total: 1, - 'unit-name': 'QUAKE', - 'unit-name-b64': encoder.encode('UVVBS0U='), + total: 1n, + unitName: 'QUAKE', + unitNameB64: base64ToBytes('UVVBS0U='), url: 'https://assets.datahistory.org/quake/us6000mt40.png#i', - 'url-b64': encoder.encode('aHR0cHM6Ly9hc3NldHMuZGF0YWhpc3Rvcnkub3JnL3F1YWtlL3VzNjAwMG10NDAucG5nI2k='), - }, - }, - 'auth-addr': '5ROHDU55YSX545QRE5G2SGZD77OVAJK4RKHAAT7CPMHMNRJACSQUKTUT3M', - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 38185488, - 'created-asset-index': 1781083085, - fee: 1000, - 'first-valid': 38185486, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', + urlB64: base64ToBytes('aHR0cHM6Ly9hc3NldHMuZGF0YWhpc3Rvcnkub3JnL3F1YWtlL3VzNjAwMG10NDAucG5nI2k='), + }, + }, + authAddr: algosdk.Address.fromString('5ROHDU55YSX545QRE5G2SGZD77OVAJK4RKHAAT7CPMHMNRJACSQUKTUT3M'), + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 38185488n, + createdAssetIndex: 1781083085n, + fee: 1000n, + firstValid: 38185486n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', id: 'ZXQMOO6KBSG4LFJ5CSN3HEQVIL5A5FIF46VDAS6N24JWXOC3U3PQ', - 'intra-round-offset': 152, - 'last-valid': 38186486, - note: 'eyJzdGFuZGFyZCI6ImFyYzY5IiwiZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdmVyaWZpYWJseSBhdXRoZW50aWMgZGlnaXRhbCBoaXN0b3JpY2FsIGFydGlmYWN0IG1pbnRlZCBieSBUaGUgRGF0YSBIaXN0b3J5IE11c2V1bS4gSXQgcmVwcmVzZW50cyBhIE1hZ25pdHVkZSA1LjIgZWFydGhxdWFrZSB3aXRoIElEIHVzNjAwMG10NDAgd2hpY2ggaGFzIGFuIGVwaWNlbnRyZSAxNCBrbSBTIG9mIEh1YWxpZW4gQ2l0eSwgVGFpd2FuIGFuZCBvY2N1cnJlZCBhdCBUdWUsIDIzIEFwciAyMDI0IDAyOjIxOjAwIEdNVC4gVGhlIHZlcmlmaWVkIHNvdXJjZSBvZiB0aGlzIGRhdGEgYXJ0aWZhY3Qgd2FzIHRoZSBVbml0ZWQgU3RhdGVzIEdlb2xvZ2ljYWwgU3VydmV5IChVU0dTKS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gdmlzaXQgaHR0cHM6Ly9kYXRhaGlzdG9yeS5vcmcvLiIsImV4dGVybmFsX3VybCI6Imh0dHBzOi8vbXVzZXVtLmRhdGFoaXN0b3J5Lm9yZy9ldmVudC9RVUFLRS91czYwMDBtdDQwIiwicHJvcGVydGllcyI6eyJtYWduaXR1ZGUiOjUuMiwiY2xhc3MiOiJNNSIsImRlcHRoIjoxMCwibGF0aXR1ZGUiOjIzLjg0MywibG9uZ2l0dWRlIjoxMjEuNTksInBsYWNlIjoiMTQga20gUyBvZiBIdWFsaWVuIENpdHksIFRhaXdhbiIsInNvdXJjZSI6IlVTR1MiLCJzdWJUeXBlIjoiZWFydGhxdWFrZSIsInRpbWUiOiIyMDI0LTA0LTIzVDAyOjIxOjAwLjcwNVoiLCJ0eXBlIjoicXVha2UiLCJ1cmwiOiJodHRwczovL2VhcnRocXVha2UudXNncy5nb3YvZWFydGhxdWFrZXMvZXZlbnRwYWdlL3VzNjAwMG10NDAifSwibWltZV90eXBlIjoiaW1hZ2UvcG5nIiwiaWQiOiJ1czYwMDBtdDQwIiwidGl0bGUiOiJNIDUuMiAtIDE0IGttIFMgb2YgSHVhbGllbiBDaXR5LCBUYWl3YW4ifQ==', - 'receiver-rewards': 0, - 'round-time': 1713840133, + intraRoundOffset: 152, + lastValid: 38186486n, + note: base64ToBytes( + 'eyJzdGFuZGFyZCI6ImFyYzY5IiwiZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdmVyaWZpYWJseSBhdXRoZW50aWMgZGlnaXRhbCBoaXN0b3JpY2FsIGFydGlmYWN0IG1pbnRlZCBieSBUaGUgRGF0YSBIaXN0b3J5IE11c2V1bS4gSXQgcmVwcmVzZW50cyBhIE1hZ25pdHVkZSA1LjIgZWFydGhxdWFrZSB3aXRoIElEIHVzNjAwMG10NDAgd2hpY2ggaGFzIGFuIGVwaWNlbnRyZSAxNCBrbSBTIG9mIEh1YWxpZW4gQ2l0eSwgVGFpd2FuIGFuZCBvY2N1cnJlZCBhdCBUdWUsIDIzIEFwciAyMDI0IDAyOjIxOjAwIEdNVC4gVGhlIHZlcmlmaWVkIHNvdXJjZSBvZiB0aGlzIGRhdGEgYXJ0aWZhY3Qgd2FzIHRoZSBVbml0ZWQgU3RhdGVzIEdlb2xvZ2ljYWwgU3VydmV5IChVU0dTKS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gdmlzaXQgaHR0cHM6Ly9kYXRhaGlzdG9yeS5vcmcvLiIsImV4dGVybmFsX3VybCI6Imh0dHBzOi8vbXVzZXVtLmRhdGFoaXN0b3J5Lm9yZy9ldmVudC9RVUFLRS91czYwMDBtdDQwIiwicHJvcGVydGllcyI6eyJtYWduaXR1ZGUiOjUuMiwiY2xhc3MiOiJNNSIsImRlcHRoIjoxMCwibGF0aXR1ZGUiOjIzLjg0MywibG9uZ2l0dWRlIjoxMjEuNTksInBsYWNlIjoiMTQga20gUyBvZiBIdWFsaWVuIENpdHksIFRhaXdhbiIsInNvdXJjZSI6IlVTR1MiLCJzdWJUeXBlIjoiZWFydGhxdWFrZSIsInRpbWUiOiIyMDI0LTA0LTIzVDAyOjIxOjAwLjcwNVoiLCJ0eXBlIjoicXVha2UiLCJ1cmwiOiJodHRwczovL2VhcnRocXVha2UudXNncy5nb3YvZWFydGhxdWFrZXMvZXZlbnRwYWdlL3VzNjAwMG10NDAifSwibWltZV90eXBlIjoiaW1hZ2UvcG5nIiwiaWQiOiJ1czYwMDBtdDQwIiwidGl0bGUiOiJNIDUuMiAtIDE0IGttIFMgb2YgSHVhbGllbiBDaXR5LCBUYWl3YW4ifQ==' + ), + receiverRewards: 0n, + roundTime: 1713840133, sender: 'EHYQCYHUC6CIWZLBX5TDTLVJ4SSVE4RRTMKFDCG4Z4Q7QSQ2XWIQPMKBPU', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'NpftYxI2D/QWlIk3D8sxnfA2fVA4g4iX6Da5xiwl9kOOtVxlSkheJGqyc9Dp/ggBFxmqB7fKEAKmadIaXRuxBA==', + sig: base64ToBytes('NpftYxI2D/QWlIk3D8sxnfA2fVA4g4iX6Da5xiwl9kOOtVxlSkheJGqyc9Dp/ggBFxmqB7fKEAKmadIaXRuxBA=='), }, - 'tx-type': TransactionType.acfg, + txType: TransactionType.acfg, }) }, ['mainnet-GAMRAG3KCG23U2HOELJF32OQAWAISLIFBB5RLDDDYHUSOZNYN7MQ']: () => { // Asset config reconfigure return new TransactionResultBuilder({ - 'asset-config-transaction': { - 'asset-id': 1715458296, + assetConfigTransaction: { + assetId: 1715458296n, params: { creator: 'EHYQCYHUC6CIWZLBX5TDTLVJ4SSVE4RRTMKFDCG4Z4Q7QSQ2XWIQPMKBPU', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, manager: 'EHYQCYHUC6CIWZLBX5TDTLVJ4SSVE4RRTMKFDCG4Z4Q7QSQ2XWIQPMKBPU', reserve: 'POMY37RQ5PYG2NHKEFVDVDKGWZLZ4NHUWUW57CVGZVIPZCTNAFE2JM7XQU', - total: 0, + total: 0n, }, }, - 'auth-addr': '5ROHDU55YSX545QRE5G2SGZD77OVAJK4RKHAAT7CPMHMNRJACSQUKTUT3M', - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 37544845, - fee: 1000, - 'first-valid': 37544842, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', + authAddr: algosdk.Address.fromString('5ROHDU55YSX545QRE5G2SGZD77OVAJK4RKHAAT7CPMHMNRJACSQUKTUT3M'), + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 37544845n, + fee: 1000n, + firstValid: 37544842n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', id: 'GAMRAG3KCG23U2HOELJF32OQAWAISLIFBB5RLDDDYHUSOZNYN7MQ', - 'intra-round-offset': 1, - 'last-valid': 37545842, - note: 'eyJzdGFuZGFyZCI6ImFyYzY5IiwiZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdmVyaWZpYWJseSBhdXRoZW50aWMgZGlnaXRhbCBoaXN0b3JpY2FsIGFydGlmYWN0IG1pbnRlZCBieSBUaGUgRGF0YSBIaXN0b3J5IE11c2V1bS4gSXQgcmVwcmVzZW50cyBhIE1hZ25pdHVkZSA1LjMgZWFydGhxdWFrZSB3aXRoIElEIHVzNzAwMG05NzYgd2hpY2ggaGFzIGFuIGVwaWNlbnRyZSBub3J0aGVybiBFYXN0IFBhY2lmaWMgUmlzZSBhbmQgb2NjdXJyZWQgYXQgTW9uLCAwMSBBcHIgMjAyNCAxNDo0NToxNiBHTVQuIFRoZSB2ZXJpZmllZCBzb3VyY2Ugb2YgdGhpcyBkYXRhIGFydGlmYWN0IHdhcyB0aGUgVW5pdGVkIFN0YXRlcyBHZW9sb2dpY2FsIFN1cnZleSAoVVNHUykuIEZvciBtb3JlIGluZm9ybWF0aW9uIHZpc2l0IGh0dHBzOi8vZGF0YWhpc3Rvcnkub3JnLy4iLCJleHRlcm5hbF91cmwiOiJodHRwczovL211c2V1bS5kYXRhaGlzdG9yeS5vcmcvZXZlbnQvUVVBS0UvdXM3MDAwbTk3NiIsInByb3BlcnRpZXMiOnsibWFnbml0dWRlIjo1LjMsImNsYXNzIjoiTTUiLCJkZXB0aCI6MTAsImxhdGl0dWRlIjo4LjI1MSwibG9uZ2l0dWRlIjotMTAzLjIyNiwicGxhY2UiOiJub3J0aGVybiBFYXN0IFBhY2lmaWMgUmlzZSIsInNvdXJjZSI6IlVTR1MiLCJzdWJUeXBlIjoiZWFydGhxdWFrZSIsInRpbWUiOiIyMDI0LTA0LTAxVDE0OjQ1OjE2LjEwOVoiLCJ0eXBlIjoicXVha2UiLCJ1cmwiOiJodHRwczovL2VhcnRocXVha2UudXNncy5nb3YvZWFydGhxdWFrZXMvZXZlbnRwYWdlL3VzNzAwMG05NzYifSwibWltZV90eXBlIjoiaW1hZ2UvcG5nIiwiaWQiOiJ1czcwMDBtOTc2IiwidGl0bGUiOiJNIDUuMyAtIG5vcnRoZXJuIEVhc3QgUGFjaWZpYyBSaXNlIn0=', - 'receiver-rewards': 0, - 'round-time': 1711994737, + intraRoundOffset: 1, + lastValid: 37545842n, + note: base64ToBytes( + 'eyJzdGFuZGFyZCI6ImFyYzY5IiwiZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdmVyaWZpYWJseSBhdXRoZW50aWMgZGlnaXRhbCBoaXN0b3JpY2FsIGFydGlmYWN0IG1pbnRlZCBieSBUaGUgRGF0YSBIaXN0b3J5IE11c2V1bS4gSXQgcmVwcmVzZW50cyBhIE1hZ25pdHVkZSA1LjMgZWFydGhxdWFrZSB3aXRoIElEIHVzNzAwMG05NzYgd2hpY2ggaGFzIGFuIGVwaWNlbnRyZSBub3J0aGVybiBFYXN0IFBhY2lmaWMgUmlzZSBhbmQgb2NjdXJyZWQgYXQgTW9uLCAwMSBBcHIgMjAyNCAxNDo0NToxNiBHTVQuIFRoZSB2ZXJpZmllZCBzb3VyY2Ugb2YgdGhpcyBkYXRhIGFydGlmYWN0IHdhcyB0aGUgVW5pdGVkIFN0YXRlcyBHZW9sb2dpY2FsIFN1cnZleSAoVVNHUykuIEZvciBtb3JlIGluZm9ybWF0aW9uIHZpc2l0IGh0dHBzOi8vZGF0YWhpc3Rvcnkub3JnLy4iLCJleHRlcm5hbF91cmwiOiJodHRwczovL211c2V1bS5kYXRhaGlzdG9yeS5vcmcvZXZlbnQvUVVBS0UvdXM3MDAwbTk3NiIsInByb3BlcnRpZXMiOnsibWFnbml0dWRlIjo1LjMsImNsYXNzIjoiTTUiLCJkZXB0aCI6MTAsImxhdGl0dWRlIjo4LjI1MSwibG9uZ2l0dWRlIjotMTAzLjIyNiwicGxhY2UiOiJub3J0aGVybiBFYXN0IFBhY2lmaWMgUmlzZSIsInNvdXJjZSI6IlVTR1MiLCJzdWJUeXBlIjoiZWFydGhxdWFrZSIsInRpbWUiOiIyMDI0LTA0LTAxVDE0OjQ1OjE2LjEwOVoiLCJ0eXBlIjoicXVha2UiLCJ1cmwiOiJodHRwczovL2VhcnRocXVha2UudXNncy5nb3YvZWFydGhxdWFrZXMvZXZlbnRwYWdlL3VzNzAwMG05NzYifSwibWltZV90eXBlIjoiaW1hZ2UvcG5nIiwiaWQiOiJ1czcwMDBtOTc2IiwidGl0bGUiOiJNIDUuMyAtIG5vcnRoZXJuIEVhc3QgUGFjaWZpYyBSaXNlIn0=' + ), + receiverRewards: 0n, + roundTime: 1711994737, sender: 'EHYQCYHUC6CIWZLBX5TDTLVJ4SSVE4RRTMKFDCG4Z4Q7QSQ2XWIQPMKBPU', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'B9QPA7n9QGK0uAHja5g2rK0tkPoWM1h4usQUVgZTffkNVMBGgpe2XtpQBrhjDSbTW5GbCHEKr44ckI6RUu2YDg==', + sig: base64ToBytes('B9QPA7n9QGK0uAHja5g2rK0tkPoWM1h4usQUVgZTffkNVMBGgpe2XtpQBrhjDSbTW5GbCHEKr44ckI6RUu2YDg=='), }, - 'tx-type': TransactionType.acfg, + txType: TransactionType.acfg, }) }, ['mainnet-2XFGVOHMFYLAWBHOSIOI67PBT5LDRHBTD3VLX5EYBDTFNVKMCJIA']: () => { // Asset freeze transaction return new TransactionResultBuilder({ - 'asset-freeze-transaction': { + assetFreezeTransaction: { address: 'ZJU3X2B2QN3BUBIJ64JZ565V363ANGBUDOLXAJHDXGIIMYK6WV3NSNCBQQ', - 'asset-id': 1707148495, - 'new-freeze-status': true, - }, - 'auth-addr': 'FJ5ZFYSXL5SDNWSWBFWUROO4VQRPA42ICJRMRZYGPWXWLBE7TT3HRXWJF4', - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 37463564, - fee: 1000, - 'first-valid': 37463562, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', - group: 'xERjxVTlNb8jeHa16qmpxDMh4+dcDCokO69QnNESbFk=', + assetId: 1707148495n, + newFreezeStatus: true, + }, + authAddr: algosdk.Address.fromString('FJ5ZFYSXL5SDNWSWBFWUROO4VQRPA42ICJRMRZYGPWXWLBE7TT3HRXWJF4'), + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 37463564n, + fee: 1000n, + firstValid: 37463562n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', + group: base64ToBytes('xERjxVTlNb8jeHa16qmpxDMh4+dcDCokO69QnNESbFk='), id: '2XFGVOHMFYLAWBHOSIOI67PBT5LDRHBTD3VLX5EYBDTFNVKMCJIA', - 'intra-round-offset': 2, - 'last-valid': 37464562, - note: 'TkZUIGZyZWV6ZWQgYnkgbG9mdHkuYWk=', - 'receiver-rewards': 0, - 'round-time': 1711760608, + intraRoundOffset: 2, + lastValid: 37464562n, + note: base64ToBytes('TkZUIGZyZWV6ZWQgYnkgbG9mdHkuYWk='), + receiverRewards: 0n, + roundTime: 1711760608, sender: 'E4A6FVIHXSZ3F7QXRCOTYDDILVQYEBFH56HYDIIYX4SVXS2QX5GUTBVZHY', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: '7RUentpSD0yu+vP+sCkITzeexaEANTtOFN3uXC8+HNi3Q0zDvpUzDlmBR5s51CWfoQ6BkFse0sH4MqSj2QdBAA==', + sig: base64ToBytes('7RUentpSD0yu+vP+sCkITzeexaEANTtOFN3uXC8+HNi3Q0zDvpUzDlmBR5s51CWfoQ6BkFse0sH4MqSj2QdBAA=='), }, - 'tx-type': TransactionType.afrz, + txType: TransactionType.afrz, }) }, ['mainnet-VE767RE4HGQM7GFC7MUVY3J67KOR5TV34OBTDDEQTDET2UFM7KTQ']: () => { // Key reg transaction (online) return new TransactionResultBuilder({ - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 107358, - fee: 1000, - 'first-valid': 107100, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 107358n, + fee: 1000n, + firstValid: 107100n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), id: 'VE767RE4HGQM7GFC7MUVY3J67KOR5TV34OBTDDEQTDET2UFM7KTQ', - 'intra-round-offset': 0, - 'keyreg-transaction': { - 'non-participation': false, - 'selection-participation-key': 'irHd9MGgb7ou2aDUHtgvpqA6lvhtgMCJgldKgP8bu6Q=', - 'vote-first-valid': 1000, - 'vote-key-dilution': 10000, - 'vote-last-valid': 5180000, - 'vote-participation-key': 'YlVE4fhZdVHS5ap0ltTyn6Oy3a2Xl9exzOLk4/fF3cY=', - }, - 'last-valid': 108100, - 'receiver-rewards': 0, - 'round-time': 1560804790, + intraRoundOffset: 0, + keyregTransaction: { + nonParticipation: false, + selectionParticipationKey: base64ToBytes('irHd9MGgb7ou2aDUHtgvpqA6lvhtgMCJgldKgP8bu6Q='), + voteFirstValid: 1000n, + voteKeyDilution: 10000n, + voteLastValid: 5180000n, + voteParticipationKey: base64ToBytes('YlVE4fhZdVHS5ap0ltTyn6Oy3a2Xl9exzOLk4/fF3cY='), + }, + lastValid: 108100n, + receiverRewards: 0n, + roundTime: 1560804790, sender: '65NE3RG7Q3IWZMFPKAHSGZV766M4HGN73QBWWF2RPT55X32LHYYIV2YLNI', - 'sender-rewards': 0, + senderRewards: 0n, signature: { multisig: { subsignature: [ { - 'public-key': 'P+fQ/gdoJi7pTv/S3MekXkpd5DM2RJrCptJKWdlq8F0=', + publicKey: base64ToBytes('P+fQ/gdoJi7pTv/S3MekXkpd5DM2RJrCptJKWdlq8F0='), }, { - 'public-key': 'HOYGvU9QYLrIFiFhfl7bfnniDrPvyJcRmxRYkyhvK4E=', + publicKey: base64ToBytes('HOYGvU9QYLrIFiFhfl7bfnniDrPvyJcRmxRYkyhvK4E='), }, { - 'public-key': 'SGDOx7hcSmrIEZl4a77IuiEGbTweO6kETsRr8P7h0pM=', - signature: 'PoAKqk3najREZpATvsXMjIRa0I2zOokENzVolJjZbBjQ/0XsvCStmlOJGeTwiVVqzlE8Tuta54kNGBxY5nFADg==', + publicKey: base64ToBytes('SGDOx7hcSmrIEZl4a77IuiEGbTweO6kETsRr8P7h0pM='), + signature: base64ToBytes('PoAKqk3najREZpATvsXMjIRa0I2zOokENzVolJjZbBjQ/0XsvCStmlOJGeTwiVVqzlE8Tuta54kNGBxY5nFADg=='), }, { - 'public-key': 'viR3l2ZLIYcnf3w7bbAhk5K5Z+6fim831WJD49vYgYE=', - signature: 'S4HJ72sVodTVoaIxTrbaSDYqNYGJuMA7rnw40TXuFQu5YxQIJoJa2bVdjhWqpHNmtq/6jYwQulyXXKsUX7VeAQ==', + publicKey: base64ToBytes('viR3l2ZLIYcnf3w7bbAhk5K5Z+6fim831WJD49vYgYE='), + signature: base64ToBytes('S4HJ72sVodTVoaIxTrbaSDYqNYGJuMA7rnw40TXuFQu5YxQIJoJa2bVdjhWqpHNmtq/6jYwQulyXXKsUX7VeAQ=='), }, { - 'public-key': 'BFK+wNJWcHgFylbjjNeXjAoT5vHxYJ/TYE/gAP6px1Y=', - signature: 'T51Fk4+EdtrzNCHAOK75HaZq3Fp74KgwHWyCMhTW56B2abFaDOnA3Elk6iF8U97tWHJXYMMRjDUGxyPOue+0CQ==', + publicKey: base64ToBytes('BFK+wNJWcHgFylbjjNeXjAoT5vHxYJ/TYE/gAP6px1Y='), + signature: base64ToBytes('T51Fk4+EdtrzNCHAOK75HaZq3Fp74KgwHWyCMhTW56B2abFaDOnA3Elk6iF8U97tWHJXYMMRjDUGxyPOue+0CQ=='), }, ], threshold: 3, version: 1, }, }, - 'tx-type': TransactionType.keyreg, + txType: TransactionType.keyreg, }) }, ['mainnet-BABZ5DOKAN7IP6FJ5PZSP2NRQU5OFRPZ7WIS2A3DRXCWEMVEM3PQ']: () => { // Key reg transaction (offline) return new TransactionResultBuilder({ - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 3771703, - fee: 1000, - 'first-valid': 3771500, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - group: 'UPF4ynUkbZa21a+lTsx/IFkaPmvaa479XhmyCr6C+U4=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 3771703n, + fee: 1000n, + firstValid: 3771500n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + group: base64ToBytes('UPF4ynUkbZa21a+lTsx/IFkaPmvaa479XhmyCr6C+U4='), id: 'BABZ5DOKAN7IP6FJ5PZSP2NRQU5OFRPZ7WIS2A3DRXCWEMVEM3PQ', - 'intra-round-offset': 1, - 'keyreg-transaction': { - 'non-participation': true, - 'vote-first-valid': 0, - 'vote-key-dilution': 0, - 'vote-last-valid': 0, - }, - 'last-valid': 3772500, - 'receiver-rewards': 0, - 'round-time': 1576797938, + intraRoundOffset: 1, + keyregTransaction: { + nonParticipation: true, + voteFirstValid: 0n, + voteKeyDilution: 0n, + voteLastValid: 0n, + }, + lastValid: 3772500n, + receiverRewards: 0n, + roundTime: 1576797938, sender: 'P4YDFXSWGQHC4FQUWMWZX7PEIZXIQ65D2AAFNEBYNGL77KSYRBTJORQUB4', - 'sender-rewards': 0, + senderRewards: 0n, signature: { multisig: { subsignature: [ { - 'public-key': 'bNQS50I46qXriRN2xx0xMaDdGPPBNSHqgT1LaQonZDI=', - signature: 'GSD4t8GW9kRQkf3NpDw2knLdO3TnpXtQlrWxuvPddR+Yt7wKZDMBFAZDqZmgzSgyoWC2w9w4T22o/hxnb10OAA==', + publicKey: base64ToBytes('bNQS50I46qXriRN2xx0xMaDdGPPBNSHqgT1LaQonZDI='), + signature: base64ToBytes('GSD4t8GW9kRQkf3NpDw2knLdO3TnpXtQlrWxuvPddR+Yt7wKZDMBFAZDqZmgzSgyoWC2w9w4T22o/hxnb10OAA=='), }, { - 'public-key': 'vZE4jUasfWO75z9ihbXgQfvD8XX+wd/+U6Lw9hBLP4o=', + publicKey: base64ToBytes('vZE4jUasfWO75z9ihbXgQfvD8XX+wd/+U6Lw9hBLP4o='), }, { - 'public-key': 'il9Q7WCNQHqZx9dHkbUzaT12II+QzowXJ03vx5BCUe8=', - signature: 'FKvfwstu9ndvrVNdXWXUngfqXTc5xPL8u15Vw/sk55jMw1BtgUB2Zt+0Xg2/+MfbfWhSNCB8MdHP853sytU/AA==', + publicKey: base64ToBytes('il9Q7WCNQHqZx9dHkbUzaT12II+QzowXJ03vx5BCUe8='), + signature: base64ToBytes('FKvfwstu9ndvrVNdXWXUngfqXTc5xPL8u15Vw/sk55jMw1BtgUB2Zt+0Xg2/+MfbfWhSNCB8MdHP853sytU/AA=='), }, { - 'public-key': 'oAw2AOZcYeJMnNxEeRbU1uPrNefVMevvqQsikxniQrs=', + publicKey: base64ToBytes('oAw2AOZcYeJMnNxEeRbU1uPrNefVMevvqQsikxniQrs='), }, { - 'public-key': 'JXgbR4xQGD0G1+qMRNsJ7JvojVY7xww5ZC3cLkK7N0Y=', - signature: 'krGtp1YgxiRE8+eS1mzGZhL9FIoHyaS6sEtAr6pLVjInKUXu5djHExSJewNtcMD8Cfap1qLeokTigYnqy/piCw==', + publicKey: base64ToBytes('JXgbR4xQGD0G1+qMRNsJ7JvojVY7xww5ZC3cLkK7N0Y='), + signature: base64ToBytes('krGtp1YgxiRE8+eS1mzGZhL9FIoHyaS6sEtAr6pLVjInKUXu5djHExSJewNtcMD8Cfap1qLeokTigYnqy/piCw=='), }, { - 'public-key': 'xwI8Y6cpL67araO5O3Tqsxpq963vq7M48KA3XwJy2CA=', + publicKey: base64ToBytes('xwI8Y6cpL67araO5O3Tqsxpq963vq7M48KA3XwJy2CA='), }, ], threshold: 3, version: 1, }, }, - 'tx-type': TransactionType.keyreg, + txType: TransactionType.keyreg, }) }, ['mainnet-7VSN7QTNBT7X4V5JH2ONKTJYF6VSQSE2H5J7VTDWFCJGSJED3QUA']: () => { // App call return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [], - 'application-args': [], - 'application-id': 1201559522, - 'foreign-apps': [], - 'foreign-assets': [0], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': ApplicationOnComplete.noop, - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 36591812, - fee: 1000, - 'first-valid': 36591810, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', - group: '/oRSr2uMFemQhwQliJO18b64Nl1QIkjA39ZszRCeSCI=', + applicationArgs: [], + applicationId: 1201559522n, + foreignApps: [], + foreignAssets: [0n], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: ApplicationOnComplete.noop, + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 36591812n, + fee: 1000n, + firstValid: 36591810n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', + group: base64ToBytes('/oRSr2uMFemQhwQliJO18b64Nl1QIkjA39ZszRCeSCI='), id: '7VSN7QTNBT7X4V5JH2ONKTJYF6VSQSE2H5J7VTDWFCJGSJED3QUA', - 'intra-round-offset': 125, - 'last-valid': 36591814, - 'receiver-rewards': 0, - 'round-time': 1709251673, + intraRoundOffset: 125, + lastValid: 36591814n, + receiverRewards: 0n, + roundTime: 1709251673, sender: 'AACCDJTFPQR5UQJZ337NFR56CC44T776EWBGVJG5NY2QFTQWBWTALTEN4A', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: '0b7E1n67IzmPYtzYbrVCIN+WwAPqF1j0NrP0OQvFu10Phv77vFkrvWGtoUxZtZZZt8uqHylJA1MEln2wLrHpDQ==', + sig: base64ToBytes('0b7E1n67IzmPYtzYbrVCIN+WwAPqF1j0NrP0OQvFu10Phv77vFkrvWGtoUxZtZZZt8uqHylJA1MEln2wLrHpDQ=='), }, - 'tx-type': TransactionType.appl, - } as unknown as TransactionResult) // The type definition for App Call transaction in indexer seems to be wrong + txType: TransactionType.appl, + }) // The type definition for App Call transaction in indexer seems to be wrong }, ['mainnet-4BFQTYKSJNRF52LXCMBXKDWLODRDVGSUCW36ND3B7C3ZQKPMLUJA']: () => { // Asset config return new TransactionResultBuilder({ - 'asset-config-transaction': { - 'asset-id': 1800979729, + assetConfigTransaction: { + assetId: 1800979729n, params: { creator: 'EHYQCYHUC6CIWZLBX5TDTLVJ4SSVE4RRTMKFDCG4Z4Q7QSQ2XWIQPMKBPU', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, manager: 'EHYQCYHUC6CIWZLBX5TDTLVJ4SSVE4RRTMKFDCG4Z4Q7QSQ2XWIQPMKBPU', reserve: 'ESK3ZHVALWTRWTEQVRO4ZGZGGOFCKCJNVE5ODFMPWICXVSJVJZYINHHYHE', - total: 0, + total: 0n, }, }, - 'auth-addr': '5ROHDU55YSX545QRE5G2SGZD77OVAJK4RKHAAT7CPMHMNRJACSQUKTUT3M', - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 38394154, - fee: 1000, - 'first-valid': 38394151, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', + authAddr: algosdk.Address.fromString('5ROHDU55YSX545QRE5G2SGZD77OVAJK4RKHAAT7CPMHMNRJACSQUKTUT3M'), + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 38394154n, + fee: 1000n, + firstValid: 38394151n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', id: '4BFQTYKSJNRF52LXCMBXKDWLODRDVGSUCW36ND3B7C3ZQKPMLUJA', - 'intra-round-offset': 3, - 'last-valid': 38395151, - note: 'eyJzdGFuZGFyZCI6ImFyYzY5IiwiZGVzY3JpcHRpb24iOiJUaGlzIGlzIGFuIGFscGhhIGRhdGEgYXJ0aWZhY3QgbWludGVkIGJ5IFRoZSBEYXRhIEhpc3RvcnkgTXVzZXVtLiBJdCByZXByZXNlbnRzIGEgQ2xhc3MgTTEuNiBzb2xhciBmbGFyZS4gVGhlIHZlcmlmaWVkIHNvdXJjZSBvZiB0aGlzIGRhdGEgYXJ0aWZhY3Qgd2FzIHRoZSBOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbiAoTk9BQSkuIEZvciBtb3JlIGluZm9ybWF0aW9uIHZpc2l0IGh0dHBzOi8vZGF0YWhpc3Rvcnkub3JnLy4iLCJleHRlcm5hbF91cmwiOiJodHRwczovL211c2V1bS5kYXRhaGlzdG9yeS5vcmcvZXZlbnQvU09MRkxBUkUvU0NRQ1NPIiwicHJvcGVydGllcyI6eyJzYXRlbGxpdGUiOiJHT0VTLTE2Iiwic291cmNlIjoiTk9BQSIsImJlZ2luVGltZSI6IjIwMjQtMDQtMzBUMDA6NDY6MDBaIiwiYmVnaW5DbGFzcyI6IkMxLjEiLCJwZWFrQ2xhc3MiOiJNMS42IiwicGVha1RpbWUiOiIyMDI0LTA0LTMwVDAxOjE0OjAwWiIsInBlYWtYcmF5Rmx1eCI6IjEuNjQxMTBlLTUgV23igbvCsiIsImVuZFRpbWUiOiIyMDI0LTA0LTMwVDAxOjMxOjAwWiIsImVuZENsYXNzIjoiQzguMyIsInR5cGUiOiJzb2xhciIsInN1YlR5cGUiOiJmbGFyZSJ9LCJtaW1lX3R5cGUiOiJ2aWRlby9tcDQiLCJpZCI6IlNDUUNTTyIsInRpdGxlIjoiQ2xhc3MgTTEuNiBzb2xhciBmbGFyZSB0aGF0IHBlYWtlZCBhdCBUdWUsIDMwIEFwciAyMDI0IDAxOjE0OjAwIEdNVCJ9', - 'receiver-rewards': 0, - 'round-time': 1714440885, + intraRoundOffset: 3, + lastValid: 38395151n, + note: base64ToBytes( + 'eyJzdGFuZGFyZCI6ImFyYzY5IiwiZGVzY3JpcHRpb24iOiJUaGlzIGlzIGFuIGFscGhhIGRhdGEgYXJ0aWZhY3QgbWludGVkIGJ5IFRoZSBEYXRhIEhpc3RvcnkgTXVzZXVtLiBJdCByZXByZXNlbnRzIGEgQ2xhc3MgTTEuNiBzb2xhciBmbGFyZS4gVGhlIHZlcmlmaWVkIHNvdXJjZSBvZiB0aGlzIGRhdGEgYXJ0aWZhY3Qgd2FzIHRoZSBOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbiAoTk9BQSkuIEZvciBtb3JlIGluZm9ybWF0aW9uIHZpc2l0IGh0dHBzOi8vZGF0YWhpc3Rvcnkub3JnLy4iLCJleHRlcm5hbF91cmwiOiJodHRwczovL211c2V1bS5kYXRhaGlzdG9yeS5vcmcvZXZlbnQvU09MRkxBUkUvU0NRQ1NPIiwicHJvcGVydGllcyI6eyJzYXRlbGxpdGUiOiJHT0VTLTE2Iiwic291cmNlIjoiTk9BQSIsImJlZ2luVGltZSI6IjIwMjQtMDQtMzBUMDA6NDY6MDBaIiwiYmVnaW5DbGFzcyI6IkMxLjEiLCJwZWFrQ2xhc3MiOiJNMS42IiwicGVha1RpbWUiOiIyMDI0LTA0LTMwVDAxOjE0OjAwWiIsInBlYWtYcmF5Rmx1eCI6IjEuNjQxMTBlLTUgV23igbvCsiIsImVuZFRpbWUiOiIyMDI0LTA0LTMwVDAxOjMxOjAwWiIsImVuZENsYXNzIjoiQzguMyIsInR5cGUiOiJzb2xhciIsInN1YlR5cGUiOiJmbGFyZSJ9LCJtaW1lX3R5cGUiOiJ2aWRlby9tcDQiLCJpZCI6IlNDUUNTTyIsInRpdGxlIjoiQ2xhc3MgTTEuNiBzb2xhciBmbGFyZSB0aGF0IHBlYWtlZCBhdCBUdWUsIDMwIEFwciAyMDI0IDAxOjE0OjAwIEdNVCJ9' + ), + receiverRewards: 0n, + roundTime: 1714440885, sender: 'EHYQCYHUC6CIWZLBX5TDTLVJ4SSVE4RRTMKFDCG4Z4Q7QSQ2XWIQPMKBPU', - 'sender-rewards': 0, - signature: { sig: 'xQjGgT33TOy7dQm0vzDFsHbTDl4BHnzOOp0gHDkexH3Ci5ZFrNgQYnSVyncJ3Cw9MsSybw/3cZwoboK7/O2RDg==' }, - 'tx-type': TransactionType.acfg, + senderRewards: 0n, + signature: { sig: base64ToBytes('xQjGgT33TOy7dQm0vzDFsHbTDl4BHnzOOp0gHDkexH3Ci5ZFrNgQYnSVyncJ3Cw9MsSybw/3cZwoboK7/O2RDg==') }, + txType: TransactionType.acfg, }) }, ['mainnet-P4IX7SYWTTFRQGYTCLFOZSTYSJ5FJKNR3MEIVRR4OA2JJXTQZHTQ']: () => { // Asset config return new TransactionResultBuilder({ - 'asset-config-transaction': { - 'asset-id': 0, + assetConfigTransaction: { + assetId: 0n, params: { creator: 'JUT54SRAQLZ34MZ7I45KZJG63H3VLJ65VLLOLVVXPIBE3B2C7GFKBF5QAE', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, manager: 'JUT54SRAQLZ34MZ7I45KZJG63H3VLJ65VLLOLVVXPIBE3B2C7GFKBF5QAE', name: 'Bad Bunny Society #587', - 'name-b64': encoder.encode('QmFkIEJ1bm55IFNvY2lldHkgIzU4Nw=='), + nameB64: encoder.encode('QmFkIEJ1bm55IFNvY2lldHkgIzU4Nw=='), reserve: 'V4UCC2YXBHLELD7Y6HYSKZI4GABLUG5HE6HAQQ36OBXFEZS7W4VMWB6DUQ', - total: 1, - 'unit-name': 'bbs587', - 'unit-name-b64': encoder.encode('YmJzNTg3'), + total: 1n, + unitName: 'bbs587', + unitNameB64: encoder.encode('YmJzNTg3'), url: 'template-ipfs://{ipfscid:1:raw:reserve:sha2-256}', - 'url-b64': encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6cmF3OnJlc2VydmU6c2hhMi0yNTZ9'), - }, - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 23110800, - 'created-asset-index': 854081201, - fee: 1000, - 'first-valid': 23110798, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', - group: 'x2iqKcM/w+966sWzIzvH0ySIH9eq7ZCWqGHC6rXILWY=', + urlB64: encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6cmF3OnJlc2VydmU6c2hhMi0yNTZ9'), + }, + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 23110800n, + createdAssetIndex: 854081201n, + fee: 1000n, + firstValid: 23110798n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', + group: base64ToBytes('x2iqKcM/w+966sWzIzvH0ySIH9eq7ZCWqGHC6rXILWY='), id: 'P4IX7SYWTTFRQGYTCLFOZSTYSJ5FJKNR3MEIVRR4OA2JJXTQZHTQ', - 'intra-round-offset': 164, - 'last-valid': 23111798, - note: 'eyJzdGFuZGFyZCI6ImFyYzY5IiwiZGVzY3JpcHRpb24iOiJCYWQgQnVubnkgU29jaWV0eSAjNTg3IiwibWltZV90eXBlIjoiaW1hZ2Uvd2VicCIsInByb3BlcnRpZXMiOnsiQmFja2dyb3VuZCI6IlJlZCIsIlNraW4iOiJQaW5rIiwiRWFyIjoiTXVsdGljb2xvciIsIkJvZHkiOiJPcmFuZ2UgSmFja2V0IiwiTW91dGgiOiJKb2ludCIsIk5vc2UiOiJBY2lkIiwiRXllcyI6IlJhdmUiLCJIZWFkIjoiUmluZyJ9fQ==', - 'receiver-rewards': 0, - 'round-time': 1661696204, + intraRoundOffset: 164, + lastValid: 23111798n, + note: base64ToBytes( + 'eyJzdGFuZGFyZCI6ImFyYzY5IiwiZGVzY3JpcHRpb24iOiJCYWQgQnVubnkgU29jaWV0eSAjNTg3IiwibWltZV90eXBlIjoiaW1hZ2Uvd2VicCIsInByb3BlcnRpZXMiOnsiQmFja2dyb3VuZCI6IlJlZCIsIlNraW4iOiJQaW5rIiwiRWFyIjoiTXVsdGljb2xvciIsIkJvZHkiOiJPcmFuZ2UgSmFja2V0IiwiTW91dGgiOiJKb2ludCIsIk5vc2UiOiJBY2lkIiwiRXllcyI6IlJhdmUiLCJIZWFkIjoiUmluZyJ9fQ==' + ), + receiverRewards: 0n, + roundTime: 1661696204, sender: 'JUT54SRAQLZ34MZ7I45KZJG63H3VLJ65VLLOLVVXPIBE3B2C7GFKBF5QAE', - 'sender-rewards': 0, - signature: { sig: 'kQlJT5RVh7TKuQnIkOw4FI9BJ7k++wSuOcXXxLn6srgnAS/sIuTomN2UNzG9DZIFXjoqlap1wpmcNsl5LVvdAw==' }, - 'tx-type': TransactionType.acfg, + senderRewards: 0n, + signature: { sig: base64ToBytes('kQlJT5RVh7TKuQnIkOw4FI9BJ7k++wSuOcXXxLn6srgnAS/sIuTomN2UNzG9DZIFXjoqlap1wpmcNsl5LVvdAw==') }, + txType: TransactionType.acfg, }) }, ['mainnet-A5MOSCZBJAENBFJ5WDEYYXTTXQAADS6EQFHYLPTHS5WMQ7ZGSM2Q']: () => { // Asset config creation for 917559 return new TransactionResultBuilder({ - 'asset-config-transaction': { - 'asset-id': 0, + assetConfigTransaction: { + assetId: 0n, params: { clawback: 'YA2XBMS34J27VKLIWJQ5AWU7FJASZ6PUNICQOB4PJ2NW4CAX5AHB7RVGMY', creator: 'YA2XBMS34J27VKLIWJQ5AWU7FJASZ6PUNICQOB4PJ2NW4CAX5AHB7RVGMY', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, freeze: 'YA2XBMS34J27VKLIWJQ5AWU7FJASZ6PUNICQOB4PJ2NW4CAX5AHB7RVGMY', manager: 'YA2XBMS34J27VKLIWJQ5AWU7FJASZ6PUNICQOB4PJ2NW4CAX5AHB7RVGMY', name: 'TestAsset3', - 'name-b64': encoder.encode('VGVzdEFzc2V0Mw=='), + nameB64: encoder.encode('VGVzdEFzc2V0Mw=='), reserve: 'YA2XBMS34J27VKLIWJQ5AWU7FJASZ6PUNICQOB4PJ2NW4CAX5AHB7RVGMY', - total: 10000000, - 'unit-name': 'token', - 'unit-name-b64': encoder.encode('dG9rZW4='), - }, - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 6354271, - 'created-asset-index': 917559, - fee: 1000, - 'first-valid': 6354269, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', + total: 10000000n, + unitName: 'token', + unitNameB64: encoder.encode('dG9rZW4='), + }, + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 6354271n, + createdAssetIndex: 917559n, + fee: 1000n, + firstValid: 6354269n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), id: 'A5MOSCZBJAENBFJ5WDEYYXTTXQAADS6EQFHYLPTHS5WMQ7ZGSM2Q', - 'intra-round-offset': 0, - 'last-valid': 6355269, - note: 'l8EIBYWlyQw=', - 'receiver-rewards': 0, - 'round-time': 1588141633, + intraRoundOffset: 0, + lastValid: 6355269n, + note: base64ToBytes('l8EIBYWlyQw='), + receiverRewards: 0n, + roundTime: 1588141633, sender: 'YA2XBMS34J27VKLIWJQ5AWU7FJASZ6PUNICQOB4PJ2NW4CAX5AHB7RVGMY', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'bIT1lgB15oU6F9/vQ5ZFLUyPePRkJ/cxmqUFR9kagkljiA3LCzHva/pUg75iiLV59fBleMzXPo+H9OOec9nKDA==', + sig: base64ToBytes('bIT1lgB15oU6F9/vQ5ZFLUyPePRkJ/cxmqUFR9kagkljiA3LCzHva/pUg75iiLV59fBleMzXPo+H9OOec9nKDA=='), }, - 'tx-type': TransactionType.acfg, + txType: TransactionType.acfg, }) }, ['mainnet-HTGK2WBVXTOHV7X5ER3QT3JH2NQSZU43KEMSTHXMJO5D2E3ROT6Q']: () => { // Asset config reconfigure for 917559 return new TransactionResultBuilder({ - 'asset-config-transaction': { - 'asset-id': 917559, + assetConfigTransaction: { + assetId: 917559n, params: { clawback: 'YA2XBMS34J27VKLIWJQ5AWU7FJASZ6PUNICQOB4PJ2NW4CAX5AHB7RVGMY', creator: 'YA2XBMS34J27VKLIWJQ5AWU7FJASZ6PUNICQOB4PJ2NW4CAX5AHB7RVGMY', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, freeze: 'YA2XBMS34J27VKLIWJQ5AWU7FJASZ6PUNICQOB4PJ2NW4CAX5AHB7RVGMY', manager: 'MBX2M6J44LQ22L3FROYRBKUAG4FWENPSLPTI7EBR4ECQ2APDMI6XTENHWQ', reserve: 'YA2XBMS34J27VKLIWJQ5AWU7FJASZ6PUNICQOB4PJ2NW4CAX5AHB7RVGMY', - total: 0, + total: 0n, }, }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 6354480, - fee: 1000, - 'first-valid': 6354477, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 6354480n, + fee: 1000n, + firstValid: 6354477n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), id: 'HTGK2WBVXTOHV7X5ER3QT3JH2NQSZU43KEMSTHXMJO5D2E3ROT6Q', - 'intra-round-offset': 0, - 'last-valid': 6355477, - note: 'dnuPOsrNYeM=', - 'receiver-rewards': 0, - 'round-time': 1588142543, + intraRoundOffset: 0, + lastValid: 6355477n, + note: base64ToBytes('dnuPOsrNYeM='), + receiverRewards: 0n, + roundTime: 1588142543, sender: 'YA2XBMS34J27VKLIWJQ5AWU7FJASZ6PUNICQOB4PJ2NW4CAX5AHB7RVGMY', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'Lm1ap4lB/0SyCYK4Gb2UbVyJrAega3OccpeGPMh4GJNyqG4of0fwhPdVigW7ImkaVDTzguYqK3UYV9mEvMxZCg==', + sig: base64ToBytes('Lm1ap4lB/0SyCYK4Gb2UbVyJrAega3OccpeGPMh4GJNyqG4of0fwhPdVigW7ImkaVDTzguYqK3UYV9mEvMxZCg=='), }, - 'tx-type': TransactionType.acfg, + txType: TransactionType.acfg, }) }, ['mainnet-K66JS73E3BDJ4OYHIC4QRRNSGY2PQMKSQMPYFQ6EEYJTOIPDUA3Q']: () => { // Asset config return new TransactionResultBuilder({ - 'asset-config-transaction': { - 'asset-id': 0, + assetConfigTransaction: { + assetId: 0n, params: { creator: 'COOPLFOESCTQJVLSFKAA4QURNBDZGMRYJVRH7BRRREB7FFZSHIIA4AVIBE', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, manager: 'COOPLFOESCTQJVLSFKAA4QURNBDZGMRYJVRH7BRRREB7FFZSHIIA4AVIBE', name: 'Coop #48', - 'name-b64': encoder.encode('Q29vcCAjNDg='), + nameB64: encoder.encode('Q29vcCAjNDg='), reserve: '6ZTNQ3SPQEYOWIXZHQR6HSX6CZSQ4FLYOXOCPNJSNRRT6QA2FFD6JIBDSI', - total: 1, - 'unit-name': 'Coop48', - 'unit-name-b64': encoder.encode('Q29vcDQ4'), + total: 1n, + unitName: 'Coop48', + unitNameB64: encoder.encode('Q29vcDQ4'), url: 'template-ipfs://{ipfscid:1:raw:reserve:sha2-256}', - 'url-b64': encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6cmF3OnJlc2VydmU6c2hhMi0yNTZ9'), - }, - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 38688486, - 'created-asset-index': 1820067164, - fee: 1000, - 'first-valid': 38688195, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', - group: 'U8DZy01c8WOvL9uuvBKRUpzkpxxsOnotnhN3cfqIZbU=', + urlB64: encoder.encode('dGVtcGxhdGUtaXBmczovL3tpcGZzY2lkOjE6cmF3OnJlc2VydmU6c2hhMi0yNTZ9'), + }, + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 38688486n, + createdAssetIndex: 1820067164n, + fee: 1000n, + firstValid: 38688195n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', + group: base64ToBytes('U8DZy01c8WOvL9uuvBKRUpzkpxxsOnotnhN3cfqIZbU='), id: 'K66JS73E3BDJ4OYHIC4QRRNSGY2PQMKSQMPYFQ6EEYJTOIPDUA3Q', - 'intra-round-offset': 39, - 'last-valid': 38689195, - 'receiver-rewards': 0, - 'round-time': 1715286054, + intraRoundOffset: 39, + lastValid: 38689195n, + receiverRewards: 0n, + roundTime: 1715286054, sender: 'COOPLFOESCTQJVLSFKAA4QURNBDZGMRYJVRH7BRRREB7FFZSHIIA4AVIBE', - 'sender-rewards': 0, - signature: { sig: 'e5usiTCw+xuiY5whu1xESgOqnCmahpDRhJ8fOWIMD80crhgR1O3/05BiMIJnlEvu9icv5+7tarvomyNExdEdDA==' }, - 'tx-type': TransactionType.acfg, + senderRewards: 0n, + signature: { sig: base64ToBytes('e5usiTCw+xuiY5whu1xESgOqnCmahpDRhJ8fOWIMD80crhgR1O3/05BiMIJnlEvu9icv5+7tarvomyNExdEdDA==') }, + txType: TransactionType.acfg, }) }, ['mainnet-XCXQW7J5G5QSPVU5JFYEELVIAAABPLZH2I36BMNVZLVHOA75MPAQ']: () => { return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [], - 'application-args': [ - '+Qj2KQ==', - '0QGHvZ1GkfgBxdPm8vbFxBpukSHn/8UGJmPuEFl9eDk=', - 'AQ==', - 'SiiuYA7RqfpffknPvqrI4BO3jJiUYf68SUqj2gb+jD0=', + applicationArgs: [ + base64ToBytes('+Qj2KQ=='), + base64ToBytes('0QGHvZ1GkfgBxdPm8vbFxBpukSHn/8UGJmPuEFl9eDk='), + base64ToBytes('AQ=='), + base64ToBytes('SiiuYA7RqfpffknPvqrI4BO3jJiUYf68SUqj2gb+jD0='), ], - 'application-id': 0, - 'approval-program': - 'CSAEAAEGAiYJDG5mdGlja2V0X2FwcAABAA9tYW5hZ2VyX2FkZHJlc3MBAQQuU0kZBGg0o6oSbWV0aG9kX3Blcm1pc3Npb25zB2FpcmxpbmUxGyISQAEtNhoAgAThNZDwEkABETYaAIAEnNbuoRJAAPU2GgCABF5iYz4SQADZNhoAgAS2olF1EkAAvTYaAIAE+Qj2KRJAAKE2GgCABB0UDY4SQACFNhoAgATG43mkEkAAaTYaACcFEkAAUTYaAIAEnvUJRhJAADU2GgCABE+i3akSQAAZNhoAJwYSQAABADEZIhIxGCITEESIBBYjQzEZIhIxGCITEESIA+wjQzEZIhIxGCITEESIA7IjQzEZIhIxGCITEESIA34jQzEZIhIxGCITEESIA0wjQzEZIhIxGCITEESIAxAjQzEZIhIxGCISEESIAuAjQzEZIhIxGCITEESIArcjQzEZIhIxGCITEESIApcjQzEZIhIxGCITEESIAncjQzEZIhIxGCITEESIAlcjQzEZIxJAADYxGSUSQAAlMRmBBBJAABMxGYEFEkAAAQAxGCITRIgAViNDMRgiE0SIAEEjQzEYIhNEiABSI0MxGCITRIgAQyNDigIBi/4yCGFAAAQiQgAbi/4iJwdjNQE1ADQBQAAHIov/U0IABTQAQv/1iYoAADEAMgkSRCNDigAAMQAyCRJEI0OKAAAjQ4oAACNDigEAMQAyCRJEK4v/wBxniYoBADEAK2QSRLEkshAjshmL/8AyshgisgGziYoBADEAK2QSRLEkshAlshmL/8AyshgisgGziYoCADEAK2QSRIv+wBwnB4v/ZomKAgGL/icIZBJAAAqL/ov/iP9JQgABI4mKAwAoi/7AMmcri/1nJwiL/2cjQ4oFADEAIoj/y0SxJLIQKGSyGIAEWOGHaLIai/uyGov8shqL/bIai/6yGov/shoisgGziYoDADEAJIj/mESxJLIQKGSyGIv/wByyHIv+wDCyMIAErnlpMLIai/2yGiqyGicEshoisgGziYoDADEAgQOI/2FEsSSyEChkshiL/sAcshyL/8AcshyL/cAwsjAnBbIaKrIaJwSyGoABArIaIrIBs4mKBAAxAIEFiP8nRLEkshAoZLIYi/zAMLIwgAQ7tliRshoqshqL/bIai/4WVwQAshqL/7IaIrIBs4mKAgAxAIEEiP7uRLEkshAoZLIYi/7AMLIwgARMfzwNshoqshoqIov/VrIaIrIBs4mKAwAxACWI/r9EsSSyEChkshiL/8AcshyL/sAwsjAnBrIai/2yGiqyGicEshoisgGziYoAACI2GgEiVYwAiwCI/i2JigAAIjYaASJVjACLAIj+LImKAAAiNhoBIlWMAIsAiP42iYoAACJJNhoBIlWMADYaAheMAYsAiwGI/jeJigAAKSIpNhoBjAA2GgIiVYwBNhoDjAKLAIsBiwKI/kGJigAAKUcENhoBjAA2GgKMATYaA4wCNhoEjAM2GgWMBIsAiwGLAosDiwSI/iiJigAAKSJJNhoBjAA2GgIiVYwBNhoDIlWMAosAiwGLAoj+OImKAAAiRwI2GgEiVYwANhoCIlWMATYaAyJVjAKLAIsBiwKI/kmJigAAIikiKTYaASJVjAA2GgKMATYaAyJajAI2GgSMA4sAiwGLAosDiP5YiYoAACJJNhoBIlWMADYaAiJVjAGLAIsBiP52iYoAACkiSTYaAYwANhoCIlWMATYaAyJVjAKLAIsBiwKI/oOJ', - 'clear-state-program': 'CYEAQw==', - 'foreign-apps': [1196710954], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 2, - 'num-uint': 1, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 1, - }, - 'on-completion': 'noop', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 32218016, - 'created-application-index': 1196727051, - fee: 1000, - 'first-valid': 32218000, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', - 'global-state-delta': [ + applicationId: 0n, + approvalProgram: base64ToBytes( + 'CSAEAAEGAiYJDG5mdGlja2V0X2FwcAABAA9tYW5hZ2VyX2FkZHJlc3MBAQQuU0kZBGg0o6oSbWV0aG9kX3Blcm1pc3Npb25zB2FpcmxpbmUxGyISQAEtNhoAgAThNZDwEkABETYaAIAEnNbuoRJAAPU2GgCABF5iYz4SQADZNhoAgAS2olF1EkAAvTYaAIAE+Qj2KRJAAKE2GgCABB0UDY4SQACFNhoAgATG43mkEkAAaTYaACcFEkAAUTYaAIAEnvUJRhJAADU2GgCABE+i3akSQAAZNhoAJwYSQAABADEZIhIxGCITEESIBBYjQzEZIhIxGCITEESIA+wjQzEZIhIxGCITEESIA7IjQzEZIhIxGCITEESIA34jQzEZIhIxGCITEESIA0wjQzEZIhIxGCITEESIAxAjQzEZIhIxGCISEESIAuAjQzEZIhIxGCITEESIArcjQzEZIhIxGCITEESIApcjQzEZIhIxGCITEESIAncjQzEZIhIxGCITEESIAlcjQzEZIxJAADYxGSUSQAAlMRmBBBJAABMxGYEFEkAAAQAxGCITRIgAViNDMRgiE0SIAEEjQzEYIhNEiABSI0MxGCITRIgAQyNDigIBi/4yCGFAAAQiQgAbi/4iJwdjNQE1ADQBQAAHIov/U0IABTQAQv/1iYoAADEAMgkSRCNDigAAMQAyCRJEI0OKAAAjQ4oAACNDigEAMQAyCRJEK4v/wBxniYoBADEAK2QSRLEkshAjshmL/8AyshgisgGziYoBADEAK2QSRLEkshAlshmL/8AyshgisgGziYoCADEAK2QSRIv+wBwnB4v/ZomKAgGL/icIZBJAAAqL/ov/iP9JQgABI4mKAwAoi/7AMmcri/1nJwiL/2cjQ4oFADEAIoj/y0SxJLIQKGSyGIAEWOGHaLIai/uyGov8shqL/bIai/6yGov/shoisgGziYoDADEAJIj/mESxJLIQKGSyGIv/wByyHIv+wDCyMIAErnlpMLIai/2yGiqyGicEshoisgGziYoDADEAgQOI/2FEsSSyEChkshiL/sAcshyL/8AcshyL/cAwsjAnBbIaKrIaJwSyGoABArIaIrIBs4mKBAAxAIEFiP8nRLEkshAoZLIYi/zAMLIwgAQ7tliRshoqshqL/bIai/4WVwQAshqL/7IaIrIBs4mKAgAxAIEEiP7uRLEkshAoZLIYi/7AMLIwgARMfzwNshoqshoqIov/VrIaIrIBs4mKAwAxACWI/r9EsSSyEChkshiL/8AcshyL/sAwsjAnBrIai/2yGiqyGicEshoisgGziYoAACI2GgEiVYwAiwCI/i2JigAAIjYaASJVjACLAIj+LImKAAAiNhoBIlWMAIsAiP42iYoAACJJNhoBIlWMADYaAheMAYsAiwGI/jeJigAAKSIpNhoBjAA2GgIiVYwBNhoDjAKLAIsBiwKI/kGJigAAKUcENhoBjAA2GgKMATYaA4wCNhoEjAM2GgWMBIsAiwGLAosDiwSI/iiJigAAKSJJNhoBjAA2GgIiVYwBNhoDIlWMAosAiwGLAoj+OImKAAAiRwI2GgEiVYwANhoCIlWMATYaAyJVjAKLAIsBiwKI/kmJigAAIikiKTYaASJVjAA2GgKMATYaAyJajAI2GgSMA4sAiwGLAosDiP5YiYoAACJJNhoBIlWMADYaAiJVjAGLAIsBiP52iYoAACkiSTYaAYwANhoCIlWMATYaAyJVjAKLAIsBiwKI/oOJ' + ), + clearStateProgram: base64ToBytes('CYEAQw=='), + foreignApps: [1196710954n], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 2, + numUint: 1, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 1, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 32218016n, + createdApplicationIndex: 1196727051n, + fee: 1000n, + firstValid: 32218000n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', + globalStateDelta: [ { key: 'YWlybGluZQ==', value: { action: 1, bytes: 'SiiuYA7RqfpffknPvqrI4BO3jJiUYf68SUqj2gb+jD0=', - uint: 0, + uint: 0n, }, }, { @@ -1396,128 +1449,135 @@ export const transactionResultMother = { value: { action: 1, bytes: '0QGHvZ1GkfgBxdPm8vbFxBpukSHn/8UGJmPuEFl9eDk=', - uint: 0, + uint: 0n, }, }, { key: 'bmZ0aWNrZXRfYXBw', value: { action: 2, - uint: 1196710954, + uint: 1196710954n, }, }, ], id: 'XCXQW7J5G5QSPVU5JFYEELVIAAABPLZH2I36BMNVZLVHOA75MPAQ', - 'intra-round-offset': 18, - 'last-valid': 32219000, - note: 'QUxHT0tJVF9ERVBMT1lFUjpqeyJuYW1lIjogImNyeXB0b2xlc3MtSklVSzRZQU8yR1U3VVgzNkpISDM1S1dJNEFKM1BERVlTUlE3NVBDSkpLUjVVQlg2UlE2WTVVWlNKUSIsICJ2ZXJzaW9uIjogInYxLjAiLCAiZGVsZXRhYmxlIjogbnVsbCwgInVwZGF0YWJsZSI6IG51bGx9', - 'receiver-rewards': 0, - 'round-time': 1695154915, + intraRoundOffset: 18, + lastValid: 32219000n, + note: base64ToBytes( + 'QUxHT0tJVF9ERVBMT1lFUjpqeyJuYW1lIjogImNyeXB0b2xlc3MtSklVSzRZQU8yR1U3VVgzNkpISDM1S1dJNEFKM1BERVlTUlE3NVBDSkpLUjVVQlg2UlE2WTVVWlNKUSIsICJ2ZXJzaW9uIjogInYxLjAiLCAiZGVsZXRhYmxlIjogbnVsbCwgInVwZGF0YWJsZSI6IG51bGx9' + ), + receiverRewards: 0n, + roundTime: 1695154915, sender: '52MVNW6FNW7L6W7IAKSROD5FYZGZNLVKT6WUWNUFEE3DT737RYIIL2YQ3Y', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'hogSpsFw9RMBA7wlp1bf66qInAlIQ9Q762bWwd/Wah2o5jeZ0dNp29QhXsposgCalhThD5PLVrr6N77vdWZICg==', + sig: base64ToBytes('hogSpsFw9RMBA7wlp1bf66qInAlIQ9Q762bWwd/Wah2o5jeZ0dNp29QhXsposgCalhThD5PLVrr6N77vdWZICg=='), }, - 'tx-type': 'appl', - } as unknown as TransactionResult) + txType: TransactionType.appl, + }) }, ['testnet-24RAYAOGMJ45BL6A7RYQOKZNECCA3VFXQUAM5X64BEDBVFNLPIPQ']: () => { return new TransactionResultBuilder({ - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 28236256, - fee: 1000, - 'first-valid': 28236253, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 28236256n, + fee: 1000n, + firstValid: 28236253n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', id: '24RAYAOGMJ45BL6A7RYQOKZNECCA3VFXQUAM5X64BEDBVFNLPIPQ', - 'intra-round-offset': 0, - 'last-valid': 28237253, - note: 'UmVrZXkgdG8gUVVBTlNDMkdUWlE3R0w1Q0E0MkNNT1lJWDJMSEoyRTdRRDJaRFpLUUpHMldBS0dXT1lCTU5BREhTQQ==', - 'payment-transaction': { - amount: 0, - 'close-amount': 0, + intraRoundOffset: 0, + lastValid: 28237253n, + note: base64ToBytes('UmVrZXkgdG8gUVVBTlNDMkdUWlE3R0w1Q0E0MkNNT1lJWDJMSEoyRTdRRDJaRFpLUUpHMldBS0dXT1lCTU5BREhTQQ=='), + paymentTransaction: { + amount: 0n, + closeAmount: 0n, receiver: 'WK3LE77YNSRUC3GVNP6FA7PF67GWAOLAGTNKOII4YBFSRQ3DW7C72MD4TM', }, - 'receiver-rewards': 0, - 'rekey-to': 'QUANSC2GTZQ7GL5CA42CMOYIX2LHJ2E7QD2ZDZKQJG2WAKGWOYBMNADHSA', - 'round-time': 1678206268, + receiverRewards: 0n, + rekeyTo: algosdk.Address.fromString('QUANSC2GTZQ7GL5CA42CMOYIX2LHJ2E7QD2ZDZKQJG2WAKGWOYBMNADHSA'), + roundTime: 1678206268, sender: 'WK3LE77YNSRUC3GVNP6FA7PF67GWAOLAGTNKOII4YBFSRQ3DW7C72MD4TM', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'G9NwYqLXA8L92cauKXyHeY/Jp5cBUTWwL+Ri2w5ex18mIsWQBq7gNg1EU07mzfKU6i93EqkcVZLyVmA2HJkmDg==', + sig: base64ToBytes('G9NwYqLXA8L92cauKXyHeY/Jp5cBUTWwL+Ri2w5ex18mIsWQBq7gNg1EU07mzfKU6i93EqkcVZLyVmA2HJkmDg=='), }, - 'tx-type': TransactionType.pay, - } as unknown as TransactionResult) + txType: TransactionType.pay, + }) }, ['mainnet-WYEGSIGWZHTR6VYXC3EXFGZQHYKI6FQOZU2DOKHQCAWYEIHJBKEA']: () => { return new TransactionResultBuilder({ - 'application-transaction': { - accounts: ['TRCEY5UZGTATGTF5K3U42IMDT467D4EHV7S5MYJBMLMYARYJOZFATORMUM'], - 'application-args': ['VSe9RA==', 'AAAAAAAAjKA=', 'iAIUTFAh5yRrCAaK2hArJ8JvAULlQXgwIQ4CTCWaymI='], - 'application-id': 1667658418, - 'foreign-apps': [1284326447, 1002541853], - 'foreign-assets': [1284444444], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 39789077, - fee: 1100, - 'first-valid': 39789075, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', + applicationTransaction: { + accounts: [algosdk.Address.fromString('TRCEY5UZGTATGTF5K3U42IMDT467D4EHV7S5MYJBMLMYARYJOZFATORMUM')], + applicationArgs: [ + base64ToBytes('VSe9RA=='), + base64ToBytes('AAAAAAAAjKA='), + base64ToBytes('iAIUTFAh5yRrCAaK2hArJ8JvAULlQXgwIQ4CTCWaymI='), + ], + applicationId: 1667658418n, + foreignApps: [1284326447n, 1002541853n], + foreignAssets: [1284444444n], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 39789077n, + fee: 1100n, + firstValid: 39789075n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', id: 'WYEGSIGWZHTR6VYXC3EXFGZQHYKI6FQOZU2DOKHQCAWYEIHJBKEA', - 'inner-txns': [ + innerTxns: [ { - 'application-transaction': { + id: 'WYEGSIGWZHTR6VYXC3EXFGZQHYKI6FQOZU2DOKHQCAWYEIHJBKEA/inner/1', + applicationTransaction: { accounts: [], - 'application-args': ['qyNwzA==', 'AhFijwBgfEoFZp9C0IaG7/YV8IODPBNX1sEigN+3kTw='], - 'application-id': 1284326447, - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 39789077, - fee: 20000, - 'first-valid': 39789075, - 'global-state-delta': [ + applicationArgs: [base64ToBytes('qyNwzA=='), base64ToBytes('AhFijwBgfEoFZp9C0IaG7/YV8IODPBNX1sEigN+3kTw=')], + applicationId: 1284326447n, + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 39789077n, + fee: 20000n, + firstValid: 39789075n, + globalStateDelta: [ { key: 'dG90YWxfZWZmb3J0', value: { action: 2, - uint: 2177912337898, + uint: 2177912337898n, }, }, { key: 'dG90YWxfdHJhbnNhY3Rpb25z', value: { action: 2, - uint: 328787298, + uint: 328787298n, }, }, ], - 'intra-round-offset': 2, - 'last-valid': 39789078, - 'local-state-delta': [ + intraRoundOffset: 2, + lastValid: 39789078n, + localStateDelta: [ { address: 'AIIWFDYAMB6EUBLGT5BNBBUG573BL4EDQM6BGV6WYERIBX5XSE6FYKJPVE', delta: [ @@ -1525,74 +1585,75 @@ export const transactionResultMother = { key: 'ZWZmb3J0', value: { action: 2, - uint: 744942, + uint: 744942n, }, }, ], }, ], - 'receiver-rewards': 0, - 'round-time': 1718456957, + receiverRewards: 0n, + roundTime: 1718456957, sender: 'AIIWFDYAMB6EUBLGT5BNBBUG573BL4EDQM6BGV6WYERIBX5XSE6FYKJPVE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'application-transaction': { + id: 'WYEGSIGWZHTR6VYXC3EXFGZQHYKI6FQOZU2DOKHQCAWYEIHJBKEA/inner/2', + applicationTransaction: { accounts: [], - 'application-args': ['qyNwzA==', 'AhFijwBgfEoFZp9C0IaG7/YV8IODPBNX1sEigN+3kTw='], - 'application-id': 1284326447, - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 39789077, - fee: 16010, - 'first-valid': 39789075, - 'global-state-delta': [ + applicationArgs: [base64ToBytes('qyNwzA=='), base64ToBytes('AhFijwBgfEoFZp9C0IaG7/YV8IODPBNX1sEigN+3kTw=')], + applicationId: 1284326447n, + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 39789077n, + fee: 16010n, + firstValid: 39789075n, + globalStateDelta: [ { key: 'Y3VycmVudF9taW5lcg==', value: { action: 1, bytes: 'AhFijwBgfEoFZp9C0IaG7/YV8IODPBNX1sEigN+3kTw=', - uint: 0, + uint: 0n, }, }, { key: 'Y3VycmVudF9taW5lcl9lZmZvcnQ=', value: { action: 2, - uint: 36010, + uint: 36010n, }, }, { key: 'dG90YWxfZWZmb3J0', value: { action: 2, - uint: 2177912353908, + uint: 2177912353908n, }, }, { key: 'dG90YWxfdHJhbnNhY3Rpb25z', value: { action: 2, - uint: 328787299, + uint: 328787299n, }, }, ], - 'intra-round-offset': 2, - 'last-valid': 39789078, - 'local-state-delta': [ + intraRoundOffset: 2, + lastValid: 39789078n, + localStateDelta: [ { address: 'AIIWFDYAMB6EUBLGT5BNBBUG573BL4EDQM6BGV6WYERIBX5XSE6FYKJPVE', delta: [ @@ -1600,105 +1661,109 @@ export const transactionResultMother = { key: 'ZWZmb3J0', value: { action: 2, - uint: 760952, + uint: 760952n, }, }, ], }, ], - 'receiver-rewards': 0, - 'round-time': 1718456957, + receiverRewards: 0n, + roundTime: 1718456957, sender: 'AIIWFDYAMB6EUBLGT5BNBBUG573BL4EDQM6BGV6WYERIBX5XSE6FYKJPVE', - 'sender-rewards': 0, - 'tx-type': 'appl', - }, - { - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 39789077, - fee: 0, - 'first-valid': 39789075, - 'intra-round-offset': 2, - 'last-valid': 39789078, - 'payment-transaction': { - amount: 1100, - 'close-amount': 0, + senderRewards: 0n, + txType: TransactionType.appl, + }, + { + id: 'WYEGSIGWZHTR6VYXC3EXFGZQHYKI6FQOZU2DOKHQCAWYEIHJBKEA/inner/3', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 39789077n, + fee: 0n, + firstValid: 39789075n, + intraRoundOffset: 2, + lastValid: 39789078n, + paymentTransaction: { + amount: 1100n, + closeAmount: 0n, receiver: 'BULARZJADNPPHILMT4RC7YYYZ5KMQCUJJS4NXOPELB4LLJBG2TS7U4KO4I', }, - 'receiver-rewards': 0, - 'round-time': 1718456957, + receiverRewards: 0n, + roundTime: 1718456957, sender: 'AIIWFDYAMB6EUBLGT5BNBBUG573BL4EDQM6BGV6WYERIBX5XSE6FYKJPVE', - 'sender-rewards': 0, - 'tx-type': 'pay', + senderRewards: 0n, + txType: TransactionType.pay, }, { - 'asset-transfer-transaction': { - amount: 104857600, - 'asset-id': 1284444444, - 'close-amount': 0, + id: 'WYEGSIGWZHTR6VYXC3EXFGZQHYKI6FQOZU2DOKHQCAWYEIHJBKEA/inner/4', + assetTransferTransaction: { + amount: 104857600n, + assetId: 1284444444n, + closeAmount: 0n, receiver: 'TRCEY5UZGTATGTF5K3U42IMDT467D4EHV7S5MYJBMLMYARYJOZFATORMUM', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 39789077, - fee: 0, - 'first-valid': 39789075, - group: 'N8ZxWk7tVDJindc/9eDzDqLVJcZKSpEeyBZcgRaMD/Q=', - 'intra-round-offset': 2, - 'last-valid': 39789078, - 'receiver-rewards': 0, - 'round-time': 1718456957, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 39789077n, + fee: 0n, + firstValid: 39789075n, + group: base64ToBytes('N8ZxWk7tVDJindc/9eDzDqLVJcZKSpEeyBZcgRaMD/Q='), + intraRoundOffset: 2, + lastValid: 39789078n, + receiverRewards: 0n, + roundTime: 1718456957, sender: 'AIIWFDYAMB6EUBLGT5BNBBUG573BL4EDQM6BGV6WYERIBX5XSE6FYKJPVE', - 'sender-rewards': 0, - 'tx-type': 'axfer', - }, - { - 'application-transaction': { - accounts: ['TRCEY5UZGTATGTF5K3U42IMDT467D4EHV7S5MYJBMLMYARYJOZFATORMUM'], - 'application-args': ['c3dhcA==', 'Zml4ZWQtaW5wdXQ=', 'AAAAAAAKnVg='], - 'application-id': 1002541853, - 'foreign-apps': [], - 'foreign-assets': [1284444444], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 39789077, - fee: 0, - 'first-valid': 39789075, - group: 'N8ZxWk7tVDJindc/9eDzDqLVJcZKSpEeyBZcgRaMD/Q=', - 'inner-txns': [ + senderRewards: 0n, + txType: TransactionType.axfer, + }, + { + id: 'WYEGSIGWZHTR6VYXC3EXFGZQHYKI6FQOZU2DOKHQCAWYEIHJBKEA/inner/5', + applicationTransaction: { + accounts: [algosdk.Address.fromString('TRCEY5UZGTATGTF5K3U42IMDT467D4EHV7S5MYJBMLMYARYJOZFATORMUM')], + applicationArgs: [base64ToBytes('c3dhcA=='), base64ToBytes('Zml4ZWQtaW5wdXQ='), base64ToBytes('AAAAAAAKnVg=')], + applicationId: 1002541853n, + foreignApps: [], + foreignAssets: [1284444444n], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 39789077n, + fee: 0n, + firstValid: 39789075n, + group: base64ToBytes('N8ZxWk7tVDJindc/9eDzDqLVJcZKSpEeyBZcgRaMD/Q='), + innerTxns: [ { - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 39789077, - fee: 0, - 'first-valid': 39789075, - 'intra-round-offset': 2, - 'last-valid': 39789078, - 'payment-transaction': { - amount: 732252, - 'close-amount': 0, + id: 'WYEGSIGWZHTR6VYXC3EXFGZQHYKI6FQOZU2DOKHQCAWYEIHJBKEA/inner/5/1', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 39789077n, + fee: 0n, + firstValid: 39789075n, + intraRoundOffset: 2, + lastValid: 39789078n, + paymentTransaction: { + amount: 732252n, + closeAmount: 0n, receiver: 'AIIWFDYAMB6EUBLGT5BNBBUG573BL4EDQM6BGV6WYERIBX5XSE6FYKJPVE', }, - 'receiver-rewards': 0, - 'round-time': 1718456957, + receiverRewards: 0n, + roundTime: 1718456957, sender: 'TRCEY5UZGTATGTF5K3U42IMDT467D4EHV7S5MYJBMLMYARYJOZFATORMUM', - 'sender-rewards': 0, - 'tx-type': 'pay', + senderRewards: 0n, + txType: TransactionType.pay, }, ], - 'intra-round-offset': 2, - 'last-valid': 39789078, - 'local-state-delta': [ + intraRoundOffset: 2, + lastValid: 39789078n, + localStateDelta: [ { address: 'TRCEY5UZGTATGTF5K3U42IMDT467D4EHV7S5MYJBMLMYARYJOZFATORMUM', delta: [ @@ -1707,21 +1772,21 @@ export const transactionResultMother = { value: { action: 1, bytes: 'CaGqiZ8MQk086TI=', - uint: 0, + uint: 0n, }, }, { key: 'YXNzZXRfMV9wcm90b2NvbF9mZWVz', value: { action: 2, - uint: 82439976751, + uint: 82439976751n, }, }, { key: 'YXNzZXRfMV9yZXNlcnZlcw==', value: { action: 2, - uint: 18249194605959, + uint: 18249194605959n, }, }, { @@ -1729,101 +1794,101 @@ export const transactionResultMother = { value: { action: 1, bytes: 'QBaQDDDWSK3tcffR', - uint: 0, + uint: 0n, }, }, { key: 'YXNzZXRfMl9yZXNlcnZlcw==', value: { action: 2, - uint: 127822390253, + uint: 127822390253n, }, }, { key: 'Y3VtdWxhdGl2ZV9wcmljZV91cGRhdGVfdGltZXN0YW1w', value: { action: 2, - uint: 1718456954, + uint: 1718456954n, }, }, ], }, ], logs: [ - 'aW5wdXRfYXNzZXRfaWQgJWkAAAAATI8RHA==', - 'aW5wdXRfYW1vdW50ICVpAAAAAAZAAAA=', - 'c3dhcF9hbW91bnQgJWkAAAAABjszNA==', - 'Y2hhbmdlICVpAAAAAAAAAAA=', - 'b3V0cHV0X2Fzc2V0X2lkICVpAAAAAAAAAAA=', - 'b3V0cHV0X2Ftb3VudCAlaQAAAAAACyxc', - 'cG9vbGVyc19mZWVfYW1vdW50ICVpAAAAAAAEAAA=', - 'cHJvdG9jb2xfZmVlX2Ftb3VudCAlaQAAAAAAAMzM', - 'dG90YWxfZmVlX2Ftb3VudCAlaQAAAAAABMzM', + base64ToBytes('aW5wdXRfYXNzZXRfaWQgJWkAAAAATI8RHA=='), + base64ToBytes('aW5wdXRfYW1vdW50ICVpAAAAAAZAAAA='), + base64ToBytes('c3dhcF9hbW91bnQgJWkAAAAABjszNA=='), + base64ToBytes('Y2hhbmdlICVpAAAAAAAAAAA='), + base64ToBytes('b3V0cHV0X2Fzc2V0X2lkICVpAAAAAAAAAAA='), + base64ToBytes('b3V0cHV0X2Ftb3VudCAlaQAAAAAACyxc'), + base64ToBytes('cG9vbGVyc19mZWVfYW1vdW50ICVpAAAAAAAEAAA='), + base64ToBytes('cHJvdG9jb2xfZmVlX2Ftb3VudCAlaQAAAAAAAMzM'), + base64ToBytes('dG90YWxfZmVlX2Ftb3VudCAlaQAAAAAABMzM'), ], - 'receiver-rewards': 0, - 'round-time': 1718456957, + receiverRewards: 0n, + roundTime: 1718456957, sender: 'AIIWFDYAMB6EUBLGT5BNBBUG573BL4EDQM6BGV6WYERIBX5XSE6FYKJPVE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, ], - 'intra-round-offset': 2, - 'last-valid': 39789078, - 'receiver-rewards': 0, - 'round-time': 1718456957, + intraRoundOffset: 2, + lastValid: 39789078n, + receiverRewards: 0n, + roundTime: 1718456957, sender: 'BULARZJADNPPHILMT4RC7YYYZ5KMQCUJJS4NXOPELB4LLJBG2TS7U4KO4I', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'Mo6EtJqvsA9MXLmYZsTLfCYGSzLxA2t8TvcnFpvC/ttNO4xJ5+UqUgfibdBI1hxnUQytwrW41yZ2alloF61hDQ==', + sig: base64ToBytes('Mo6EtJqvsA9MXLmYZsTLfCYGSzLxA2t8TvcnFpvC/ttNO4xJ5+UqUgfibdBI1hxnUQytwrW41yZ2alloF61hDQ=='), }, - 'tx-type': 'appl', - } as unknown as TransactionResult) + txType: TransactionType.appl, + }) }, ['testnet-DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ']: () => { return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [], - 'application-args': ['78JgjQ=='], - 'application-id': 673421623, - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - fee: 21000, - 'first-valid': 40821408, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - 'global-state-delta': [ + applicationArgs: [base64ToBytes('78JgjQ==')], + applicationId: 673421623n, + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + fee: 21000n, + firstValid: 40821408n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + globalStateDelta: [ { key: 'ZXBvY2hOdW1iZXI=', value: { action: 2, - uint: 313, + uint: 313n, }, }, { key: 'bGFzdFBheW91dA==', value: { action: 2, - uint: 40821410, + uint: 40821410n, }, }, { key: 'cmV3YXJkQWNjdW11bGF0b3I=', value: { action: 2, - uint: 44933101, + uint: 44933101n, }, }, { @@ -1831,710 +1896,732 @@ export const transactionResultMother = { value: { action: 1, bytes: 'AAAAAAAAAAAAAGHXozrNwg==', - uint: 0, + uint: 0n, }, }, { key: 'c3Rha2Vk', value: { action: 2, - uint: 3635491114, + uint: 3635491114n, }, }, ], - group: 'vaLtvORtad8atEru3rCZaJeRetDS6S1GLLayjlruG8o=', + group: base64ToBytes('vaLtvORtad8atEru3rCZaJeRetDS6S1GLLayjlruG8o='), id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ', - 'inner-txns': [ + innerTxns: [ { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/1', + applicationTransaction: { accounts: [], - 'application-args': ['da/2HQ==', 'AAAAAAAAAAE='], - 'application-id': 673404372, - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, + applicationArgs: [base64ToBytes('da/2HQ=='), base64ToBytes('AAAAAAAAAAE=')], + applicationId: 673404372n, + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, logs: [ - 'FR98dQAAAAAAAAABjfMS2162DlrzgHlArgSMpt/eOCrn1iBmCX3dPPAZfIqN8xLbXrYOWvOAeUCuBIym3944KufWIGYJfd088Bl8igAAAAAlbHv9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUQAADDUI3zEttetg5a84B5QK4EjKbf3jgq59YgZgl93TzwGXyKAAAAAABMS0AAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA', + base64ToBytes( + 'FR98dQAAAAAAAAABjfMS2162DlrzgHlArgSMpt/eOCrn1iBmCX3dPPAZfIqN8xLbXrYOWvOAeUCuBIym3944KufWIGYJfd088Bl8igAAAAAlbHv9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUQAADDUI3zEttetg5a84B5QK4EjKbf3jgq59YgZgl93TzwGXyKAAAAAABMS0AAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA' + ), ], - 'receiver-rewards': 0, - 'round-time': 1718044736, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/2', + applicationTransaction: { accounts: [], - 'application-args': ['Hy8BCQ==', 'AAAAAAAAAAE='], - 'application-id': 673404372, - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, - logs: ['FR98dQACAAAAAAAAAAkAAAAA2I86cAAAAAAAAAAA'], - 'receiver-rewards': 0, - 'round-time': 1718044736, + applicationArgs: [base64ToBytes('Hy8BCQ=='), base64ToBytes('AAAAAAAAAAE=')], + applicationId: 673404372n, + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, + logs: [base64ToBytes('FR98dQACAAAAAAAAAAkAAAAA2I86cAAAAAAAAAAA')], + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', - }, - { - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, - note: 'dmFsaWRhdG9yIHJld2FyZA==', - 'payment-transaction': { - amount: 117150, - 'close-amount': 0, + senderRewards: 0n, + txType: TransactionType.appl, + }, + { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/3', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, + note: base64ToBytes('dmFsaWRhdG9yIHJld2FyZA=='), + paymentTransaction: { + amount: 117150n, + closeAmount: 0n, receiver: 'RXZRFW26WYHFV44APFAK4BEMU3P54OBK47LCAZQJPXOTZ4AZPSFDAKLIQY', }, - 'receiver-rewards': 0, - 'round-time': 1718044736, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'pay', + senderRewards: 0n, + txType: TransactionType.pay, }, { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/4', + applicationTransaction: { accounts: [], - 'application-args': [], - 'application-id': 0, - 'approval-program': 'CoEB', - 'clear-state-program': 'CoEB', - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'delete', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - 'created-application-index': 679619881, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, - 'receiver-rewards': 0, - 'round-time': 1718044736, + applicationArgs: [], + applicationId: 0n, + approvalProgram: base64ToBytes('CoEB'), + clearStateProgram: base64ToBytes('CoEB'), + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'delete', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + createdApplicationIndex: 679619881n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/5', + applicationTransaction: { accounts: [], - 'application-args': [], - 'application-id': 0, - 'approval-program': 'CoEB', - 'clear-state-program': 'CoEB', - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'delete', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - 'created-application-index': 679619882, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, - 'receiver-rewards': 0, - 'round-time': 1718044736, + applicationArgs: [], + applicationId: 0n, + approvalProgram: base64ToBytes('CoEB'), + clearStateProgram: base64ToBytes('CoEB'), + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'delete', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + createdApplicationIndex: 679619882n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/6', + applicationTransaction: { accounts: [], - 'application-args': [], - 'application-id': 0, - 'approval-program': 'CoEB', - 'clear-state-program': 'CoEB', - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'delete', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - 'created-application-index': 679619883, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, - 'receiver-rewards': 0, - 'round-time': 1718044736, + applicationArgs: [], + applicationId: 0n, + approvalProgram: base64ToBytes('CoEB'), + clearStateProgram: base64ToBytes('CoEB'), + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'delete', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + createdApplicationIndex: 679619883n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/7', + applicationTransaction: { accounts: [], - 'application-args': [], - 'application-id': 0, - 'approval-program': 'CoEB', - 'clear-state-program': 'CoEB', - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'delete', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - 'created-application-index': 679619884, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, - 'receiver-rewards': 0, - 'round-time': 1718044736, + applicationArgs: [], + applicationId: 0n, + approvalProgram: base64ToBytes('CoEB'), + clearStateProgram: base64ToBytes('CoEB'), + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'delete', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + createdApplicationIndex: 679619884n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/8', + applicationTransaction: { accounts: [], - 'application-args': [], - 'application-id': 0, - 'approval-program': 'CoEB', - 'clear-state-program': 'CoEB', - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'delete', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - 'created-application-index': 679619885, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, - 'receiver-rewards': 0, - 'round-time': 1718044736, + applicationArgs: [], + applicationId: 0n, + approvalProgram: base64ToBytes('CoEB'), + clearStateProgram: base64ToBytes('CoEB'), + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'delete', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + createdApplicationIndex: 679619885n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/9', + applicationTransaction: { accounts: [], - 'application-args': [], - 'application-id': 0, - 'approval-program': 'CoEB', - 'clear-state-program': 'CoEB', - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'delete', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - 'created-application-index': 679619886, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, - 'receiver-rewards': 0, - 'round-time': 1718044736, + applicationArgs: [], + applicationId: 0n, + approvalProgram: base64ToBytes('CoEB'), + clearStateProgram: base64ToBytes('CoEB'), + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'delete', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + createdApplicationIndex: 679619886n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/10', + applicationTransaction: { accounts: [], - 'application-args': [], - 'application-id': 0, - 'approval-program': 'CoEB', - 'clear-state-program': 'CoEB', - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'delete', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - 'created-application-index': 679619887, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, - 'receiver-rewards': 0, - 'round-time': 1718044736, + applicationArgs: [], + applicationId: 0n, + approvalProgram: base64ToBytes('CoEB'), + clearStateProgram: base64ToBytes('CoEB'), + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'delete', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + createdApplicationIndex: 679619887n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/11', + applicationTransaction: { accounts: [], - 'application-args': [], - 'application-id': 0, - 'approval-program': 'CoEB', - 'clear-state-program': 'CoEB', - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'delete', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - 'created-application-index': 679619888, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, - 'receiver-rewards': 0, - 'round-time': 1718044736, + applicationArgs: [], + applicationId: 0n, + approvalProgram: base64ToBytes('CoEB'), + clearStateProgram: base64ToBytes('CoEB'), + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'delete', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + createdApplicationIndex: 679619888n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/12', + applicationTransaction: { accounts: [], - 'application-args': [], - 'application-id': 0, - 'approval-program': 'CoEB', - 'clear-state-program': 'CoEB', - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'delete', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - 'created-application-index': 679619889, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, - 'receiver-rewards': 0, - 'round-time': 1718044736, + applicationArgs: [], + applicationId: 0n, + approvalProgram: base64ToBytes('CoEB'), + clearStateProgram: base64ToBytes('CoEB'), + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'delete', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + createdApplicationIndex: 679619889n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/13', + applicationTransaction: { accounts: [], - 'application-args': [], - 'application-id': 0, - 'approval-program': 'CoEB', - 'clear-state-program': 'CoEB', - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'delete', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - 'created-application-index': 679619890, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, - 'receiver-rewards': 0, - 'round-time': 1718044736, + applicationArgs: [], + applicationId: 0n, + approvalProgram: base64ToBytes('CoEB'), + clearStateProgram: base64ToBytes('CoEB'), + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'delete', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + createdApplicationIndex: 679619890n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/4', + applicationTransaction: { accounts: [], - 'application-args': [], - 'application-id': 0, - 'approval-program': 'CoEB', - 'clear-state-program': 'CoEB', - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'delete', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - 'created-application-index': 679619891, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, - 'receiver-rewards': 0, - 'round-time': 1718044736, + applicationArgs: [], + applicationId: 0n, + approvalProgram: base64ToBytes('CoEB'), + clearStateProgram: base64ToBytes('CoEB'), + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'delete', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + createdApplicationIndex: 679619891n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/5', + applicationTransaction: { accounts: [], - 'application-args': [], - 'application-id': 0, - 'approval-program': 'CoEB', - 'clear-state-program': 'CoEB', - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'delete', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - 'created-application-index': 679619892, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, - 'receiver-rewards': 0, - 'round-time': 1718044736, + applicationArgs: [], + applicationId: 0n, + approvalProgram: base64ToBytes('CoEB'), + clearStateProgram: base64ToBytes('CoEB'), + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'delete', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + createdApplicationIndex: 679619892n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/16', + applicationTransaction: { accounts: [], - 'application-args': [], - 'application-id': 0, - 'approval-program': 'CoEB', - 'clear-state-program': 'CoEB', - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'delete', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - 'created-application-index': 679619893, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, - 'receiver-rewards': 0, - 'round-time': 1718044736, + applicationArgs: [], + applicationId: 0n, + approvalProgram: base64ToBytes('CoEB'), + clearStateProgram: base64ToBytes('CoEB'), + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'delete', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + createdApplicationIndex: 679619893n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/17', + applicationTransaction: { accounts: [], - 'application-args': [], - 'application-id': 0, - 'approval-program': 'CoEB', - 'clear-state-program': 'CoEB', - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'delete', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - 'created-application-index': 679619894, - fee: 0, - 'first-valid': 40821408, - 'intra-round-offset': 2, - 'last-valid': 40822408, - 'receiver-rewards': 0, - 'round-time': 1718044736, + applicationArgs: [], + applicationId: 0n, + approvalProgram: base64ToBytes('CoEB'), + clearStateProgram: base64ToBytes('CoEB'), + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'delete', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + createdApplicationIndex: 679619894n, + fee: 0n, + firstValid: 40821408n, + intraRoundOffset: 2, + lastValid: 40822408n, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, { - 'application-transaction': { + id: 'DX64C5POMYLPSMOZVQZWF5VJ7RW27THYBUGKNH5T4A5D2KAFHZCQ/inner/18', + applicationTransaction: { accounts: [], - 'application-args': [ - 'QY/O/A==', - 'AAAAAAAAAAEAAAAAAAAAAQAAAAAoI5k3', - 'AAAAAAAh9ro=', - 'AAAAAAAAAAA=', - 'AAAAAAAByZ4=', - 'AAAAAAAAAAA=', + applicationArgs: [ + base64ToBytes('QY/O/A=='), + base64ToBytes('AAAAAAAAAAEAAAAAAAAAAQAAAAAoI5k3'), + base64ToBytes('AAAAAAAh9ro='), + base64ToBytes('AAAAAAAAAAA='), + base64ToBytes('AAAAAAAByZ4='), + base64ToBytes('AAAAAAAAAAA='), ], - 'application-id': 673404372, - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40821410, - fee: 0, - 'first-valid': 40821408, - 'global-state-delta': [ + applicationId: 673404372n, + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40821410n, + fee: 0n, + firstValid: 40821408n, + globalStateDelta: [ { key: 'c3Rha2Vk', value: { action: 2, - uint: 54824658163, + uint: 54824658163n, }, }, ], - 'intra-round-offset': 2, - 'last-valid': 40822408, - 'receiver-rewards': 0, - 'round-time': 1718044736, + intraRoundOffset: 2, + lastValid: 40822408n, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'BLB5BMEJTIBZ6QYLIKAUFQP5K7I4MWHET4JK6EAQ5AMGP4UABKLMR5DKCE', - 'sender-rewards': 0, - 'tx-type': 'appl', + senderRewards: 0n, + txType: TransactionType.appl, }, ], - 'intra-round-offset': 2, - 'last-valid': 40822408, - 'receiver-rewards': 0, - 'round-time': 1718044736, + intraRoundOffset: 2, + lastValid: 40822408n, + receiverRewards: 0n, + roundTime: 1718044736, sender: 'RXZRFW26WYHFV44APFAK4BEMU3P54OBK47LCAZQJPXOTZ4AZPSFDAKLIQY', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: '1vIkO9cOBlLzNN4f7TokcFNz2m4KYPx4fDukGeutxzNJa/7y0LkTGoLEQNtUCcNmZKl3HCc/jNaCFIaRvvcjCQ==', + sig: base64ToBytes('1vIkO9cOBlLzNN4f7TokcFNz2m4KYPx4fDukGeutxzNJa/7y0LkTGoLEQNtUCcNmZKl3HCc/jNaCFIaRvvcjCQ=='), }, - 'tx-type': 'appl', - } as unknown as TransactionResult) + txType: TransactionType.appl, + }) }, ['mainnet-GYZT5MEYJKR35U7CL3NUFCJVSAWBOQITRB3S5IQS2TWBZPD7E34A']: () => { return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [ - 'PZNGYF4Y25GGO674BW4CRDHFKOKHMHZXSFXIKMYPEJCQAUTDH52WV24XTY', - 'Y44JLSKZSRJ5AK4HDIEBHMHGFIJIANA26AQLWBTFQDCBS2FB5UXPKUSVPQ', + algosdk.Address.fromString('PZNGYF4Y25GGO674BW4CRDHFKOKHMHZXSFXIKMYPEJCQAUTDH52WV24XTY'), + algosdk.Address.fromString('Y44JLSKZSRJ5AK4HDIEBHMHGFIJIANA26AQLWBTFQDCBS2FB5UXPKUSVPQ'), ], - 'application-args': ['Y2xhaW0='], - 'application-id': 1800533232, - 'foreign-apps': [], - 'foreign-assets': [847594689], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'auth-addr': 'U2K3RL6UYTHHKNP2GUR7PZPVQ723IV3RMPEVVV42J2KEUIS5SC4OCWF65A', - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 39373576, - fee: 1000, - 'first-valid': 39373567, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', - 'global-state-delta': [ + applicationArgs: [base64ToBytes('Y2xhaW0=')], + applicationId: 1800533232n, + foreignApps: [], + foreignAssets: [847594689n], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + authAddr: algosdk.Address.fromString('U2K3RL6UYTHHKNP2GUR7PZPVQ723IV3RMPEVVV42J2KEUIS5SC4OCWF65A'), + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 39373576n, + fee: 1000n, + firstValid: 39373567n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', + globalStateDelta: [ { key: 'Y2xhaW1lZF9jb3VudA==', value: { action: 2, - uint: 53, + uint: 53n, }, }, ], - group: 'e8hHS1DTHzmS5ERI5G5szL2P9+EbDsfT399wjcjc7zU=', + group: base64ToBytes('e8hHS1DTHzmS5ERI5G5szL2P9+EbDsfT399wjcjc7zU='), id: 'GYZT5MEYJKR35U7CL3NUFCJVSAWBOQITRB3S5IQS2TWBZPD7E34A', - 'inner-txns': [ - { - 'asset-transfer-transaction': { - amount: 0, - 'asset-id': 847594689, - 'close-amount': 1, - 'close-to': 'Y44JLSKZSRJ5AK4HDIEBHMHGFIJIANA26AQLWBTFQDCBS2FB5UXPKUSVPQ', + innerTxns: [ + { + id: 'GYZT5MEYJKR35U7CL3NUFCJVSAWBOQITRB3S5IQS2TWBZPD7E34A/inner/1', + assetTransferTransaction: { + amount: 0n, + assetId: 847594689n, + closeAmount: 1n, + closeTo: 'Y44JLSKZSRJ5AK4HDIEBHMHGFIJIANA26AQLWBTFQDCBS2FB5UXPKUSVPQ', receiver: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 39373576, - fee: 1000, - 'first-valid': 39373567, - 'intra-round-offset': 4, - 'last-valid': 39374567, - 'receiver-rewards': 0, - 'round-time': 1717259254, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 39373576n, + fee: 1000n, + firstValid: 39373567n, + intraRoundOffset: 4, + lastValid: 39374567n, + receiverRewards: 0n, + roundTime: 1717259254, sender: 'EG4G4PRHTEGUQJSLOBAQFIGOBJGTSEIFESANL7V6HJ3JYUXBXZ76QPKT5A', - 'sender-rewards': 0, - 'tx-type': 'axfer', - }, - { - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 39373576, - fee: 1000, - 'first-valid': 39373567, - 'intra-round-offset': 4, - 'last-valid': 39374567, - 'payment-transaction': { - amount: 100000, - 'close-amount': 0, + senderRewards: 0n, + txType: 'axfer', + }, + { + id: 'GYZT5MEYJKR35U7CL3NUFCJVSAWBOQITRB3S5IQS2TWBZPD7E34A/inner/2', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 39373576n, + fee: 1000n, + firstValid: 39373567n, + intraRoundOffset: 4, + lastValid: 39374567n, + paymentTransaction: { + amount: 100000n, + closeAmount: 0n, receiver: 'PZNGYF4Y25GGO674BW4CRDHFKOKHMHZXSFXIKMYPEJCQAUTDH52WV24XTY', }, - 'receiver-rewards': 0, - 'round-time': 1717259254, + receiverRewards: 0n, + roundTime: 1717259254, sender: 'EG4G4PRHTEGUQJSLOBAQFIGOBJGTSEIFESANL7V6HJ3JYUXBXZ76QPKT5A', - 'sender-rewards': 0, - 'tx-type': 'pay', + senderRewards: 0n, + txType: 'pay', }, ], - 'intra-round-offset': 4, - 'last-valid': 39374567, - 'local-state-delta': [ + intraRoundOffset: 4, + lastValid: 39374567n, + localStateDelta: [ { address: 'Y44JLSKZSRJ5AK4HDIEBHMHGFIJIANA26AQLWBTFQDCBS2FB5UXPKUSVPQ', delta: [ @@ -2542,947 +2629,973 @@ export const transactionResultMother = { key: 'c3RhdHVz', value: { action: 2, - uint: 3, + uint: 3n, }, }, ], }, ], - 'receiver-rewards': 0, - 'round-time': 1717259254, + receiverRewards: 0n, + roundTime: 1717259254, sender: 'Y44JLSKZSRJ5AK4HDIEBHMHGFIJIANA26AQLWBTFQDCBS2FB5UXPKUSVPQ', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: '1ZZeWqz/63u9+Ls9z8wvSbVtd6fnZgtptw1FZkCwTl0UiLo9kzxeBpDF8Q0ZDLFcHssjdgYSHtHshp0zf98WBQ==', + sig: base64ToBytes('1ZZeWqz/63u9+Ls9z8wvSbVtd6fnZgtptw1FZkCwTl0UiLo9kzxeBpDF8Q0ZDLFcHssjdgYSHtHshp0zf98WBQ=='), }, - 'tx-type': 'appl', - } as unknown as TransactionResult) + txType: TransactionType.appl, + }) }, ['mainnet-XVVC7UDLCPI622KCJZLWK3SEAWWVUEPEXUM5CO3DFLWOBH7NOPDQ']: () => { return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [ - 'MDIVKI64M2HEKCWKH7SOTUXEEW6KNOYSAOBTDTS32KUQOGUT75D43MSP5M', - 'H3OQEQIIC35RZTJNU5A75LT4PCTUCF3VKVEQTSXAJMUGNTRUKEKI4QSRW4', - 'MDIVKI64M2HEKCWKH7SOTUXEEW6KNOYSAOBTDTS32KUQOGUT75D43MSP5M', + algosdk.Address.fromString('MDIVKI64M2HEKCWKH7SOTUXEEW6KNOYSAOBTDTS32KUQOGUT75D43MSP5M'), + algosdk.Address.fromString('H3OQEQIIC35RZTJNU5A75LT4PCTUCF3VKVEQTSXAJMUGNTRUKEKI4QSRW4'), + algosdk.Address.fromString('MDIVKI64M2HEKCWKH7SOTUXEEW6KNOYSAOBTDTS32KUQOGUT75D43MSP5M'), ], - 'application-args': [], - 'application-id': 1898586902, - 'foreign-apps': [], - 'foreign-assets': [850924184], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'delete', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 39723800, - fee: 1000, - 'first-valid': 39723798, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', + applicationArgs: [], + applicationId: 1898586902n, + foreignApps: [], + foreignAssets: [850924184n], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'delete', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 39723800n, + fee: 1000n, + firstValid: 39723798n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', id: 'XVVC7UDLCPI622KCJZLWK3SEAWWVUEPEXUM5CO3DFLWOBH7NOPDQ', - 'inner-txns': [ - { - 'asset-transfer-transaction': { - amount: 0, - 'asset-id': 850924184, - 'close-amount': 1, - 'close-to': 'MDIVKI64M2HEKCWKH7SOTUXEEW6KNOYSAOBTDTS32KUQOGUT75D43MSP5M', + innerTxns: [ + { + id: 'XVVC7UDLCPI622KCJZLWK3SEAWWVUEPEXUM5CO3DFLWOBH7NOPDQ/inner/1', + assetTransferTransaction: { + amount: 0n, + assetId: 850924184n, + closeAmount: 1n, + closeTo: 'MDIVKI64M2HEKCWKH7SOTUXEEW6KNOYSAOBTDTS32KUQOGUT75D43MSP5M', receiver: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 39723800, - fee: 1000, - 'first-valid': 39723798, - 'intra-round-offset': 369, - 'last-valid': 39724798, - 'receiver-rewards': 0, - 'round-time': 1718268693, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 39723800n, + fee: 1000n, + firstValid: 39723798n, + intraRoundOffset: 369, + lastValid: 39724798n, + receiverRewards: 0n, + roundTime: 1718268693, sender: 'RHI54JUHEHQFVQECDUUJMXBZG7QF2ZSSNYNXOECRBNJ6RZJLP2YGJCDVXI', - 'sender-rewards': 0, - 'tx-type': 'axfer', - }, - { - 'close-rewards': 0, - 'closing-amount': 597000, - 'confirmed-round': 39723800, - fee: 1000, - 'first-valid': 39723798, - 'intra-round-offset': 369, - 'last-valid': 39724798, - 'payment-transaction': { - amount: 0, - 'close-amount': 597000, - 'close-remainder-to': 'MDIVKI64M2HEKCWKH7SOTUXEEW6KNOYSAOBTDTS32KUQOGUT75D43MSP5M', + senderRewards: 0n, + txType: 'axfer', + }, + { + id: 'XVVC7UDLCPI622KCJZLWK3SEAWWVUEPEXUM5CO3DFLWOBH7NOPDQ/inner/2', + closeRewards: 0n, + closingAmount: 597000n, + confirmedRound: 39723800n, + fee: 1000n, + firstValid: 39723798n, + intraRoundOffset: 369, + lastValid: 39724798n, + paymentTransaction: { + amount: 0n, + closeAmount: 597000n, + closeRemainderTo: 'MDIVKI64M2HEKCWKH7SOTUXEEW6KNOYSAOBTDTS32KUQOGUT75D43MSP5M', receiver: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ', }, - 'receiver-rewards': 0, - 'round-time': 1718268693, + receiverRewards: 0n, + roundTime: 1718268693, sender: 'RHI54JUHEHQFVQECDUUJMXBZG7QF2ZSSNYNXOECRBNJ6RZJLP2YGJCDVXI', - 'sender-rewards': 0, - 'tx-type': 'pay', + senderRewards: 0n, + txType: 'pay', }, ], - 'intra-round-offset': 369, - 'last-valid': 39724798, - 'receiver-rewards': 0, - 'round-time': 1718268693, + intraRoundOffset: 369, + lastValid: 39724798n, + receiverRewards: 0n, + roundTime: 1718268693, sender: 'H3OQEQIIC35RZTJNU5A75LT4PCTUCF3VKVEQTSXAJMUGNTRUKEKI4QSRW4', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'ACgqTTdpnhp+0bZVMvh63e1QNVdpGTmki+7ffmQeaFOXUhfG7WUJ66vJV+fJiWqVn8WjwIdadjThmd4xs0/rAw==', + sig: base64ToBytes('ACgqTTdpnhp+0bZVMvh63e1QNVdpGTmki+7ffmQeaFOXUhfG7WUJ66vJV+fJiWqVn8WjwIdadjThmd4xs0/rAw=='), }, - 'tx-type': 'appl', - } as unknown as TransactionResult) + txType: TransactionType.appl, + }) }, ['mainnet-CF6HEO6Z5UZIPCUXTIAGUHHDV7W4FCZG5WPKUGU3BIJYF6X6SPYA']: () => { return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [ - 'SVES5Z76ZYNFVKN4IMF3HYGDQAYF7DWMPPSSDZQEKAR2566WSA44FNPGIA', - '4CLIOL4MHNBVOBNCD6JOBRFDQZV4XZSWMDCTIXI74VQP6BLEP3VAX6ROSM', + algosdk.Address.fromString('SVES5Z76ZYNFVKN4IMF3HYGDQAYF7DWMPPSSDZQEKAR2566WSA44FNPGIA'), + algosdk.Address.fromString('4CLIOL4MHNBVOBNCD6JOBRFDQZV4XZSWMDCTIXI74VQP6BLEP3VAX6ROSM'), ], - 'application-args': ['PaC6xg==', 'AA==', 'AAAAAAAAAAE=', 'AQ==', 'Ag==', 'AAAAAAAAAAE='], - 'application-id': 872219256, - 'foreign-apps': [], - 'foreign-assets': [880903652], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'auth-addr': 'NMR5PS2KYAEN73U4AK476QXEA3IPG2AUE6BSF73UA7EKHXZ76YX24HVRNQ', - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40212728, - fee: 0, - 'first-valid': 40212726, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', - group: 'ngljw8EaQSretI9Q5qK1/0lxppfGuAoZgN75WyukMKM=', + applicationArgs: [ + base64ToBytes('PaC6xg=='), + base64ToBytes('AA=='), + base64ToBytes('AAAAAAAAAAE='), + base64ToBytes('AQ=='), + base64ToBytes('Ag=='), + base64ToBytes('AAAAAAAAAAE='), + ], + applicationId: 872219256n, + foreignApps: [], + foreignAssets: [880903652n], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + authAddr: algosdk.Address.fromString('NMR5PS2KYAEN73U4AK476QXEA3IPG2AUE6BSF73UA7EKHXZ76YX24HVRNQ'), + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40212728n, + fee: 0n, + firstValid: 40212726n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', + group: base64ToBytes('ngljw8EaQSretI9Q5qK1/0lxppfGuAoZgN75WyukMKM='), id: 'CF6HEO6Z5UZIPCUXTIAGUHHDV7W4FCZG5WPKUGU3BIJYF6X6SPYA', - 'inner-txns': [ - { - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40212728, - fee: 0, - 'first-valid': 40212726, - 'intra-round-offset': 1141, - 'last-valid': 40213726, - 'payment-transaction': { - amount: 100000, - 'close-amount': 0, + innerTxns: [ + { + id: 'CF6HEO6Z5UZIPCUXTIAGUHHDV7W4FCZG5WPKUGU3BIJYF6X6SPYA/inner/1', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40212728n, + fee: 0n, + firstValid: 40212726n, + intraRoundOffset: 1141, + lastValid: 40213726n, + paymentTransaction: { + amount: 100000n, + closeAmount: 0n, receiver: 'X6MNR4AVJQEMJRHAPZ6F4O4SVDIYN67ZRMD2O3ULPY4QFMANQNZOEYHODE', }, - 'receiver-rewards': 0, - 'round-time': 1719677865, + receiverRewards: 0n, + roundTime: 1719677865, sender: 'EP3I5HF6N3B7NSLVJ5YOZNTW3B4L46RUTELW6GIWZZ6ZCV5XOVT5PTOHAI', - 'sender-rewards': 0, - 'tx-type': 'pay', + senderRewards: 0n, + txType: 'pay', }, { - 'asset-transfer-transaction': { - amount: 1, - 'asset-id': 880903652, - 'close-amount': 0, + id: 'CF6HEO6Z5UZIPCUXTIAGUHHDV7W4FCZG5WPKUGU3BIJYF6X6SPYA/inner/2', + assetTransferTransaction: { + amount: 1n, + assetId: 880903652n, + closeAmount: 0n, receiver: '4CLIOL4MHNBVOBNCD6JOBRFDQZV4XZSWMDCTIXI74VQP6BLEP3VAX6ROSM', sender: 'SVES5Z76ZYNFVKN4IMF3HYGDQAYF7DWMPPSSDZQEKAR2566WSA44FNPGIA', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 40212728, - fee: 0, - 'first-valid': 40212726, - 'intra-round-offset': 1141, - 'last-valid': 40213726, - 'receiver-rewards': 0, - 'round-time': 1719677865, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 40212728n, + fee: 0n, + firstValid: 40212726n, + intraRoundOffset: 1141, + lastValid: 40213726n, + receiverRewards: 0n, + roundTime: 1719677865, sender: 'EP3I5HF6N3B7NSLVJ5YOZNTW3B4L46RUTELW6GIWZZ6ZCV5XOVT5PTOHAI', - 'sender-rewards': 0, - 'tx-type': 'axfer', + senderRewards: 0n, + txType: 'axfer', }, ], - 'intra-round-offset': 1141, - 'last-valid': 40213726, - note: 'QWxnb01hcnQvdjE6ansidCI6InR0YXgiLCJzIjpbImFyYzIiXX0=', - 'receiver-rewards': 0, - 'round-time': 1719677865, + intraRoundOffset: 1141, + lastValid: 40213726n, + note: base64ToBytes('QWxnb01hcnQvdjE6ansidCI6InR0YXgiLCJzIjpbImFyYzIiXX0='), + receiverRewards: 0n, + roundTime: 1719677865, sender: 'X6MNR4AVJQEMJRHAPZ6F4O4SVDIYN67ZRMD2O3ULPY4QFMANQNZOEYHODE', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'rMf0tV/n2Yq5l3dWxy99rf1ocTxBN0YZKF67arJauFI5SQ4iOTzGjs2WEIlxD70Foggh5Szfz5I8WYBR+r/7CA==', + sig: base64ToBytes('rMf0tV/n2Yq5l3dWxy99rf1ocTxBN0YZKF67arJauFI5SQ4iOTzGjs2WEIlxD70Foggh5Szfz5I8WYBR+r/7CA=='), }, - 'tx-type': TransactionType.appl, - } as unknown as TransactionResult) + txType: TransactionType.appl, + }) }, ['testnet-DWVIXKZ2URUOKVZRBRJHMERSPIWTMLFFLLVKH5RATFGNPT7VVNIA']: () => { return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 0, - 'asset-id': 210971834, - 'close-amount': 0, - 'close-to': '5UYDKHNRMDWJFG2VD3LFAR2FSJSKRNK3V45IEOBLNTVVF365DIVFGUMTNA', + assetTransferTransaction: { + amount: 0n, + assetId: 210971834n, + closeAmount: 0n, + closeTo: '5UYDKHNRMDWJFG2VD3LFAR2FSJSKRNK3V45IEOBLNTVVF365DIVFGUMTNA', receiver: '5UYDKHNRMDWJFG2VD3LFAR2FSJSKRNK3V45IEOBLNTVVF365DIVFGUMTNA', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 41587590, - fee: 1000, - 'first-valid': 41587586, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 41587590n, + fee: 1000n, + firstValid: 41587586n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', id: 'DWVIXKZ2URUOKVZRBRJHMERSPIWTMLFFLLVKH5RATFGNPT7VVNIA', - 'intra-round-offset': 1, - 'last-valid': 41588586, - 'receiver-rewards': 0, - 'round-time': 1720144832, + intraRoundOffset: 1, + lastValid: 41588586n, + receiverRewards: 0n, + roundTime: 1720144832, sender: '5UYDKHNRMDWJFG2VD3LFAR2FSJSKRNK3V45IEOBLNTVVF365DIVFGUMTNA', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'hHxb/1D5G3EdCwTZ6vWjXTeMFLIa7zAdc0ZxYkcAggWBwepWLO0pgyR9jCG7e4kVTanfoadImmys/M56DYUdBg==', + sig: base64ToBytes('hHxb/1D5G3EdCwTZ6vWjXTeMFLIa7zAdc0ZxYkcAggWBwepWLO0pgyR9jCG7e4kVTanfoadImmys/M56DYUdBg=='), }, - 'tx-type': TransactionType.axfer, + txType: TransactionType.axfer, }) }, ['mainnet-W7UVVLOW6RWZYEC64WTOVL5RME33UGI6H6AUP7GSEZW4QNDM4GHA']: () => { // Asset config return new TransactionResultBuilder({ - 'asset-config-transaction': { - 'asset-id': 909935715, + assetConfigTransaction: { + assetId: 909935715n, params: { creator: 'CB3KEWUQUTDHQ3TC4P65UQLHC3S7KNBWPTHOFAL7CV4QCDUPDNVY5J3BT4', decimals: 0, - 'default-frozen': false, + defaultFrozen: false, manager: 'CB3KEWUQUTDHQ3TC4P65UQLHC3S7KNBWPTHOFAL7CV4QCDUPDNVY5J3BT4', - total: 0, + total: 0n, }, }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 26720944, - fee: 1000, - 'first-valid': 26720940, - 'genesis-hash': 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=', - 'genesis-id': 'mainnet-v1.0', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 26720944n, + fee: 1000n, + firstValid: 26720940n, + genesisHash: base64ToBytes('wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='), + genesisId: 'mainnet-v1.0', id: 'W7UVVLOW6RWZYEC64WTOVL5RME33UGI6H6AUP7GSEZW4QNDM4GHA', - 'intra-round-offset': 6, - 'last-valid': 26721940, - note: 'eyJzdGFuZGFyZCI6ImFyYzY5IiwiYXR0cmlidXRlcyI6W3sidHJhaXRfdHlwZSI6ImJhY2tncm91bmQiLCJ2YWx1ZSI6ImJsdWUifSx7InRyYWl0X3R5cGUiOiJlcXVpcG1lbnQiLCJ2YWx1ZSI6ImJsYW5rIn0seyJ0cmFpdF90eXBlIjoic2tpbnRvbmUiLCJ2YWx1ZSI6InRhbm5lZCBza2luIn0seyJ0cmFpdF90eXBlIjoibmVjayIsInZhbHVlIjoiYmxhbmsifSx7InRyYWl0X3R5cGUiOiJjbG90aGluZyIsInZhbHVlIjoiYmx1ZSBua3MgaG9vZHkgd2l0aCBtIHZlc3QifSx7InRyYWl0X3R5cGUiOiJoYWlyIiwidmFsdWUiOiJyZWQgbG9uZyBib2IgY3V0In0seyJ0cmFpdF90eXBlIjoiaGVhZHNldCIsInZhbHVlIjoiYyBsaW5rIn0seyJ0cmFpdF90eXBlIjoibW91dGgiLCJ2YWx1ZSI6InNtb2tpbmcgbW91dGgifV19', - 'receiver-rewards': 0, - 'round-time': 1675433770, + intraRoundOffset: 6, + lastValid: 26721940n, + note: base64ToBytes( + 'eyJzdGFuZGFyZCI6ImFyYzY5IiwiYXR0cmlidXRlcyI6W3sidHJhaXRfdHlwZSI6ImJhY2tncm91bmQiLCJ2YWx1ZSI6ImJsdWUifSx7InRyYWl0X3R5cGUiOiJlcXVpcG1lbnQiLCJ2YWx1ZSI6ImJsYW5rIn0seyJ0cmFpdF90eXBlIjoic2tpbnRvbmUiLCJ2YWx1ZSI6InRhbm5lZCBza2luIn0seyJ0cmFpdF90eXBlIjoibmVjayIsInZhbHVlIjoiYmxhbmsifSx7InRyYWl0X3R5cGUiOiJjbG90aGluZyIsInZhbHVlIjoiYmx1ZSBua3MgaG9vZHkgd2l0aCBtIHZlc3QifSx7InRyYWl0X3R5cGUiOiJoYWlyIiwidmFsdWUiOiJyZWQgbG9uZyBib2IgY3V0In0seyJ0cmFpdF90eXBlIjoiaGVhZHNldCIsInZhbHVlIjoiYyBsaW5rIn0seyJ0cmFpdF90eXBlIjoibW91dGgiLCJ2YWx1ZSI6InNtb2tpbmcgbW91dGgifV19' + ), + receiverRewards: 0n, + roundTime: 1675433770, sender: 'CB3KEWUQUTDHQ3TC4P65UQLHC3S7KNBWPTHOFAL7CV4QCDUPDNVY5J3BT4', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'ucMpP7/WS+hcHvAqNoWw9V+Kcv/JqUG5UFpvxIXIQ4P3Ac5QrxXE1WQiXcVHsrMlCV5irdqje6HVW4G2GN3gCg==', + sig: base64ToBytes('ucMpP7/WS+hcHvAqNoWw9V+Kcv/JqUG5UFpvxIXIQ4P3Ac5QrxXE1WQiXcVHsrMlCV5irdqje6HVW4G2GN3gCg=='), }, - 'tx-type': TransactionType.acfg, + txType: TransactionType.acfg, }) }, ['testnet-YXQOFAL4ZROWRYEUFXSSVUT25JFB4CH3XCQH7UYW7NJQY625PIJA']: () => { return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 0, - 'asset-id': 705735468, - 'close-amount': 0, + assetTransferTransaction: { + amount: 0n, + assetId: 705735468n, + closeAmount: 0n, receiver: 'HEZDUSR3SONDWUWFCQQGPVW2OCWAP34IN5WDRTYJMFWJ7WUR3547ZBM5XQ', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42239033, - fee: 1000, - 'first-valid': 42239028, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - group: 'S5gujlpPmhvXROKCHG5mEOKBUBux7G+uVA4M17N8Ogo=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42239033n, + fee: 1000n, + firstValid: 42239028n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + group: base64ToBytes('S5gujlpPmhvXROKCHG5mEOKBUBux7G+uVA4M17N8Ogo='), id: 'YXQOFAL4ZROWRYEUFXSSVUT25JFB4CH3XCQH7UYW7NJQY625PIJA', - 'intra-round-offset': 1, - 'last-valid': 42240028, - 'receiver-rewards': 0, - 'round-time': 1721923374, + intraRoundOffset: 1, + lastValid: 42240028n, + receiverRewards: 0n, + roundTime: 1721923374, sender: 'HEZDUSR3SONDWUWFCQQGPVW2OCWAP34IN5WDRTYJMFWJ7WUR3547ZBM5XQ', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'IkyXjQRgx+rdghx0bzM7FON7MlD4CytsE8nOno2fmZQ4JqfqCbTZLy91dLj4ba3wEhwnJT8bcUOAry9jk/YQDg==', + sig: base64ToBytes('IkyXjQRgx+rdghx0bzM7FON7MlD4CytsE8nOno2fmZQ4JqfqCbTZLy91dLj4ba3wEhwnJT8bcUOAry9jk/YQDg=='), }, - 'tx-type': TransactionType.axfer, + txType: TransactionType.axfer, }) }, ['testnet-GPUOT5Y5MTR6HXT5GYUDFOGKQOU6E536BRFXY5JMNLVHM2OT4K4Q']: () => { return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 0, - 'asset-id': 705735468, - 'close-amount': 0, + assetTransferTransaction: { + amount: 0n, + assetId: 705735468n, + closeAmount: 0n, receiver: 'HUHS4G7GDJRPLNEBOQZRJ3WWVOPEO23PHEZGPBKLNCXTCVFPAWHNMGFYQA', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42239033, - fee: 1000, - 'first-valid': 42239028, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - group: 'S5gujlpPmhvXROKCHG5mEOKBUBux7G+uVA4M17N8Ogo=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42239033n, + fee: 1000n, + firstValid: 42239028n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + group: base64ToBytes('S5gujlpPmhvXROKCHG5mEOKBUBux7G+uVA4M17N8Ogo='), id: 'GPUOT5Y5MTR6HXT5GYUDFOGKQOU6E536BRFXY5JMNLVHM2OT4K4Q', - 'intra-round-offset': 2, - 'last-valid': 42240028, - 'receiver-rewards': 0, - 'round-time': 1721923374, + intraRoundOffset: 2, + lastValid: 42240028n, + receiverRewards: 0n, + roundTime: 1721923374, sender: 'HUHS4G7GDJRPLNEBOQZRJ3WWVOPEO23PHEZGPBKLNCXTCVFPAWHNMGFYQA', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: '3izus+BlRloA5uzDgVQKDmDjmQNVrFAJmn7RRtHldaAtlDz9w8Y997fURHIqFx+0T7iWzxvWxqOFlqF8DIiMBA==', + sig: base64ToBytes('3izus+BlRloA5uzDgVQKDmDjmQNVrFAJmn7RRtHldaAtlDz9w8Y997fURHIqFx+0T7iWzxvWxqOFlqF8DIiMBA=='), }, - 'tx-type': TransactionType.axfer, + txType: TransactionType.axfer, }) }, ['testnet-WVXEZHZCUA23S2H4WATQKA7DFXA4NWWUCDAQTNMARR7MUUVSKSBQ']: () => { return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 1, - 'asset-id': 705735468, - 'close-amount': 0, + assetTransferTransaction: { + amount: 1n, + assetId: 705735468n, + closeAmount: 0n, receiver: 'HEZDUSR3SONDWUWFCQQGPVW2OCWAP34IN5WDRTYJMFWJ7WUR3547ZBM5XQ', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42239033, - fee: 1000, - 'first-valid': 42239030, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - group: 'S5gujlpPmhvXROKCHG5mEOKBUBux7G+uVA4M17N8Ogo=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42239033n, + fee: 1000n, + firstValid: 42239030n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + group: base64ToBytes('S5gujlpPmhvXROKCHG5mEOKBUBux7G+uVA4M17N8Ogo='), id: 'WVXEZHZCUA23S2H4WATQKA7DFXA4NWWUCDAQTNMARR7MUUVSKSBQ', - 'intra-round-offset': 3, - 'last-valid': 42240030, - 'receiver-rewards': 0, - 'round-time': 1721923374, + intraRoundOffset: 3, + lastValid: 42240030n, + receiverRewards: 0n, + roundTime: 1721923374, sender: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'Xa3vKgLm9MANeUJ7nd4JncFrO+nz0S91p0Ckmz3XRHkA74SiT9BeHklqYw0JhK//vFoVDgUbcwHA6KFCli0OCQ==', + sig: base64ToBytes('Xa3vKgLm9MANeUJ7nd4JncFrO+nz0S91p0Ckmz3XRHkA74SiT9BeHklqYw0JhK//vFoVDgUbcwHA6KFCli0OCQ=='), }, - 'tx-type': TransactionType.axfer, + txType: TransactionType.axfer, }) }, ['testnet-ORSVPJSAFWFOQRNBCECVDLRGWZBI76U2Q6IL7EI6RP6NEPGYAWMQ']: () => { return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 1, - 'asset-id': 705735468, - 'close-amount': 0, + assetTransferTransaction: { + amount: 1n, + assetId: 705735468n, + closeAmount: 0n, receiver: 'HUHS4G7GDJRPLNEBOQZRJ3WWVOPEO23PHEZGPBKLNCXTCVFPAWHNMGFYQA', sender: 'HEZDUSR3SONDWUWFCQQGPVW2OCWAP34IN5WDRTYJMFWJ7WUR3547ZBM5XQ', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42239033, - fee: 1000, - 'first-valid': 42239031, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - group: 'S5gujlpPmhvXROKCHG5mEOKBUBux7G+uVA4M17N8Ogo=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42239033n, + fee: 1000n, + firstValid: 42239031n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + group: base64ToBytes('S5gujlpPmhvXROKCHG5mEOKBUBux7G+uVA4M17N8Ogo='), id: 'ORSVPJSAFWFOQRNBCECVDLRGWZBI76U2Q6IL7EI6RP6NEPGYAWMQ', - 'intra-round-offset': 4, - 'last-valid': 42240031, - 'receiver-rewards': 0, - 'round-time': 1721923374, + intraRoundOffset: 4, + lastValid: 42240031n, + receiverRewards: 0n, + roundTime: 1721923374, sender: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'ylMvyATFC+feDIxRHCT8yyHlMAKXUQE4tLsmdmLtAKmYrTDdLHdbAn7j9GF0E83AMzTkBvBq+FlGcBR0e/lwBQ==', + sig: base64ToBytes('ylMvyATFC+feDIxRHCT8yyHlMAKXUQE4tLsmdmLtAKmYrTDdLHdbAn7j9GF0E83AMzTkBvBq+FlGcBR0e/lwBQ=='), }, - 'tx-type': TransactionType.axfer, + txType: TransactionType.axfer, }) }, ['testnet-K7TNWCBB5PYBX5OVSYPSD3VCKD4BYLRHWG43KWJ7JOJ7Z6UFUFWQ']: () => { return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 0, - 'asset-id': 705736233, - 'close-amount': 0, + assetTransferTransaction: { + amount: 0n, + assetId: 705736233n, + closeAmount: 0n, receiver: 'VCPEKOG3WYU6RA6KSM3IZGDF63ZFGQYNNUC7QCDEYF6OT2T3B3F6HVN5S4', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42239060, - fee: 1000, - 'first-valid': 42239058, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - group: '+Rd88080lmrfzu8EX6pntMRcOvv8AZOpxpQB1wr1h2Y=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42239060n, + fee: 1000n, + firstValid: 42239058n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + group: base64ToBytes('+Rd88080lmrfzu8EX6pntMRcOvv8AZOpxpQB1wr1h2Y='), id: 'K7TNWCBB5PYBX5OVSYPSD3VCKD4BYLRHWG43KWJ7JOJ7Z6UFUFWQ', - 'intra-round-offset': 2, - 'last-valid': 42240058, - 'receiver-rewards': 0, - 'round-time': 1721923448, + intraRoundOffset: 2, + lastValid: 42240058n, + receiverRewards: 0n, + roundTime: 1721923448, sender: 'VCPEKOG3WYU6RA6KSM3IZGDF63ZFGQYNNUC7QCDEYF6OT2T3B3F6HVN5S4', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'srtI2Yq9pIfBhMxc5rMLTlvQ9dCUKdrjDShHe73+ewiGUo23zByM4SoO8EWQJ0ft2KINFmRL4qlWKe/OPrNUBQ==', + sig: base64ToBytes('srtI2Yq9pIfBhMxc5rMLTlvQ9dCUKdrjDShHe73+ewiGUo23zByM4SoO8EWQJ0ft2KINFmRL4qlWKe/OPrNUBQ=='), }, - 'tx-type': TransactionType.axfer, + txType: TransactionType.axfer, }) }, ['testnet-44PALBEBH652BYUIT7SZF5PFWJ7KYSBFJYOPSLYX6KM3G47P53VA']: () => { return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 0, - 'asset-id': 705736233, - 'close-amount': 0, + assetTransferTransaction: { + amount: 0n, + assetId: 705736233n, + closeAmount: 0n, receiver: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42239060, - fee: 1000, - 'first-valid': 42239058, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - group: '+Rd88080lmrfzu8EX6pntMRcOvv8AZOpxpQB1wr1h2Y=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42239060n, + fee: 1000n, + firstValid: 42239058n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + group: base64ToBytes('+Rd88080lmrfzu8EX6pntMRcOvv8AZOpxpQB1wr1h2Y='), id: '44PALBEBH652BYUIT7SZF5PFWJ7KYSBFJYOPSLYX6KM3G47P53VA', - 'intra-round-offset': 3, - 'last-valid': 42240058, - 'receiver-rewards': 0, - 'round-time': 1721923448, + intraRoundOffset: 3, + lastValid: 42240058n, + receiverRewards: 0n, + roundTime: 1721923448, sender: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'SUsEGQaj+XVyq10Ou27hprgl+j30pi7uAQtsFBJ9h75yk5S2ok4V/Ofc2cgKyAHyTVBwIe+Y7pGKVH1pIXUnCA==', + sig: base64ToBytes('SUsEGQaj+XVyq10Ou27hprgl+j30pi7uAQtsFBJ9h75yk5S2ok4V/Ofc2cgKyAHyTVBwIe+Y7pGKVH1pIXUnCA=='), }, - 'tx-type': TransactionType.axfer, + txType: TransactionType.axfer, }) }, ['testnet-23RVHEI5OQZWQ5D6NNLOVOKA7LFKSUZEWEWEBDNCBI5GY4HPZS5A']: () => { return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 1, - 'asset-id': 705736233, - 'close-amount': 0, + assetTransferTransaction: { + amount: 1n, + assetId: 705736233n, + closeAmount: 0n, receiver: 'VCPEKOG3WYU6RA6KSM3IZGDF63ZFGQYNNUC7QCDEYF6OT2T3B3F6HVN5S4', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42239060, - fee: 1000, - 'first-valid': 42239058, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - group: '+Rd88080lmrfzu8EX6pntMRcOvv8AZOpxpQB1wr1h2Y=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42239060n, + fee: 1000n, + firstValid: 42239058n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + group: base64ToBytes('+Rd88080lmrfzu8EX6pntMRcOvv8AZOpxpQB1wr1h2Y='), id: '23RVHEI5OQZWQ5D6NNLOVOKA7LFKSUZEWEWEBDNCBI5GY4HPZS5A', - 'intra-round-offset': 4, - 'last-valid': 42240058, - 'receiver-rewards': 0, - 'round-time': 1721923448, + intraRoundOffset: 4, + lastValid: 42240058n, + receiverRewards: 0n, + roundTime: 1721923448, sender: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'au4cWjjuegOxdYYUeb0F21Vsb0XtLQYaqultIaRY98H8KMSguKS24SCeZDqy4DrCsV+skxkzUnvXd9Bia4+DAw==', + sig: base64ToBytes('au4cWjjuegOxdYYUeb0F21Vsb0XtLQYaqultIaRY98H8KMSguKS24SCeZDqy4DrCsV+skxkzUnvXd9Bia4+DAw=='), }, - 'tx-type': TransactionType.axfer, + txType: TransactionType.axfer, }) }, ['testnet-7XSI3OKXOEHSGVUZDTIYWGBKU3G65XZPRLNCFGNYH3SJWGXVR3AQ']: () => { return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 1, - 'asset-id': 705736233, - 'close-amount': 0, + assetTransferTransaction: { + amount: 1n, + assetId: 705736233n, + closeAmount: 0n, receiver: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', sender: 'VCPEKOG3WYU6RA6KSM3IZGDF63ZFGQYNNUC7QCDEYF6OT2T3B3F6HVN5S4', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42239060, - fee: 1000, - 'first-valid': 42239058, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - group: '+Rd88080lmrfzu8EX6pntMRcOvv8AZOpxpQB1wr1h2Y=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42239060n, + fee: 1000n, + firstValid: 42239058n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + group: base64ToBytes('+Rd88080lmrfzu8EX6pntMRcOvv8AZOpxpQB1wr1h2Y='), id: '7XSI3OKXOEHSGVUZDTIYWGBKU3G65XZPRLNCFGNYH3SJWGXVR3AQ', - 'intra-round-offset': 5, - 'last-valid': 42240058, - 'receiver-rewards': 0, - 'round-time': 1721923448, + intraRoundOffset: 5, + lastValid: 42240058n, + receiverRewards: 0n, + roundTime: 1721923448, sender: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'y+naO+YggLqNg8NcMmO1ChDy4FfEaxp1mvwBiMWiu7f4/uunvPH00RheGtRILm8QGmrfPC6zxF8rH3PKDCXGDw==', + sig: base64ToBytes('y+naO+YggLqNg8NcMmO1ChDy4FfEaxp1mvwBiMWiu7f4/uunvPH00RheGtRILm8QGmrfPC6zxF8rH3PKDCXGDw=='), }, - 'tx-type': TransactionType.axfer, + txType: TransactionType.axfer, }) }, ['testnet-QIMCXEMIV2LNX5RJMYWM4UQTJAUSJE5GGJAOE5NCTQ3BOSQ5MJMA']: () => { return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 0, - 'asset-id': 705736805, - 'close-amount': 0, + assetTransferTransaction: { + amount: 0n, + assetId: 705736805n, + closeAmount: 0n, receiver: 'UKMRZETEFXFINHP5QGNCQA3764KVBRV6JZEV4NWU6RJBAH7MTOB2KGSDRE', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42239084, - fee: 1000, - 'first-valid': 42239082, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - group: 'TYEjlEMFUb8dX+OtWME7k0nvN1+L77djDllXHRqz8fo=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42239084n, + fee: 1000n, + firstValid: 42239082n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + group: base64ToBytes('TYEjlEMFUb8dX+OtWME7k0nvN1+L77djDllXHRqz8fo='), id: 'QIMCXEMIV2LNX5RJMYWM4UQTJAUSJE5GGJAOE5NCTQ3BOSQ5MJMA', - 'intra-round-offset': 31, - 'last-valid': 42240082, - 'receiver-rewards': 0, - 'round-time': 1721923513, + intraRoundOffset: 31, + lastValid: 42240082n, + receiverRewards: 0n, + roundTime: 1721923513, sender: 'UKMRZETEFXFINHP5QGNCQA3764KVBRV6JZEV4NWU6RJBAH7MTOB2KGSDRE', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'GT3a/u9Jzdbp4aDvCbuRbFZtt4PMknBJoZfc/xaTaVfie6noOc2j0WoYAk10FJQdghwpJ1bLvHq7H/ODUr1VAQ==', + sig: base64ToBytes('GT3a/u9Jzdbp4aDvCbuRbFZtt4PMknBJoZfc/xaTaVfie6noOc2j0WoYAk10FJQdghwpJ1bLvHq7H/ODUr1VAQ=='), }, - 'tx-type': TransactionType.axfer, + txType: TransactionType.axfer, }) }, ['testnet-DDXYDL7EYTQRHH4G3SSZHT4HUZNBND24PDDNTF2VR73QBK4SL7AQ']: () => { return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 1, - 'asset-id': 705736805, - 'close-amount': 0, + assetTransferTransaction: { + amount: 1n, + assetId: 705736805n, + closeAmount: 0n, receiver: 'UKMRZETEFXFINHP5QGNCQA3764KVBRV6JZEV4NWU6RJBAH7MTOB2KGSDRE', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42239084, - fee: 1000, - 'first-valid': 42239082, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - group: 'TYEjlEMFUb8dX+OtWME7k0nvN1+L77djDllXHRqz8fo=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42239084n, + fee: 1000n, + firstValid: 42239082n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + group: base64ToBytes('TYEjlEMFUb8dX+OtWME7k0nvN1+L77djDllXHRqz8fo='), id: 'DDXYDL7EYTQRHH4G3SSZHT4HUZNBND24PDDNTF2VR73QBK4SL7AQ', - 'intra-round-offset': 32, - 'last-valid': 42240082, - 'receiver-rewards': 0, - 'round-time': 1721923513, + intraRoundOffset: 32, + lastValid: 42240082n, + receiverRewards: 0n, + roundTime: 1721923513, sender: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'SL9uO75xMAZ/rGC+tUyw0fgh1rjJYiToumnFuW+TKWh+Uwja2cR69TpmqAJIkJ2HDvlvQ1c0xpJnR0chUc/7AA==', + sig: base64ToBytes('SL9uO75xMAZ/rGC+tUyw0fgh1rjJYiToumnFuW+TKWh+Uwja2cR69TpmqAJIkJ2HDvlvQ1c0xpJnR0chUc/7AA=='), }, - 'tx-type': TransactionType.axfer, + txType: TransactionType.axfer, }) }, ['testnet-26TWK7B27JHHI6OAKTIXNBTC2IAUUPCUUHCYHD7P5B57X7BUJJKQ']: () => { return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 1, - 'asset-id': 705736805, - 'close-amount': 0, + assetTransferTransaction: { + amount: 1n, + assetId: 705736805n, + closeAmount: 0n, receiver: 'UKMRZETEFXFINHP5QGNCQA3764KVBRV6JZEV4NWU6RJBAH7MTOB2KGSDRE', sender: 'UKMRZETEFXFINHP5QGNCQA3764KVBRV6JZEV4NWU6RJBAH7MTOB2KGSDRE', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42239084, - fee: 1000, - 'first-valid': 42239082, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - group: 'TYEjlEMFUb8dX+OtWME7k0nvN1+L77djDllXHRqz8fo=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42239084n, + fee: 1000n, + firstValid: 42239082n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + group: base64ToBytes('TYEjlEMFUb8dX+OtWME7k0nvN1+L77djDllXHRqz8fo='), id: '26TWK7B27JHHI6OAKTIXNBTC2IAUUPCUUHCYHD7P5B57X7BUJJKQ', - 'intra-round-offset': 33, - 'last-valid': 42240082, - 'receiver-rewards': 0, - 'round-time': 1721923513, + intraRoundOffset: 33, + lastValid: 42240082n, + receiverRewards: 0n, + roundTime: 1721923513, sender: 'GYLUGN4H7Z45AW2BHYFLWS2YUMTK2MI6YANBFPW3SCHYXFRCACYXJDPSPI', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'NBsN7i/yFt1aeuXgrns/zPxGZtGa8BP5rSu/BPVu/T0c66JvlJFxJccDmTosCnUdVsIL/5aUoaKbXh7M9p3JDw==', + sig: base64ToBytes('NBsN7i/yFt1aeuXgrns/zPxGZtGa8BP5rSu/BPVu/T0c66JvlJFxJccDmTosCnUdVsIL/5aUoaKbXh7M9p3JDw=='), }, - 'tx-type': TransactionType.axfer, + txType: TransactionType.axfer, }) }, ['testnet-QY4K4IC2Z5RQ5OM2LHZH7UAFJJ44VUDSVOIAI67LMVTU4BHODP5A']: () => { return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [], - 'application-args': ['KCayAg==', 'AA=='], - 'application-id': 705410358, - 'foreign-apps': [], - 'foreign-assets': [705457144], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42227864, - fee: 2000, - 'first-valid': 42227859, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - 'global-state-delta': [ + applicationArgs: [base64ToBytes('KCayAg=='), base64ToBytes('AA==')], + applicationId: 705410358n, + foreignApps: [], + foreignAssets: [705457144n], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42227864n, + fee: 2000n, + firstValid: 42227859n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + globalStateDelta: [ { key: 'YXNh', value: { action: 2, - uint: 705457144, + uint: 705457144n, }, }, ], - group: 'kk6u1A9C9x1roBZOci/4Ne3XtHOtxKRq2O7OLVCbKOc=', + group: base64ToBytes('kk6u1A9C9x1roBZOci/4Ne3XtHOtxKRq2O7OLVCbKOc='), id: 'QY4K4IC2Z5RQ5OM2LHZH7UAFJJ44VUDSVOIAI67LMVTU4BHODP5A', - 'inner-txns': [ + innerTxns: [ { - 'asset-transfer-transaction': { - amount: 0, - 'asset-id': 705457144, - 'close-amount': 0, + id: 'QY4K4IC2Z5RQ5OM2LHZH7UAFJJ44VUDSVOIAI67LMVTU4BHODP5A/inner/1', + assetTransferTransaction: { + amount: 0n, + assetId: 705457144n, + closeAmount: 0n, receiver: '5VLJQQVCC2FARS5OKXWDPPYKJLJNEP7SKFHXD76DRN4WCV7SGI6W2IB5ME', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42227864, - fee: 0, - 'first-valid': 42227859, - 'intra-round-offset': 2, - 'last-valid': 42228859, - 'receiver-rewards': 0, - 'round-time': 1721892883, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42227864n, + fee: 0n, + firstValid: 42227859n, + intraRoundOffset: 2, + lastValid: 42228859n, + receiverRewards: 0n, + roundTime: 1721892883, sender: '5VLJQQVCC2FARS5OKXWDPPYKJLJNEP7SKFHXD76DRN4WCV7SGI6W2IB5ME', - 'sender-rewards': 0, - 'tx-type': TransactionType.axfer, + senderRewards: 0n, + txType: TransactionType.axfer, }, ], - 'intra-round-offset': 2, - 'last-valid': 42228859, - 'receiver-rewards': 0, - 'round-time': 1721892883, + intraRoundOffset: 2, + lastValid: 42228859n, + receiverRewards: 0n, + roundTime: 1721892883, sender: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'aJjwZDVvDhYTp/IEjFz/y1cNSlC065MVv5dpTNXkIjr/ApI1J9VlTYyT+1Ib+KkpR1VMqdmruQdndrRWhkKTDQ==', + sig: base64ToBytes('aJjwZDVvDhYTp/IEjFz/y1cNSlC065MVv5dpTNXkIjr/ApI1J9VlTYyT+1Ib+KkpR1VMqdmruQdndrRWhkKTDQ=='), }, - 'tx-type': TransactionType.appl, - } as unknown as TransactionResult) + txType: TransactionType.appl, + }) }, 'testnet-MEF2BZU4JXIU2I7ORQRFZQ3QVT7ZWJ5VQQ4HZ4BWVZK4CEDERQ3A': () => { return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [], - 'application-args': ['8KpwIw==', 'AAAAAAAAJxA=', 'AAAAAAAAjKA='], - 'application-id': 705410358, - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42227864, - fee: 1000, - 'first-valid': 42227859, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - 'global-state-delta': [ + applicationArgs: [base64ToBytes('8KpwIw=='), base64ToBytes('AAAAAAAAJxA='), base64ToBytes('AAAAAAAAjKA=')], + applicationId: 705410358n, + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42227864n, + fee: 1000n, + firstValid: 42227859n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + globalStateDelta: [ { key: 'YXNhX2FtdA==', value: { action: 2, - uint: 1, + uint: 1n, }, }, { key: 'YXVjdGlvbl9lbmQ=', value: { action: 2, - uint: 1721928880, + uint: 1721928880n, }, }, { key: 'aGlnaGVzdF9iaWQ=', value: { action: 2, - uint: 10000, + uint: 10000n, }, }, ], - group: 'kk6u1A9C9x1roBZOci/4Ne3XtHOtxKRq2O7OLVCbKOc=', + group: base64ToBytes('kk6u1A9C9x1roBZOci/4Ne3XtHOtxKRq2O7OLVCbKOc='), id: 'MEF2BZU4JXIU2I7ORQRFZQ3QVT7ZWJ5VQQ4HZ4BWVZK4CEDERQ3A', - 'intra-round-offset': 5, - 'last-valid': 42228859, - 'receiver-rewards': 0, - 'round-time': 1721892883, + intraRoundOffset: 5, + lastValid: 42228859n, + receiverRewards: 0n, + roundTime: 1721892883, sender: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'zUlazFAWR7MYhoYAX+GZDMq8Y6c6KFdHMUcVHfAihie9KWqbJmH9A1NbrwScU7wPtebCu+WxIIGkMjx69s9ABQ==', + sig: base64ToBytes('zUlazFAWR7MYhoYAX+GZDMq8Y6c6KFdHMUcVHfAihie9KWqbJmH9A1NbrwScU7wPtebCu+WxIIGkMjx69s9ABQ=='), }, - 'tx-type': 'appl', - } as unknown as TransactionResult) + txType: TransactionType.appl, + }) }, 'testnet-5JZDTA4H7SMWADF4TNE447CNBEOJEBZ5ECKEPHH5LEWQ7DMBRGXQ': () => { return new TransactionResultBuilder({ - 'asset-transfer-transaction': { - amount: 1, - 'asset-id': 705457144, - 'close-amount': 0, + assetTransferTransaction: { + amount: 1n, + assetId: 705457144n, + closeAmount: 0n, receiver: '5VLJQQVCC2FARS5OKXWDPPYKJLJNEP7SKFHXD76DRN4WCV7SGI6W2IB5ME', }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42227864, - fee: 1000, - 'first-valid': 42227859, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - group: 'kk6u1A9C9x1roBZOci/4Ne3XtHOtxKRq2O7OLVCbKOc=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42227864n, + fee: 1000n, + firstValid: 42227859n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + group: base64ToBytes('kk6u1A9C9x1roBZOci/4Ne3XtHOtxKRq2O7OLVCbKOc='), id: '5JZDTA4H7SMWADF4TNE447CNBEOJEBZ5ECKEPHH5LEWQ7DMBRGXQ', - 'intra-round-offset': 4, - 'last-valid': 42228859, - 'receiver-rewards': 0, - 'round-time': 1721892883, + intraRoundOffset: 4, + lastValid: 42228859n, + receiverRewards: 0n, + roundTime: 1721892883, sender: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'qpXbPIEwJkkjavMLcm7XwMWsRwXWLemIuJcSUhYehGJ7c4Q4HdVum27BLsgvXBvMFd7vrrX5zHHTSbMQpAWRDA==', + sig: base64ToBytes('qpXbPIEwJkkjavMLcm7XwMWsRwXWLemIuJcSUhYehGJ7c4Q4HdVum27BLsgvXBvMFd7vrrX5zHHTSbMQpAWRDA=='), }, - 'tx-type': TransactionType.axfer, + txType: TransactionType.axfer, }) }, 'testnet-QYKMVTOB4JF5PKLGJVYUD3ATSOTMVOHPE36UYDETNUG7LWPEFLKQ': () => { return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [], - 'application-args': [ - 'wD8uHA==', - 'AAAAAAAAAAE=', - 'AAAAAAAAAAI=', - 'AAAAAAAAAAM=', - 'AAAAAAAAAAQ=', - 'AAAAAAAAAAU=', - 'AAAAAAAAAAY=', - 'AAAAAAAAAAc=', - 'AAAAAAAAAAg=', - 'AAAAAAAAAAk=', - 'AAAAAAAAAAo=', - 'AAAAAAAAAAs=', - 'AAAAAAAAAAw=', - 'AAAAAAAAAA0=', - 'AAAAAAAAAA4=', - 'AAAAAAAAAA8AAAAAAAAAEAAAAAAAAAARAAAAAAAAAAASAQA=', + applicationArgs: [ + base64ToBytes('wD8uHA=='), + base64ToBytes('AAAAAAAAAAE='), + base64ToBytes('AAAAAAAAAAI='), + base64ToBytes('AAAAAAAAAAM='), + base64ToBytes('AAAAAAAAAAQ='), + base64ToBytes('AAAAAAAAAAU='), + base64ToBytes('AAAAAAAAAAY='), + base64ToBytes('AAAAAAAAAAc='), + base64ToBytes('AAAAAAAAAAg='), + base64ToBytes('AAAAAAAAAAk='), + base64ToBytes('AAAAAAAAAAo='), + base64ToBytes('AAAAAAAAAAs='), + base64ToBytes('AAAAAAAAAAw='), + base64ToBytes('AAAAAAAAAA0='), + base64ToBytes('AAAAAAAAAA4='), + base64ToBytes('AAAAAAAAAA8AAAAAAAAAEAAAAAAAAAARAAAAAAAAAAASAQA='), ], - 'application-id': 709806536, - 'foreign-apps': [705410358], - 'foreign-assets': [705457144], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42412547, - fee: 1000, - 'first-valid': 42412545, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - group: 'V5t9TByjm6M6pY9B76O+myDggseVS6bZP1lgizX665w=', + applicationId: 709806536n, + foreignApps: [705410358n], + foreignAssets: [705457144n], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42412547n, + fee: 1000n, + firstValid: 42412545n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + group: base64ToBytes('V5t9TByjm6M6pY9B76O+myDggseVS6bZP1lgizX665w='), id: 'QYKMVTOB4JF5PKLGJVYUD3ATSOTMVOHPE36UYDETNUG7LWPEFLKQ', - 'intra-round-offset': 3, - 'last-valid': 42413545, + intraRoundOffset: 3, + lastValid: 42413545n, logs: [ - 'AAAAAAAAAAEAAAAAAAAAAgAAAAAAAAADAAAAAAAAAAQAAAAAAAAABQAAAAAAAAAGAAAAAAAAAAcAAAAAAAAACAAAAAAAAAAJAAAAAAAAAAoAAAAAAAAACwAAAAAAAAAMAAAAAAAAAA0AAAAAAAAADgAAAAAAAAAPAAAAAAAAABAAAAAAAAAAEQAAAAAAAAAS', - 'FR98dQAAAAAqDGv4AAAAACoLtTYAAAAAAJU7IAAaACB232oofzq1syNMtKRoaL9ijcqGUttahJXIL0ASfwXYZA==', + base64ToBytes( + 'AAAAAAAAAAEAAAAAAAAAAgAAAAAAAAADAAAAAAAAAAQAAAAAAAAABQAAAAAAAAAGAAAAAAAAAAcAAAAAAAAACAAAAAAAAAAJAAAAAAAAAAoAAAAAAAAACwAAAAAAAAAMAAAAAAAAAA0AAAAAAAAADgAAAAAAAAAPAAAAAAAAABAAAAAAAAAAEQAAAAAAAAAS' + ), + base64ToBytes('FR98dQAAAAAqDGv4AAAAACoLtTYAAAAAAJU7IAAaACB232oofzq1syNMtKRoaL9ijcqGUttahJXIL0ASfwXYZA=='), ], - 'receiver-rewards': 0, - 'round-time': 1722396573, + receiverRewards: 0n, + roundTime: 1722396573, sender: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'al6Qbe6APLFFUyh5nd1eCzyz4L903r86qP7ZMqHhM/tu4QMhkxTfAHp/GljeqDFmZPA+oEugUNwWSXIBYvX2Bg==', + sig: base64ToBytes('al6Qbe6APLFFUyh5nd1eCzyz4L903r86qP7ZMqHhM/tu4QMhkxTfAHp/GljeqDFmZPA+oEugUNwWSXIBYvX2Bg=='), }, - 'tx-type': 'appl', - } as unknown as TransactionResult) + txType: TransactionType.appl, + }) }, 'testnet-O3PWUKD7HK23GI2MWSSGQ2F7MKG4VBSS3NNIJFOIF5ABE7YF3BSA': () => { return new TransactionResultBuilder({ - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42412547, - fee: 1000, - 'first-valid': 42412544, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', - group: 'V5t9TByjm6M6pY9B76O+myDggseVS6bZP1lgizX665w=', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42412547n, + fee: 1000n, + firstValid: 42412544n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', + group: base64ToBytes('V5t9TByjm6M6pY9B76O+myDggseVS6bZP1lgizX665w='), id: 'O3PWUKD7HK23GI2MWSSGQ2F7MKG4VBSS3NNIJFOIF5ABE7YF3BSA', - 'intra-round-offset': 2, - 'last-valid': 42413544, - 'payment-transaction': { - amount: 1000, - 'close-amount': 0, + intraRoundOffset: 2, + lastValid: 42413544n, + paymentTransaction: { + amount: 1000n, + closeAmount: 0n, receiver: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', }, - 'receiver-rewards': 0, - 'round-time': 1722396573, + receiverRewards: 0n, + roundTime: 1722396573, sender: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'ODJlCJzGZ3HL0kzKhfoSBgC5rL9Jfwr9Lr448Bsx85HU0xsC4PxCZbiFsc6J+J4comFOVjzpIJERp6m1MUJGBQ==', + sig: base64ToBytes('ODJlCJzGZ3HL0kzKhfoSBgC5rL9Jfwr9Lr448Bsx85HU0xsC4PxCZbiFsc6J+J4comFOVjzpIJERp6m1MUJGBQ=='), }, - 'tx-type': TransactionType.pay, + txType: TransactionType.pay, }) }, 'testnet-QLQS5F2U2OZJQJVQWZE5F6DKPDMY4LXEKHWE6NFHGTWJJGKKFA7A': () => { return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [], - 'application-args': [ - 'jqdQ0g==', - 'AAMABgAwAFoABQAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAwAAAAAAAAAEAAAAAAAAAAUABQAAAAAAAAAGAAAAAAAAAAcAAAAAAAAACAAAAAAAAAAJAAAAAAAAAAoABQAAAAAAAABvAAAAAAAAAN4AAAAAAAABTQAAAAAAAAG8AAAAAAAAAis=', - 'AAQALgAFAAAAAAAAApoAAAAAAAADCQAAAAAAAAN4AAAAAAAAA+cAAAAAAAAEVwFOTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLg==', + applicationArgs: [ + base64ToBytes('jqdQ0g=='), + base64ToBytes( + 'AAMABgAwAFoABQAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAwAAAAAAAAAEAAAAAAAAAAUABQAAAAAAAAAGAAAAAAAAAAcAAAAAAAAACAAAAAAAAAAJAAAAAAAAAAoABQAAAAAAAABvAAAAAAAAAN4AAAAAAAABTQAAAAAAAAG8AAAAAAAAAis=' + ), + base64ToBytes( + 'AAQALgAFAAAAAAAAApoAAAAAAAADCQAAAAAAAAN4AAAAAAAAA+cAAAAAAAAEVwFOTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLg==' + ), ], - 'application-id': 709982020, - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42416155, - fee: 1000, - 'first-valid': 42416153, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', + applicationId: 709982020n, + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42416155n, + fee: 1000n, + firstValid: 42416153n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', id: 'QLQS5F2U2OZJQJVQWZE5F6DKPDMY4LXEKHWE6NFHGTWJJGKKFA7A', - 'intra-round-offset': 62, - 'last-valid': 42417153, + intraRoundOffset: 62, + lastValid: 42417153n, logs: [ - 'FR98dQAEAIoAAwAGADAAWgAFAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAADAAAAAAAAAAQAAAAAAAAABQAFAAAAAAAAAAYAAAAAAAAABwAAAAAAAAAIAAAAAAAAAAkAAAAAAAAACgAFAAAAAAAAAG8AAAAAAAAA3gAAAAAAAAFNAAAAAAAAAbwAAAAAAAACKwAEAC4ABQAAAAAAAAKaAAAAAAAAAwkAAAAAAAADeAAAAAAAAAPnAAAAAAAABFcBTkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQsIHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVpcyBub3N0cnVkIGV4ZXJjaXRhdGlvbiB1bGxhbWNvIGxhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2VxdWF0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUgdmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxsYSBwYXJpYXR1ci4=', + base64ToBytes( + 'FR98dQAEAIoAAwAGADAAWgAFAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAADAAAAAAAAAAQAAAAAAAAABQAFAAAAAAAAAAYAAAAAAAAABwAAAAAAAAAIAAAAAAAAAAkAAAAAAAAACgAFAAAAAAAAAG8AAAAAAAAA3gAAAAAAAAFNAAAAAAAAAbwAAAAAAAACKwAEAC4ABQAAAAAAAAKaAAAAAAAAAwkAAAAAAAADeAAAAAAAAAPnAAAAAAAABFcBTkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQsIHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVpcyBub3N0cnVkIGV4ZXJjaXRhdGlvbiB1bGxhbWNvIGxhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2VxdWF0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUgdmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxsYSBwYXJpYXR1ci4=' + ), ], - 'receiver-rewards': 0, - 'round-time': 1722406463, + receiverRewards: 0n, + roundTime: 1722406463, sender: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'YRLhsEPTpkIbC/tgwZz1+HcMlN/x0aiZZR/QbYTnXddw6QdoABn1+/LhRgAdGWJ01aYeGkMGDzHXK6o+u1MFAA==', + sig: base64ToBytes('YRLhsEPTpkIbC/tgwZz1+HcMlN/x0aiZZR/QbYTnXddw6QdoABn1+/LhRgAdGWJ01aYeGkMGDzHXK6o+u1MFAA=='), }, - 'tx-type': 'appl', - } as unknown as TransactionResult) + txType: TransactionType.appl, + }) }, 'testnet-6YD3MPUIGUKMJ3NOJ3ZPHNC3GVDOFCTHMV6ADPMOI2BC6K3ZEE6Q': () => { return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [], - 'application-args': ['ryCdjA==', '11nQz0NjCD3XwrDJhUmkKZ978gFCGicgS73jTdDTkaI='], - 'application-id': 713725461, - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 42670901, - fee: 1000, - 'first-valid': 42670899, - 'genesis-hash': 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=', - 'genesis-id': 'testnet-v1.0', + applicationArgs: [base64ToBytes('ryCdjA=='), base64ToBytes('11nQz0NjCD3XwrDJhUmkKZ978gFCGicgS73jTdDTkaI=')], + applicationId: 713725461n, + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 42670901n, + fee: 1000n, + firstValid: 42670899n, + genesisHash: base64ToBytes('SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='), + genesisId: 'testnet-v1.0', id: '6YD3MPUIGUKMJ3NOJ3ZPHNC3GVDOFCTHMV6ADPMOI2BC6K3ZEE6Q', - 'intra-round-offset': 1, - 'last-valid': 42671899, - logs: ['FR98dddZ0M9DYwg918KwyYVJpCmfe/IBQhonIEu9403Q05Gi'], - 'receiver-rewards': 0, - 'round-time': 1723101171, + intraRoundOffset: 1, + lastValid: 42671899n, + logs: [base64ToBytes('FR98dddZ0M9DYwg918KwyYVJpCmfe/IBQhonIEu9403Q05Gi')], + receiverRewards: 0n, + roundTime: 1723101171, sender: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: '3E2NLPLicGHTiMmpIYUzByCsrW5qpGngK93u5SK2lsg4r+/GWpoVmfY60FCAeDv6TJWcPQ39Ulj2SjZZtQ7VAg==', + sig: base64ToBytes('3E2NLPLicGHTiMmpIYUzByCsrW5qpGngK93u5SK2lsg4r+/GWpoVmfY60FCAeDv6TJWcPQ39Ulj2SjZZtQ7VAg=='), }, - 'tx-type': 'appl', - } as unknown as TransactionResult) + txType: TransactionType.appl, + }) }, 'localnet-AV37TJVLBWXPI3EAUJJSDTAIQX22ECPMVADIOCR47TTRCPVPRG3Q': () => { return new TransactionResultBuilder({ id: 'AV37TJVLBWXPI3EAUJJSDTAIQX22ECPMVADIOCR47TTRCPVPRG3Q', - 'application-transaction': { + applicationTransaction: { // algod returns undefined for application-id when creating an application - 'application-id': undefined, - 'approval-program': - 'CiADAAEEJgYLYXVjdGlvbl9lbmQMcHJldmlvdXNfYmlkD3ByZXZpb3VzX2JpZGRlcgNhc2EKYXNhX2Ftb3VudAVjbGFpbTEYQAADiAGjMRtBAKaABCgmsgKABPCqcCOABDDG1YqABNt/6EOABOZUYluABB7BK+82GgCOBgABABMAMQA9AFMAXwAxGRREMRhENhoBF8AwiABqI0MxGRREMRhENhoBFzYaAhcxFiMJSTgQJBJEiABwI0MxGRREMRhEiACQI0MxGRREMRhEMRYjCUk4ECMSRIgAfiNDMRkURDEYRIgAoiNDMRkURDEYRDYaARfAMIgAzyNDMRkURDEYFEQjQ4oBADEAMgkSRCIrZUQURCuL/2exMgqL/7IRshQkshAisgGziYoDADEAMgkSRCIoZUQURIv/OBQyChJEi/84EicETGcyB4v+CChMZymL/WeJigAAiYoBADIHIihlRAxEi/84AEkxABJEi/84CCIpZURLAQxEKUsBZypPAmcxACcFTwJmiYoAADEAIicFY0xJTwJEMQAiKmVEEkEACiIpZUSLAEwJjAGxMQCyB4sBSbIII7IQIrIBszEAiwBPAgknBUxmiYoBADIHIihlRA1EsSIqZUQiKmVEIicEZUSyErIUshWL/7IRJLIQIrIBs4mKAAAoImcpImcnBCJnKyJnKjIDZ4k=', - 'clear-state-program': 'CoEBQw==', - 'on-completion': 'noop', - 'global-state-schema': { - 'num-byte-slice': 1, - 'num-uint': 4, - }, - 'local-state-schema': { - 'num-uint': 1, - }, - 'application-args': ['K5iklw=='], - }, - 'first-valid': 1, - 'last-valid': 1001, - 'tx-type': 'appl', - fee: 1000, + applicationId: undefined, + approvalProgram: base64ToBytes( + 'CiADAAEEJgYLYXVjdGlvbl9lbmQMcHJldmlvdXNfYmlkD3ByZXZpb3VzX2JpZGRlcgNhc2EKYXNhX2Ftb3VudAVjbGFpbTEYQAADiAGjMRtBAKaABCgmsgKABPCqcCOABDDG1YqABNt/6EOABOZUYluABB7BK+82GgCOBgABABMAMQA9AFMAXwAxGRREMRhENhoBF8AwiABqI0MxGRREMRhENhoBFzYaAhcxFiMJSTgQJBJEiABwI0MxGRREMRhEiACQI0MxGRREMRhEMRYjCUk4ECMSRIgAfiNDMRkURDEYRIgAoiNDMRkURDEYRDYaARfAMIgAzyNDMRkURDEYFEQjQ4oBADEAMgkSRCIrZUQURCuL/2exMgqL/7IRshQkshAisgGziYoDADEAMgkSRCIoZUQURIv/OBQyChJEi/84EicETGcyB4v+CChMZymL/WeJigAAiYoBADIHIihlRAxEi/84AEkxABJEi/84CCIpZURLAQxEKUsBZypPAmcxACcFTwJmiYoAADEAIicFY0xJTwJEMQAiKmVEEkEACiIpZUSLAEwJjAGxMQCyB4sBSbIII7IQIrIBszEAiwBPAgknBUxmiYoBADIHIihlRA1EsSIqZUQiKmVEIicEZUSyErIUshWL/7IRJLIQIrIBs4mKAAAoImcpImcnBCJnKyJnKjIDZ4k=' + ), + clearStateProgram: base64ToBytes('CoEBQw=='), + onCompletion: 'noop', + globalStateSchema: { + numByteSlice: 1, + numUint: 4, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 1, + }, + applicationArgs: [base64ToBytes('K5iklw==')], + }, + firstValid: 1n, + lastValid: 1001n, + txType: TransactionType.appl, + fee: 1000n, sender: 'YKPOB2GX4UVLSNNHJQQUPQ7G3VB6XN4HC7N5HMGAN2N4XZ45AXRTJ5HRUA', - 'confirmed-round': 2, - 'round-time': 1724804397, - 'intra-round-offset': 0, - 'genesis-hash': 'OFOY5kr3N/IpXmQ3RPI/pfJjbdGhOVO2t5YHtC4npZ0=', - 'genesis-id': 'dockernet-v1', - note: 'QUxHT0tJVF9ERVBMT1lFUjpqeyJuYW1lIjogIkF1Y3Rpb24iLCAidmVyc2lvbiI6ICJ2MS4wIiwgImRlbGV0YWJsZSI6IG51bGwsICJ1cGRhdGFibGUiOiBudWxsfQ==', - lease: '', - 'created-application-index': 1002, + confirmedRound: 2n, + roundTime: 1724804397, + intraRoundOffset: 0, + genesisHash: base64ToBytes('OFOY5kr3N/IpXmQ3RPI/pfJjbdGhOVO2t5YHtC4npZ0='), + genesisId: 'dockernet-v1', + note: base64ToBytes( + 'QUxHT0tJVF9ERVBMT1lFUjpqeyJuYW1lIjogIkF1Y3Rpb24iLCAidmVyc2lvbiI6ICJ2MS4wIiwgImRlbGV0YWJsZSI6IG51bGwsICJ1cGRhdGFibGUiOiBudWxsfQ==' + ), + lease: new Uint8Array(), + createdApplicationIndex: 1002n, signature: { - sig: 'SWcc0w0p5fzxcx/Dd5PLEQuTQ4tsS97Li5TlusVaQlJIGzRH0qjojFpCEsVMAw98EejGokiH3ZPTdNjQSO5tDw==', + sig: base64ToBytes('SWcc0w0p5fzxcx/Dd5PLEQuTQ4tsS97Li5TlusVaQlJIGzRH0qjojFpCEsVMAw98EejGokiH3ZPTdNjQSO5tDw=='), }, - 'global-state-delta': [ + globalStateDelta: [ { key: 'YXNh', value: { @@ -3515,40 +3628,40 @@ export const transactionResultMother = { }, }, ], - } as unknown as TransactionResult) + }) }, // This transaction was made by calling method "foo" of the Arc56TestAppSpecSampleOne app spec 'localnet-AIIGV5XLUCNTLDOBBSFXDGCLBOM6WIE42OMTADUAFBD3PHK6JL4Q': () => { return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [], - 'application-args': ['OW1VDg==', 'AAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAEAAAAAAAAAAI='], - 'application-id': 3771, - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 2708, - fee: 1000, - 'first-valid': 2707, - 'genesis-hash': 'x9maOhZVCNkkZCgV6CcLpxd1ZgIgHwuAfg6fdG2FJo8=', - 'genesis-id': 'dockernet-v1', - 'global-state-delta': [ + applicationArgs: [base64ToBytes('OW1VDg=='), base64ToBytes('AAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAEAAAAAAAAAAI=')], + applicationId: 3771n, + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 2708n, + fee: 1000n, + firstValid: 2707n, + genesisHash: base64ToBytes('x9maOhZVCNkkZCgV6CcLpxd1ZgIgHwuAfg6fdG2FJo8='), + genesisId: 'dockernet-v1', + globalStateDelta: [ { key: 'Z2xvYmFsS2V5', value: { action: 2, - uint: 1234, + uint: 1234n, }, }, { @@ -3556,54 +3669,54 @@ export const transactionResultMother = { value: { action: 1, bytes: 'AA0AJQ==', - uint: 0, + uint: 0n, }, }, ], id: 'AIIGV5XLUCNTLDOBBSFXDGCLBOM6WIE42OMTADUAFBD3PHK6JL4Q', - 'intra-round-offset': 0, - 'last-valid': 3707, - logs: ['FR98dQAAAAAAAAACAAAAAAAAAAI='], - 'receiver-rewards': 0, - 'round-time': 1731017755, + intraRoundOffset: 0, + lastValid: 3707n, + logs: [base64ToBytes('FR98dQAAAAAAAAACAAAAAAAAAAI=')], + receiverRewards: 0n, + roundTime: 1731017755, sender: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'l9mhSOySNKefxFx/cSQDNmUBJlh6+fXO4k5DFbfNrVEh7IfhMsiO2Gy/w6Q0Of114/m/oAf3yKhz0BCQR3IvBA==', + sig: base64ToBytes('l9mhSOySNKefxFx/cSQDNmUBJlh6+fXO4k5DFbfNrVEh7IfhMsiO2Gy/w6Q0Of114/m/oAf3yKhz0BCQR3IvBA=='), }, - 'tx-type': 'appl', - } as unknown as TransactionResult) + txType: TransactionType.appl, + }) }, // This transaction was made by calling method "optInToApplication" of the Arc56TestAppSpecSampleOne app spec 'localnet-Z64TMG3BMEVRM2CSJDEHBB7NAPI5B3HZJZEZZ7DJDPN5WOBYTMFA': () => { return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [], - 'application-args': ['AaOj/w=='], - 'application-id': 3771, - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'optin', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 2710, - fee: 1000, - 'first-valid': 2709, - 'genesis-hash': 'x9maOhZVCNkkZCgV6CcLpxd1ZgIgHwuAfg6fdG2FJo8=', - 'genesis-id': 'dockernet-v1', + applicationArgs: [base64ToBytes('AaOj/w==')], + applicationId: 3771n, + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'optin', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 2710n, + fee: 1000n, + firstValid: 2709n, + genesisHash: base64ToBytes('x9maOhZVCNkkZCgV6CcLpxd1ZgIgHwuAfg6fdG2FJo8='), + genesisId: 'dockernet-v1', id: 'Z64TMG3BMEVRM2CSJDEHBB7NAPI5B3HZJZEZZ7DJDPN5WOBYTMFA', - 'intra-round-offset': 0, - 'last-valid': 3709, - 'local-state-delta': [ + intraRoundOffset: 0, + lastValid: 3709n, + localStateDelta: [ { address: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', delta: [ @@ -3611,7 +3724,7 @@ export const transactionResultMother = { key: 'bG9jYWxLZXk=', value: { action: 2, - uint: 1234, + uint: 1234n, }, }, { @@ -3619,102 +3732,102 @@ export const transactionResultMother = { value: { action: 1, bytes: 'AANiYXI=', - uint: 0, + uint: 0n, }, }, ], }, ], - 'receiver-rewards': 0, - 'round-time': 1731017805, + receiverRewards: 0n, + roundTime: 1731017805, sender: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'h20ruo3JVtSZ5z/KJOHi7qySEmlfM3yWL2xtTBfWl23vnfI8/M1CTeGvAWmQqyxZdZ5NpmuiSoCdqZHRERngAw==', + sig: base64ToBytes('h20ruo3JVtSZ5z/KJOHi7qySEmlfM3yWL2xtTBfWl23vnfI8/M1CTeGvAWmQqyxZdZ5NpmuiSoCdqZHRERngAw=='), }, - 'tx-type': 'appl', - } as unknown as TransactionResult) + txType: TransactionType.appl, + }) }, // This transaction was made by calling method "foo" of the Arc56TestAppSpecSampleThree app spec 'localnet-B65NVNGK6E6K2E2F4K2M5HRKB4VPPZMJLS55UKWLN6O2XPT2NSTA': () => { return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [], - 'application-args': ['OW1VDg==', 'AAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAM='], - 'application-id': 5103, - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'noop', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 3999, - fee: 1000, - 'first-valid': 3998, - 'genesis-hash': 'x9maOhZVCNkkZCgV6CcLpxd1ZgIgHwuAfg6fdG2FJo8=', - 'genesis-id': 'dockernet-v1', - 'global-state-delta': [ + applicationArgs: [base64ToBytes('OW1VDg=='), base64ToBytes('AAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAM=')], + applicationId: 5103n, + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 3999n, + fee: 1000n, + firstValid: 3998n, + genesisHash: base64ToBytes('x9maOhZVCNkkZCgV6CcLpxd1ZgIgHwuAfg6fdG2FJo8='), + genesisId: 'dockernet-v1', + globalStateDelta: [ { key: 'AANmb28=', value: { action: 1, bytes: 'AA0AJQ==', - uint: 0, + uint: 0n, }, }, ], id: 'B65NVNGK6E6K2E2F4K2M5HRKB4VPPZMJLS55UKWLN6O2XPT2NSTA', - 'intra-round-offset': 0, - 'last-valid': 4998, - logs: ['FR98dQAAAAAAAAADAAAAAAAAAAE='], - 'receiver-rewards': 0, - 'round-time': 1731050030, + intraRoundOffset: 0, + lastValid: 4998n, + logs: [base64ToBytes('FR98dQAAAAAAAAADAAAAAAAAAAE=')], + receiverRewards: 0n, + roundTime: 1731050030, sender: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: '3xZ3KcpEUDVtAlcwoAmwadmRw8FRigjKAjvq8Jhuq/xYVn3+T8oYDuVGJJL/wfZmjrHj76dxxsyxB5Qv/3TXAQ==', + sig: base64ToBytes('3xZ3KcpEUDVtAlcwoAmwadmRw8FRigjKAjvq8Jhuq/xYVn3+T8oYDuVGJJL/wfZmjrHj76dxxsyxB5Qv/3TXAQ=='), }, - 'tx-type': 'appl', - } as unknown as TransactionResult) + txType: TransactionType.appl, + }) }, // This transaction was made by calling method "optInToApplication" of the Arc56TestAppSpecSampleThree app spec 'localnet-UUVFBB6FV46RDM66RJSLVP4JIDIM75JSQSURJECEJNUXKMY3XVWQ': () => { return new TransactionResultBuilder({ - 'application-transaction': { + applicationTransaction: { accounts: [], - 'application-args': ['AaOj/w=='], - 'application-id': 5103, - 'foreign-apps': [], - 'foreign-assets': [], - 'global-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'local-state-schema': { - 'num-byte-slice': 0, - 'num-uint': 0, - }, - 'on-completion': 'optin', - }, - 'close-rewards': 0, - 'closing-amount': 0, - 'confirmed-round': 4001, - fee: 1000, - 'first-valid': 4000, - 'genesis-hash': 'x9maOhZVCNkkZCgV6CcLpxd1ZgIgHwuAfg6fdG2FJo8=', - 'genesis-id': 'dockernet-v1', + applicationArgs: [base64ToBytes('AaOj/w==')], + applicationId: 5103n, + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'optin', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 4001n, + fee: 1000n, + firstValid: 4000n, + genesisHash: base64ToBytes('x9maOhZVCNkkZCgV6CcLpxd1ZgIgHwuAfg6fdG2FJo8='), + genesisId: 'dockernet-v1', id: 'UUVFBB6FV46RDM66RJSLVP4JIDIM75JSQSURJECEJNUXKMY3XVWQ', - 'intra-round-offset': 0, - 'last-valid': 5000, - 'local-state-delta': [ + intraRoundOffset: 0, + lastValid: 5000n, + localStateDelta: [ { address: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', delta: [ @@ -3723,20 +3836,115 @@ export const transactionResultMother = { value: { action: 1, bytes: 'AANiYXI=', - uint: 0, + uint: 0n, }, }, ], }, ], - 'receiver-rewards': 0, - 'round-time': 1731050080, + receiverRewards: 0n, + roundTime: 1731050080, sender: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', - 'sender-rewards': 0, + senderRewards: 0n, signature: { - sig: 'S0PatEjdnWBvi2T5i5CLuId4sBpEGkWP5gW9Gm4Cj/wb6c9FxLa22kUV+K0gFWIPRzvMPKNqgJvdLyyz/h8pDg==', + sig: base64ToBytes('S0PatEjdnWBvi2T5i5CLuId4sBpEGkWP5gW9Gm4Cj/wb6c9FxLa22kUV+K0gFWIPRzvMPKNqgJvdLyyz/h8pDg=='), }, - 'tx-type': 'appl', - } as unknown as TransactionResult) + txType: TransactionType.appl, + }) + }, + 'localnet-64YO3SCTIJQFVTHYFPD74GYCEH5ETU7RVZCGQ5WCXPIEZEWHRE5A': () => { + return new TransactionResultBuilder({ + fee: 3000n, + firstValid: 14891n, + lastValid: 15891n, + sender: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', + applicationTransaction: { + applicationId: 17846n, + accounts: [], + applicationArgs: [base64ToBytes('C5GYTg=='), base64ToBytes('AAAAAAAAJyM=')], + foreignApps: [10019n], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 14892n, + genesisHash: base64ToBytes('iVvbylUO75dKYYApzcPo2fpBXLY/vECxORHzYMkXR7I='), + genesisId: 'dockernet-v1', + id: '64YO3SCTIJQFVTHYFPD74GYCEH5ETU7RVZCGQ5WCXPIEZEWHRE5A', + intraRoundOffset: 0, + logs: [base64ToBytes('FR98dQAAAAAAAYag')], + receiverRewards: 0n, + roundTime: 1736481124, + senderRewards: 0n, + signature: { + sig: base64ToBytes('0pQyotXLRytLEMYHzd51bViOowOxWQg7Xggo3I2TY1uWhVlBNcVdDOkHGHhxYaLseDcYwqEfPXyO0oP3CR8NAQ=='), + }, + txType: TransactionType.appl, + innerTxns: [ + { + fee: 0n, + firstValid: 14891n, + lastValid: 15891n, + sender: 'J2EJKPHWFXKZY7A3JIH3DVRNIALCEM7AIOU4DUV2LKC7GL4DRQT5YVAH2A', + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 14892n, + group: base64ToBytes('8Dp0ZM4bEo4LexOu2AtAhOUBKKttkR2slT8aau9t7+E='), + id: '64YO3SCTIJQFVTHYFPD74GYCEH5ETU7RVZCGQ5WCXPIEZEWHRE5A/inner/1', + intraRoundOffset: 0, + paymentTransaction: { + amount: 100000n, + receiver: '25M5BT2DMMED3V6CWDEYKSNEFGPXX4QBIINCOICLXXRU3UGTSGRMF3MTOE', + closeAmount: 0n, + }, + receiverRewards: 0n, + roundTime: 1736481124, + senderRewards: 0n, + txType: TransactionType.pay, + }, + { + fee: 0n, + firstValid: 14891n, + lastValid: 15891n, + sender: 'J2EJKPHWFXKZY7A3JIH3DVRNIALCEM7AIOU4DUV2LKC7GL4DRQT5YVAH2A', + applicationTransaction: { + applicationId: 10019n, + accounts: [], + applicationArgs: [base64ToBytes('n9g1+A==')], + foreignApps: [], + foreignAssets: [], + globalStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + localStateSchema: { + numByteSlice: 0, + numUint: 0, + }, + onCompletion: 'noop', + }, + closeRewards: 0n, + closingAmount: 0n, + confirmedRound: 14892n, + group: base64ToBytes('8Dp0ZM4bEo4LexOu2AtAhOUBKKttkR2slT8aau9t7+E='), + id: '64YO3SCTIJQFVTHYFPD74GYCEH5ETU7RVZCGQ5WCXPIEZEWHRE5A/inner/2', + intraRoundOffset: 0, + logs: [base64ToBytes('FR98dQAAAAAAAYag')], + receiverRewards: 0n, + roundTime: 1736481124, + senderRewards: 0n, + txType: TransactionType.appl, + }, + ], + }) }, } diff --git a/src/tests/setup/mocks/index.ts b/src/tests/setup/mocks/index.ts index b7b72b4b1..5d047325b 100644 --- a/src/tests/setup/mocks/index.ts +++ b/src/tests/setup/mocks/index.ts @@ -42,6 +42,7 @@ vi.mock('@txnlab/use-wallet-react', async () => { setAlgodClient: vi.fn(), signTransactions: vi.fn(), transactionSigner: vi.fn(), + isReady: true, } as unknown as ReturnType }), } diff --git a/src/tests/test-app-specs/test-contract.arc32.json b/src/tests/test-app-specs/test-contract.arc32.json index 2b70aeb78..6df04be99 100644 --- a/src/tests/test-app-specs/test-contract.arc32.json +++ b/src/tests/test-app-specs/test-contract.arc32.json @@ -34,11 +34,16 @@ "call_config": { "no_op": "CALL" } + }, + "inner_pay_appl(uint64)uint64": { + "call_config": { + "no_op": "CALL" + } } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpzbWFydF9jb250cmFjdHMudGVzdF9jb250cmFjdC5jb250cmFjdC5UZXN0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAgNAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4MDAwNAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMudGVzdF9jb250cmFjdC5jb250cmFjdC5UZXN0Q29udHJhY3QuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjEyCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTMKICAgIC8vIHNlbGYuZ2xvYmFsX3N0YXRlX2JpZ19pbnQgPSBHbG9iYWxTdGF0ZShVSW50NjQoMzMzOTk5MjIyNDQ0NTU1MDEpKQogICAgcHVzaGJ5dGVzICJnbG9iYWxfc3RhdGVfYmlnX2ludCIKICAgIHB1c2hpbnQgMzMzOTk5MjIyNDQ0NTU1MDEgLy8gMzMzOTk5MjIyNDQ0NTU1MDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMudGVzdF9jb250cmFjdC5jb250cmFjdC5UZXN0Q29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDExCiAgICBwdXNoYnl0ZXNzIDB4ZmU2YmRmNjkgMHg5ZmQ4MzVmOCAweGVhNDUxM2QzIDB4ZWYzNDYzYmMgMHgxNjhhZmRiYSAweDhlYTc1MGQyIDB4NzEzZDcyZTQgLy8gbWV0aG9kICJhZGQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImdldF9wYXlfdHhuX2Ftb3VudChwYXkpdWludDY0IiwgbWV0aG9kICJlY2hvX2J5dGVzKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgImVjaG9fc3RhdGljX2FycmF5KHVpbnQ2NFs0XSl1aW50NjRbNF0iLCBtZXRob2QgImVjaG9fZHluYW1pY19hcnJheSh1aW50NjRbXSl1aW50NjRbXSIsIG1ldGhvZCAibmVzdF9hcnJheV9hbmRfdHVwbGUodWludDY0W11bXSwodWludDY0W10sc3RyaW5nKSkodWludDY0W11bXSwodWludDY0W10sc3RyaW5nKSkiLCBtZXRob2QgImVjaG9fYm9vbGVhbihib29sKWJvb2wiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZGRfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfcGF5X3R4bl9hbW91bnRfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX2J5dGVzX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19zdGF0aWNfYXJyYXlfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX2R5bmFtaWNfYXJyYXlfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXN0X2FycmF5X2FuZF90dXBsZV9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fYm9vbGVhbl9yb3V0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZGRfcm91dGVAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhZGQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9wYXlfdHhuX2Ftb3VudF9yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVGVzdENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgZ2V0X3BheV90eG5fYW1vdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX2J5dGVzX3JvdXRlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUZXN0Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVjaG9fYnl0ZXMKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX3N0YXRpY19hcnJheV9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVGVzdENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weToyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVjaG9fc3RhdGljX2FycmF5CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX2R5bmFtaWNfYXJyYXlfcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBlY2hvX2R5bmFtaWNfYXJyYXkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX25lc3RfYXJyYXlfYW5kX3R1cGxlX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weTozNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUZXN0Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgbmVzdF9hcnJheV9hbmRfdHVwbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fYm9vbGVhbl9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVGVzdENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weTo0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVjaG9fYm9vbGVhbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTUKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy50ZXN0X2NvbnRyYWN0LmNvbnRyYWN0LlRlc3RDb250cmFjdC5hZGQoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKYWRkOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTUtMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFkZChzZWxmLCBhOiBhcmM0LlVJbnQ2NCwgYjogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weToxNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KGEubmF0aXZlICsgYi5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgKwogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnRlc3RfY29udHJhY3QuY29udHJhY3QuVGVzdENvbnRyYWN0LmdldF9wYXlfdHhuX2Ftb3VudChwYXlfdHhuOiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRfcGF5X3R4bl9hbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weToxOS0yMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZ2V0X3BheV90eG5fYW1vdW50KHNlbGYsIHBheV90eG46IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChwYXlfdHhuLmFtb3VudCkKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQW1vdW50CiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMudGVzdF9jb250cmFjdC5jb250cmFjdC5UZXN0Q29udHJhY3QuZWNob19ieXRlcyhhOiBieXRlcykgLT4gYnl0ZXM6CmVjaG9fYnl0ZXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weToyMy0yNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZWNob19ieXRlcyhzZWxmLCBhOiBCeXRlcykgLT4gQnl0ZXM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjI1CiAgICAvLyByZXR1cm4gYQogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMudGVzdF9jb250cmFjdC5jb250cmFjdC5UZXN0Q29udHJhY3QuZWNob19zdGF0aWNfYXJyYXkoYXJyOiBieXRlcykgLT4gYnl0ZXM6CmVjaG9fc3RhdGljX2FycmF5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MjctMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGVjaG9fc3RhdGljX2FycmF5KHNlbGYsIGFycjogU3RhdGljSW50cykgLT4gU3RhdGljSW50czoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MjkKICAgIC8vIHJldHVybiBhcnIKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnRlc3RfY29udHJhY3QuY29udHJhY3QuVGVzdENvbnRyYWN0LmVjaG9fZHluYW1pY19hcnJheShhcnI6IGJ5dGVzKSAtPiBieXRlczoKZWNob19keW5hbWljX2FycmF5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MzEtMzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGVjaG9fZHluYW1pY19hcnJheShzZWxmLCBhcnI6IER5bmFtaWNJbnRzKSAtPiBEeW5hbWljSW50czoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MzMKICAgIC8vIHJldHVybiBhcnIKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnRlc3RfY29udHJhY3QuY29udHJhY3QuVGVzdENvbnRyYWN0Lm5lc3RfYXJyYXlfYW5kX3R1cGxlKGFycjogYnl0ZXMsIHR1cGxlOiBieXRlcykgLT4gYnl0ZXM6Cm5lc3RfYXJyYXlfYW5kX3R1cGxlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MzUtMzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG5lc3RfYXJyYXlfYW5kX3R1cGxlKAogICAgLy8gICAgIHNlbGYsIGFycjogRHluYW1pY05lc3RlZEludHMsIHR1cGxlOiBhcmM0LlR1cGxlW0R5bmFtaWNJbnRzLCBhcmM0LlN0cmluZ10KICAgIC8vICkgLT4gUmV0dXJuVHlwZToKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MzkKICAgIC8vIChjaGlsZF9hcnJheSwgc3RyKSA9IHR1cGxlLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAyIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weTo0NAogICAgLy8gYXJjNC5UdXBsZVtEeW5hbWljSW50cywgYXJjNC5TdHJpbmddKChjaGlsZF9hcnJheS5jb3B5KCksIHN0cikpLAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18xIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weTo0MS00NgogICAgLy8gcmV0dXJuIFJldHVyblR5cGUoCiAgICAvLyAgICAgKAogICAgLy8gICAgICAgICBhcnIuY29weSgpLAogICAgLy8gICAgICAgICBhcmM0LlR1cGxlW0R5bmFtaWNJbnRzLCBhcmM0LlN0cmluZ10oKGNoaWxkX2FycmF5LmNvcHkoKSwgc3RyKSksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGludGNfMiAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMSAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnRlc3RfY29udHJhY3QuY29udHJhY3QuVGVzdENvbnRyYWN0LmVjaG9fYm9vbGVhbihib29sOiBieXRlcykgLT4gYnl0ZXM6CmVjaG9fYm9vbGVhbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjQ4LTQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBlY2hvX2Jvb2xlYW4oc2VsZiwgYm9vbDogYXJjNC5Cb29sKSAtPiBhcmM0LkJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjUwCiAgICAvLyByZXR1cm4gYm9vbAogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIK", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpzbWFydF9jb250cmFjdHMudGVzdF9jb250cmFjdC5jb250cmFjdC5UZXN0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMudGVzdF9jb250cmFjdC5jb250cmFjdC5UZXN0Q29udHJhY3QuX19hbGdvcHlfZW50cnlwb2ludF93aXRoX2luaXQoKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwIDQKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDlmZDgzNWY4IDB4MDAwNAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTMKICAgIC8vIHNlbGYuZ2xvYmFsX3N0YXRlX2JpZ19pbnQgPSBHbG9iYWxTdGF0ZShVSW50NjQoMzMzOTk5MjIyNDQ0NTU1MDEpKQogICAgcHVzaGJ5dGVzICJnbG9iYWxfc3RhdGVfYmlnX2ludCIKICAgIHB1c2hpbnQgMzMzOTk5MjIyNDQ0NTU1MDEgLy8gMzMzOTk5MjIyNDQ0NTU1MDEKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUZXN0Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxMwogICAgcHVzaGJ5dGVzIDB4ZmU2YmRmNjkgLy8gbWV0aG9kICJhZGQodWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICBieXRlY18xIC8vIG1ldGhvZCAiZ2V0X3BheV90eG5fYW1vdW50KHBheSl1aW50NjQiCiAgICBwdXNoYnl0ZXNzIDB4ZWE0NTEzZDMgMHhlZjM0NjNiYyAweDE2OGFmZGJhIDB4OGVhNzUwZDIgMHg3MTNkNzJlNCAweDBiOTE5ODRlIC8vIG1ldGhvZCAiZWNob19ieXRlcyhieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJlY2hvX3N0YXRpY19hcnJheSh1aW50NjRbNF0pdWludDY0WzRdIiwgbWV0aG9kICJlY2hvX2R5bmFtaWNfYXJyYXkodWludDY0W10pdWludDY0W10iLCBtZXRob2QgIm5lc3RfYXJyYXlfYW5kX3R1cGxlKHVpbnQ2NFtdW10sKHVpbnQ2NFtdLHN0cmluZykpKHVpbnQ2NFtdW10sKHVpbnQ2NFtdLHN0cmluZykpIiwgbWV0aG9kICJlY2hvX2Jvb2xlYW4oYm9vbClib29sIiwgbWV0aG9kICJpbm5lcl9wYXlfYXBwbCh1aW50NjQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hZGRfcm91dGVANSBtYWluX2dldF9wYXlfdHhuX2Ftb3VudF9yb3V0ZUA2IG1haW5fZWNob19ieXRlc19yb3V0ZUA3IG1haW5fZWNob19zdGF0aWNfYXJyYXlfcm91dGVAOCBtYWluX2VjaG9fZHluYW1pY19hcnJheV9yb3V0ZUA5IG1haW5fbmVzdF9hcnJheV9hbmRfdHVwbGVfcm91dGVAMTAgbWFpbl9lY2hvX2Jvb2xlYW5fcm91dGVAMTEgbWFpbl9pbm5lcl9wYXlfYXBwbF9yb3V0ZUAxMgoKbWFpbl9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHVybgoKbWFpbl9pbm5lcl9wYXlfYXBwbF9yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBpbm5lcl9wYXlfYXBwbAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9lY2hvX2Jvb2xlYW5fcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weTo0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fbmVzdF9hcnJheV9hbmRfdHVwbGVfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weTozNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUZXN0Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgbmVzdF9hcnJheV9hbmRfdHVwbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZWNob19keW5hbWljX2FycmF5X3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weTozMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZWNob19zdGF0aWNfYXJyYXlfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVGVzdENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weToyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9lY2hvX2J5dGVzX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUZXN0Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weToyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfcGF5X3R4bl9hbW91bnRfcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weToxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGdldF9wYXlfdHhuX2Ftb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhZGQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxNQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMudGVzdF9jb250cmFjdC5jb250cmFjdC5UZXN0Q29udHJhY3QuYWRkKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gYnl0ZXM6CmFkZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjE1LTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhZGQoc2VsZiwgYTogYXJjNC5VSW50NjQsIGI6IGFyYzQuVUludDY0KSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTcKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhLm5hdGl2ZSArIGIubmF0aXZlKQogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgICsKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy50ZXN0X2NvbnRyYWN0LmNvbnRyYWN0LlRlc3RDb250cmFjdC5nZXRfcGF5X3R4bl9hbW91bnQocGF5X3R4bjogdWludDY0KSAtPiBieXRlczoKZ2V0X3BheV90eG5fYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MTktMjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGdldF9wYXlfdHhuX2Ftb3VudChzZWxmLCBwYXlfdHhuOiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbikgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQocGF5X3R4bi5hbW91bnQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFtb3VudAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnRlc3RfY29udHJhY3QuY29udHJhY3QuVGVzdENvbnRyYWN0Lm5lc3RfYXJyYXlfYW5kX3R1cGxlKGFycjogYnl0ZXMsIHR1cGxlOiBieXRlcykgLT4gYnl0ZXM6Cm5lc3RfYXJyYXlfYW5kX3R1cGxlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MzUtMzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG5lc3RfYXJyYXlfYW5kX3R1cGxlKAogICAgLy8gICAgIHNlbGYsIGFycjogRHluYW1pY05lc3RlZEludHMsIHR1cGxlOiBhcmM0LlR1cGxlW0R5bmFtaWNJbnRzLCBhcmM0LlN0cmluZ10KICAgIC8vICkgLT4gUmV0dXJuVHlwZToKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6MzkKICAgIC8vIChjaGlsZF9hcnJheSwgc3RyKSA9IHR1cGxlLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAyIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weTo0NAogICAgLy8gYXJjNC5UdXBsZVtEeW5hbWljSW50cywgYXJjNC5TdHJpbmddKChjaGlsZF9hcnJheS5jb3B5KCksIHN0cikpLAogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18yIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18yIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weTo0MS00NgogICAgLy8gcmV0dXJuIFJldHVyblR5cGUoCiAgICAvLyAgICAgKAogICAgLy8gICAgICAgICBhcnIuY29weSgpLAogICAgLy8gICAgICAgICBhcmM0LlR1cGxlW0R5bmFtaWNJbnRzLCBhcmM0LlN0cmluZ10oKGNoaWxkX2FycmF5LmNvcHkoKSwgc3RyKSksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGludGNfMiAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMiAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnRlc3RfY29udHJhY3QuY29udHJhY3QuVGVzdENvbnRyYWN0LmlubmVyX3BheV9hcHBsKGFwcElkOiBieXRlcykgLT4gYnl0ZXM6CmlubmVyX3BheV9hcHBsOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6NTItNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGlubmVyX3BheV9hcHBsKHNlbGYsIGFwcElkOiBhcmM0LlVJbnQ2NCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjU1CiAgICAvLyByZWNlaXZlciA9IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weTo1OS02MQogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbFthcmM0LlVJbnQ2NF0oCiAgICAvLyAgICAgImdldF9wYXlfdHhuX2Ftb3VudChwYXkpdWludDY0IiwgcGF5VHhuLCBhcHBfaWQ9YXBwSWQubmF0aXZlCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weTo1NgogICAgLy8gYW1vdW50ID0gMTAwMDAwLAogICAgcHVzaGludCAxMDAwMDAgLy8gMTAwMDAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6NTQKICAgIC8vIHBheVR4biA9IGl0eG4uUGF5bWVudCgKICAgIGludGNfMCAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6NTktNjEKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGxbYXJjNC5VSW50NjRdKAogICAgLy8gICAgICJnZXRfcGF5X3R4bl9hbW91bnQocGF5KXVpbnQ2NCIsIHBheVR4biwgYXBwX2lkPWFwcElkLm5hdGl2ZQogICAgLy8gKQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdGVzdF9jb250cmFjdC9jb250cmFjdC5weTo2MAogICAgLy8gImdldF9wYXlfdHhuX2Ftb3VudChwYXkpdWludDY0IiwgcGF5VHhuLCBhcHBfaWQ9YXBwSWQubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3Rlc3RfY29udHJhY3QvY29udHJhY3QucHk6NTktNjEKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGxbYXJjNC5VSW50NjRdKAogICAgLy8gICAgICJnZXRfcGF5X3R4bl9hbW91bnQocGF5KXVpbnQ2NCIsIHBheVR4biwgYXBwX2lkPWFwcElkLm5hdGl2ZQogICAgLy8gKQogICAgYnl0ZWNfMSAvLyBtZXRob2QgImdldF9wYXlfdHhuX2Ftb3VudChwYXkpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBnaXR4biAxIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy90ZXN0X2NvbnRyYWN0L2NvbnRyYWN0LnB5OjYzCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { "global": { @@ -166,6 +171,19 @@ "returns": { "type": "bool" } + }, + { + "name": "inner_pay_appl", + "args": [ + { + "type": "uint64", + "name": "appId" + } + ], + "readonly": false, + "returns": { + "type": "uint64" + } } ], "networks": {} @@ -173,4 +191,4 @@ "bare_call_config": { "no_op": "CREATE" } -} +} \ No newline at end of file diff --git a/src/tests/test-component.tsx b/src/tests/test-component.tsx index f98e7811d..8b2dde215 100644 --- a/src/tests/test-component.tsx +++ b/src/tests/test-component.tsx @@ -1,12 +1,35 @@ import { queries, RenderResult } from '@testing-library/react' import userEvent, { UserEvent } from '@testing-library/user-event' +import { act } from 'react' export async function executeComponentTest>( renderComponent: () => T, assertion: (component: T, user: UserEvent) => Promise ) { - const component = renderComponent() const user = userEvent.setup() + const myUser = myUserEvent(user) + const component = await act(async () => renderComponent()) - await assertion(component, user) + await assertion(component, myUser) +} + +const myUserEvent = (user: UserEvent): UserEvent => { + return { + ...user, + click: (element: Element) => { + return act(async () => { + await user.click(element) + }) + }, + upload: (element: HTMLElement, fileOrFiles: File | File[]) => { + return act(async () => { + await user.upload(element, fileOrFiles) + }) + }, + type: (element: Element, text: string) => { + return act(async () => { + await user.type(element, text) + }) + }, + } } diff --git a/src/tests/test-wallet-provider.tsx b/src/tests/test-wallet-provider.tsx index 520a2b353..60ff80101 100644 --- a/src/tests/test-wallet-provider.tsx +++ b/src/tests/test-wallet-provider.tsx @@ -1,5 +1,5 @@ -import { NetworkConfigWithId } from '@/features/network/data/types' -import { WalletId, WalletManager } from '@txnlab/use-wallet' +import { mainnetId, NetworkConfigWithId } from '@/features/network/data/types' +import { WalletManager } from '@txnlab/use-wallet' import { PropsWithChildren, useMemo } from 'react' import { WalletProviderInner } from '@/features/common/components/wallet-provider-inner' @@ -10,13 +10,23 @@ type Props = PropsWithChildren<{ export function TestWalletProvider({ networkConfig, children }: Props) { const walletManager = useMemo(() => { return new WalletManager({ - wallets: [WalletId.MNEMONIC], // Providers are mocked. This is just to satisfy NonEmptyArray. - algod: { - baseServer: networkConfig.algod.server, - port: networkConfig.algod.port, + wallets: [], + networks: { + [networkConfig.id]: { + algod: { + baseServer: networkConfig.algod.server, + port: networkConfig.algod.port, + token: networkConfig.algod.token ?? '', + }, + isTestnet: networkConfig.id !== mainnetId, + }, + }, + defaultNetwork: networkConfig.id, + options: { + resetNetwork: true, }, }) - }, [networkConfig.algod.port, networkConfig.algod.server]) + }, [networkConfig.algod.port, networkConfig.algod.server, networkConfig.algod.token, networkConfig.id]) return {children} } diff --git a/src/tests/testing-library.tsx b/src/tests/testing-library.tsx index 0ae6eeef6..bac9d24f2 100644 --- a/src/tests/testing-library.tsx +++ b/src/tests/testing-library.tsx @@ -27,7 +27,7 @@ const Providers = const routes = evalTemplates([ { template: Urls.Index, - element: children, + element: {children}, }, ]) const router = createMemoryRouter(routes) @@ -35,9 +35,7 @@ const Providers = return ( - - - + ) diff --git a/src/tests/utils/deploy-smart-contract.ts b/src/tests/utils/deploy-smart-contract.ts index 74a5ac37a..788b2d5ff 100644 --- a/src/tests/utils/deploy-smart-contract.ts +++ b/src/tests/utils/deploy-smart-contract.ts @@ -1,18 +1,19 @@ import { Arc56Contract } from '@algorandfoundation/algokit-utils/types/app-arc56' import { AppSpec } from '@algorandfoundation/algokit-utils/types/app-spec' -import { AlgorandFixture } from '@algorandfoundation/algokit-utils/types/testing' import { AppFactoryDeployParams } from '@algorandfoundation/algokit-utils/types/app-factory' +import { TransactionSignerAccount } from '@algorandfoundation/algokit-utils/types/account' +import { AlgorandClient } from '@algorandfoundation/algokit-utils' +import { Account, Address } from 'algosdk' export const deploySmartContract = async ( - localnet: AlgorandFixture, + creator: Address & TransactionSignerAccount & Account, + algorandClient: AlgorandClient, appSpec: string | Arc56Contract | AppSpec, params?: AppFactoryDeployParams ) => { - const { testAccount } = localnet.context - - const appFactory = localnet.algorand.client.getAppFactory({ + const appFactory = algorandClient.client.getAppFactory({ appSpec, - defaultSender: testAccount.addr, + defaultSender: creator.addr, }) const deployResult = await appFactory.deploy(params ?? {}) diff --git a/src/tests/utils/random-bigint.ts b/src/tests/utils/random-bigint.ts new file mode 100644 index 000000000..a974b49c1 --- /dev/null +++ b/src/tests/utils/random-bigint.ts @@ -0,0 +1,5 @@ +import { randomNumber, randomNumberBetween } from '@makerx/ts-dossier' + +export const randomBigInt = () => BigInt(randomNumber()) + +export const randomBigIntBetween = (min: bigint, max: bigint) => BigInt(randomNumberBetween(Number(min), Number(max))) diff --git a/src/tests/utils/select-option.ts b/src/tests/utils/select-option.ts index d8a952db5..857cd28fb 100644 --- a/src/tests/utils/select-option.ts +++ b/src/tests/utils/select-option.ts @@ -1,21 +1,17 @@ import { UserEvent } from '@testing-library/user-event' -import { getByRole, screen, waitFor, within } from '@/tests/testing-library' +import { findByRole, fireEvent, screen, waitFor, within } from '@/tests/testing-library' import { expect } from 'vitest' export const selectOption = async (parentComponent: HTMLElement, user: UserEvent, name: string | RegExp, value: string) => { - const select = await waitFor(() => { - const select = getByRole(parentComponent, 'combobox', { name: name }) - expect(select).toBeDefined() - return select! - }) + const select = await findByRole(parentComponent, 'combobox', { name: name }) await user.click(select) - const option = await waitFor(() => { - return screen.getByRole('option', { name: value }) - }) - await user.click(option) + const option = await screen.findByRole('option', { name: value }) + fireEvent.click(option) await waitFor(() => { expect(within(select).getByText(value)).toBeInTheDocument() }) + + await waitFor(() => expect(select.getAttribute('data-state')).toBe('closed')) } diff --git a/src/tests/utils/set-wallet-address-and-signer.ts b/src/tests/utils/set-wallet-address-and-signer.ts index 17963d134..a018416d4 100644 --- a/src/tests/utils/set-wallet-address-and-signer.ts +++ b/src/tests/utils/set-wallet-address-and-signer.ts @@ -9,8 +9,9 @@ export const setWalletAddressAndSigner = async (localnet: AlgorandFixture) => { vi.mocked(useWallet).mockImplementation(() => { return { ...original.useWallet(), - activeAddress: testAccount.addr, + activeAddress: testAccount.addr.toString(), transactionSigner: testAccount.signer, + isReady: true, } satisfies ReturnType }) } diff --git a/src/utils/as-json.ts b/src/utils/as-json.ts index e43ff1a29..f5ac8420c 100644 --- a/src/utils/as-json.ts +++ b/src/utils/as-json.ts @@ -1 +1,55 @@ -export const asJson = (value: unknown) => JSON.stringify(value, (_, v) => (typeof v === 'bigint' ? v.toString() : v), 2) +import { Address } from 'algosdk' +import { uint8ArrayToBase64 } from './uint8-array-to-base64' + +const toKebabCase = (str: string) => + str.replace(/[A-Z]/g, (letter, index) => (index === 0 ? letter.toLowerCase() : '-' + letter.toLowerCase())) + +export const normaliseAlgoSdkData = (obj: unknown): unknown => { + if (Array.isArray(obj)) { + return obj.map(normaliseAlgoSdkData) + } + + if (obj instanceof Uint8Array) { + return uint8ArrayToBase64(obj) + } + + if (obj instanceof Address) { + return obj.toString() + } + + if (obj != null && typeof obj === 'object') { + return Object.fromEntries(Object.entries(obj).map(([key, value]) => [toKebabCase(key), normaliseAlgoSdkData(value)])) + } + + return obj +} + +const toNumber = (value: number | bigint) => { + if (typeof value === 'number') return value + + if (value > BigInt(Number.MAX_SAFE_INTEGER)) { + throw new Error(`Cannot convert ${value} to a Number as it is larger than the maximum safe integer the Number type can hold.`) + } else if (value < BigInt(Number.MIN_SAFE_INTEGER)) { + throw new Error(`Cannot convert ${value} to a Number as it is smaller than the minimum safe integer the Number type can hold.`) + } + return Number(value) +} + +const defaultJsonValueReplacer = (_key: string, value: unknown) => { + if (typeof value === 'bigint') { + try { + return toNumber(value) + } catch { + return value.toString() + } + } + return value +} + +export const asJson = ( + value: unknown, + replacer: (key: string, value: unknown) => unknown = defaultJsonValueReplacer, + space?: string | number +) => { + return JSON.stringify(value, replacer, space) +} diff --git a/src/utils/expand.ts b/src/utils/expand.ts new file mode 100644 index 000000000..999e2d9d0 --- /dev/null +++ b/src/utils/expand.ts @@ -0,0 +1,5 @@ +export type Expand = T extends (...args: infer A) => infer R + ? (...args: Expand) => Expand + : T extends infer O + ? { [K in keyof O]: O[K] } + : never diff --git a/src/utils/remove-encodable-methods.ts b/src/utils/remove-encodable-methods.ts new file mode 100644 index 000000000..e6bd61073 --- /dev/null +++ b/src/utils/remove-encodable-methods.ts @@ -0,0 +1,27 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { Encodable } from 'algosdk' + +export const removeEncodableMethods = (encodable: T): Omit => { + if (!encodable) { + return encodable + } + + const { getEncodingSchema, toEncodingData, ...rest } = encodable + + // Recursively clean nested objects + const cleaned: Omit = { ...rest } + for (const [key, value] of Object.entries(cleaned)) { + if (value && isEncodable(value)) { + ;(cleaned as any)[key] = removeEncodableMethods(value as T) + } + if (value && Array.isArray(value)) { + ;(cleaned as any)[key] = value.map((item) => (isEncodable(item) ? removeEncodableMethods(item) : item)) + } + } + + return cleaned +} + +const isEncodable = (value: unknown): value is Encodable => { + return typeof value === 'object' && value !== null && 'getEncodingSchema' in value && 'toEncodingData' in value +} diff --git a/src/utils/uint8-array-to-utf8.ts b/src/utils/uint8-array-to-utf8.ts new file mode 100644 index 000000000..1c6671c94 --- /dev/null +++ b/src/utils/uint8-array-to-utf8.ts @@ -0,0 +1,3 @@ +export const uint8ArrayToUtf8 = (uint8Array: Uint8Array) => { + return new TextDecoder().decode(uint8Array) +} diff --git a/src/utils/utf8-to-uint8-array.ts b/src/utils/utf8-to-uint8-array.ts new file mode 100644 index 000000000..b53beaffa --- /dev/null +++ b/src/utils/utf8-to-uint8-array.ts @@ -0,0 +1,3 @@ +export function utf8ToUint8Array(arg: string): Uint8Array { + return Uint8Array.from(Buffer.from(arg, 'utf-8')) +}