diff --git a/.vocs/search-index-0f60f3c2.json b/.vocs/search-index-0f60f3c2.json
new file mode 100644
index 00000000000..152f720365c
--- /dev/null
+++ b/.vocs/search-index-0f60f3c2.json
@@ -0,0 +1 @@
+{"documentCount":479,"nextId":479,"documentIds":{"0":"docs/pages/support.mdx#support","1":"docs/pages/api/marketplace.mdx#marketplace-api","2":"docs/pages/api/metadata.mdx#metadata-api","3":"docs/pages/api/metadata.mdx#obtaining-a-service-account--token","4":"docs/pages/api/metadata.mdx#creating-collections-tokens-and-managing-metadata","5":"docs/pages/api/metadata.mdx#pricing--usage","6":"docs/pages/api/node-gateway.mdx#node-gateway","7":"docs/pages/api/node-gateway.mdx#give-it-a-try","8":"docs/pages/api/relayer.mdx#relayer-api","9":"docs/pages/guides/lootbox.mdx#deploy-an-in-game-collectibles-contract","10":"docs/pages/guides/lootbox.mdx#query-contract-details","11":"docs/pages/guides/lootbox.mdx#fetch-token-balances-of-a-wallet","12":"docs/pages/guides/unity-guide.mdx#integrate-sequencekit-with-waas","13":"docs/pages/guides/unity-guide.mdx#deploy-a-collectibles-contract","14":"docs/pages/guides/unity-guide.mdx#deploy-a-remote-minter","15":"docs/pages/guides/unity-guide.mdx#mint-in-game-achievement-tokens","16":"docs/pages/guides/unity-guide.mdx#burn-in-game-achievement-tokens","17":"docs/pages/guides/unity-guide.mdx#integrate-an-embedded-marketplace","18":"docs/pages/solutions/minter.mdx#mint-tokens-using-builder-manually","19":"docs/pages/solutions/minter.mdx#deploy-a-serverless-minter-on-cloudflare-workers","20":"docs/pages/solutions/nft-checkout.mdx#integrate-nft-checkout-on-web-coming-soon","21":"docs/pages/solutions/onramps.mdx#integrate-onramp-on-web","22":"docs/pages/api/indexer/fetch-tokens.mdx#tokens-api","23":"docs/pages/api/indexer/fetch-tokens.mdx#fetches-list-of-erc20-erc721-and-erc1155-tokens-and-metadata-in-any-wallet","24":"docs/pages/api/indexer/fetch-tokens.mdx#fetch-token-ids-balances-and-metadata-of-erc721-and-erc1155-collections","25":"docs/pages/api/indexer/installation.mdx#indexer-installation","26":"docs/pages/api/indexer/installation.mdx#installation","27":"docs/pages/api/indexer/installation.mdx#web--nodejs-installation","28":"docs/pages/api/indexer/installation.mdx#go-installation","29":"docs/pages/api/indexer/installation.mdx#unity-or-unreal-installation","30":"docs/pages/api/indexer/metadata-tips.mdx#metadata-tips--notes-on-spam","31":"docs/pages/api/indexer/native-network-balance.mdx#native-network-balances-ie-eth-matic-etc","32":"docs/pages/api/indexer/native-network-balance.mdx#fetch-native-network-balance-aka-eth-on-ethereum-matic-on-polygon-avax-on-avalanche-bnb-on-bsc-etc","33":"docs/pages/api/indexer/overview.mdx#indexer","34":"docs/pages/api/indexer/overview.mdx#supported-networks--endpoints","35":"docs/pages/api/indexer/overview.mdx#getting-started","36":"docs/pages/api/indexer/transaction-history.mdx#wallet-transaction-history","37":"docs/pages/api/indexer/transaction-history.mdx#fetch-the-transaction-history-for-any-wallet-address","38":"docs/pages/api/indexer/transation-history-token-contract.mdx#contract-token-history","39":"docs/pages/api/indexer/transation-history-token-contract.mdx#fetch--listen-to-the-transaction-history-for-any-erc20-erc721-erc1155-contract","40":"docs/pages/api/indexer/unique-tokens.mdx#tokens-in-a-contract","41":"docs/pages/api/indexer/unique-tokens.mdx#fetch-all-unique-tokens-in-a-particular-erc207211155-contract-including-total-supplies","42":"docs/pages/api/metadata/contract-metadata.mdx#contract-metadata","43":"docs/pages/api/metadata/contract-metadata.mdx#fetch-contract-metadata-of-any-erc20-erc721-or-erc1155-contract-address","44":"docs/pages/api/metadata/contract-metadata.mdx#contract-level-metadata-standards","45":"docs/pages/api/metadata/overview.mdx#metadata","46":"docs/pages/api/metadata/overview.mdx#web--nodejs-installation","47":"docs/pages/api/metadata/overview.mdx#go-installation","48":"docs/pages/api/metadata/overview.mdx#unity-or-unreal-installation","49":"docs/pages/api/metadata/rest-api.mdx#metadata-rest-api-reference--usage","50":"docs/pages/api/metadata/rest-api.mdx#example","51":"docs/pages/api/metadata/rest-api.mdx#usage","52":"docs/pages/api/metadata/rest-api.mdx#rest-endpoints","53":"docs/pages/api/metadata/rest-api.mdx#rpc-client","54":"docs/pages/api/metadata/rest-api.mdx#metadata-rpc-methods","55":"docs/pages/api/metadata/token-metadata.mdx#token-metadata","56":"docs/pages/api/metadata/token-metadata.mdx#fetch-token-metadata-for-any-erc721-or-erc1155-contract","57":"docs/pages/api/metadata/token-metadata.mdx#refreshing-token-metadata","58":"docs/pages/api/metadata/token-metadata.mdx#testing-instructions","59":"docs/pages/api/metadata/token-metadata.mdx#token-metadata-standards","60":"docs/pages/api/metadata/token-metadata.mdx#metadata-standards","61":"docs/pages/api/metadata/token-metadata.mdx#erc721","62":"docs/pages/api/metadata/token-metadata.mdx#erc1155","63":"docs/pages/api/metadata/token-metadata.mdx#attributes-vs-properties","64":"docs/pages/api/metadata/token-metadata.mdx#erc20","65":"docs/pages/guides/templates/02-building-relaying-server.mdx#building-a-relaying-server","66":"docs/pages/guides/templates/02-building-relaying-server.mdx#nodejs-server","67":"docs/pages/guides/templates/02-building-relaying-server.mdx#nodejs-server-with-gas-sponsoring-using-sequence-builder","68":"docs/pages/guides/templates/02-building-relaying-server.mdx#a-create-dapp","69":"docs/pages/guides/templates/02-building-relaying-server.mdx#b-new-dapp","70":"docs/pages/guides/templates/02-building-relaying-server.mdx#c1-gas-tank","71":"docs/pages/guides/templates/02-building-relaying-server.mdx#c2-add-gas","72":"docs/pages/guides/templates/02-building-relaying-server.mdx#c3-add-sponsored-address","73":"docs/pages/guides/templates/02-building-relaying-server.mdx#parallel-transactions","74":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#mint-collectibles-using-a-gasless-serverless-relayer","75":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#1-setup-cloudflare-environment-with-wrangler-cli-and-deploy-a-test","76":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#deploy-test","77":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#2-deploy-sponsor-and-update-metadata-for-an-erc1155-contract-with-builder","78":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#update-metadata","79":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#contract-sponsoring","80":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#3-use-ethauthproof-to-prevent-eoa-ddos","81":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#add-cloudflare-environment-variables","82":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#implement-window-object-in-wrangler-template","83":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#testing-the-deploy","84":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#using-the-ethauthproof-viewer-dapp","85":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#4-mint-a-collectible-to-wallet","86":"docs/pages/guides/templates/template-embedded-wallet.mdx#quickstart","87":"docs/pages/guides/templates/template-embedded-wallet.mdx#try-a-demo","88":"docs/pages/guides/templates/template-embedded-wallet.mdx#template","89":"docs/pages/guides/templates/template-embedded-wallet.mdx#getting-started","90":"docs/pages/guides/templates/template-embedded-wallet.mdx#sdk-installation","91":"docs/pages/guides/templates/template-embedded-wallet.mdx#project-setup","92":"docs/pages/guides/templates/template-embedded-wallet.mdx#library-setup","93":"docs/pages/sdk/go/overview.mdx#go","94":"docs/pages/sdk/go/overview.mdx#ethkit","95":"docs/pages/sdk/sequence-kit/01-overview.mdx#sequencekit-sdk","96":"docs/pages/sdk/sequence-kit/01-overview.mdx#key-features","97":"docs/pages/sdk/sequence-kit/01-overview.mdx#next-steps","98":"docs/pages/sdk/sequence-kit/02-getting-started.mdx#getting-started-with-sequence-kit","99":"docs/pages/sdk/sequence-kit/02-getting-started.mdx#installing-sequence-kit-packages","100":"docs/pages/sdk/sequence-kit/02-getting-started.mdx#setting-up-the-kit-wrapper","101":"docs/pages/sdk/sequence-kit/02-getting-started.mdx#setting-up-the-embedded-wallet-wrapper","102":"docs/pages/sdk/sequence-kit/02-getting-started.mdx#triggering-the-connect-modal","103":"docs/pages/sdk/sequence-kit/02-getting-started.mdx#invoking-the-embedded-wallet-modal","104":"docs/pages/sdk/sequence-kit/02-getting-started.mdx#react-example","105":"docs/pages/sdk/sequence-kit/03-configuration.mdx#configuration-options","106":"docs/pages/sdk/sequence-kit/03-configuration.mdx#available-options","107":"docs/pages/sdk/sequence-kit/03-configuration.mdx#defaulttheme","108":"docs/pages/sdk/sequence-kit/03-configuration.mdx#position","109":"docs/pages/sdk/sequence-kit/03-configuration.mdx#sign-in-modal-configuration-signin","110":"docs/pages/sdk/sequence-kit/03-configuration.mdx#signinlogourl","111":"docs/pages/sdk/sequence-kit/03-configuration.mdx#signinprojectname","112":"docs/pages/sdk/sequence-kit/03-configuration.mdx#signinshowemailinput","113":"docs/pages/sdk/sequence-kit/03-configuration.mdx#signinsocialauthoptions","114":"docs/pages/sdk/sequence-kit/03-configuration.mdx#signinwalletauthoptions","115":"docs/pages/sdk/sequence-kit/03-configuration.mdx#displayedassets","116":"docs/pages/sdk/sequence-kit/04-checkout.mdx#overview","117":"docs/pages/sdk/sequence-kit/04-checkout.mdx#integration","118":"docs/pages/sdk/sequence-kit/04-checkout.mdx#opening-the-checkout-modal","119":"docs/pages/sdk/sequence-kit/04-checkout.mdx#configuring-the-checkout-modal","120":"docs/pages/sdk/sequence-kit/04-checkout.mdx#crypto-checkout-configuration-cryptocheckout","121":"docs/pages/sdk/sequence-kit/04-checkout.mdx#order-summary-configuration-ordersummaryitems","122":"docs/pages/sdk/sequence-kit/05-custom-connectors.mdx#custom-connectors-in-sequence-kit","123":"docs/pages/sdk/sequence-kit/05-custom-connectors.mdx#creating-a-custom-connector","124":"docs/pages/sdk/sequence-kit/05-custom-connectors.mdx#using-custom-connectors","125":"docs/pages/sdk/sequence-kit/05-custom-connectors.mdx#share-your-custom-connectors","126":"docs/pages/sdk/unity/01-overview.mdx#introduction","127":"docs/pages/sdk/unity/01-overview.mdx#requirements","128":"docs/pages/sdk/unity/02-installation.mdx#installation","129":"docs/pages/sdk/unity/02-installation.mdx#package-manager---recommended","130":"docs/pages/sdk/unity/02-installation.mdx#samples","131":"docs/pages/sdk/unity/02-installation.mdx#manual","132":"docs/pages/sdk/unity/03-setup.mdx#setup","133":"docs/pages/sdk/unity/04-authentication.mdx#authentication","134":"docs/pages/sdk/unity/04-authentication.mdx#1-email-sign-in","135":"docs/pages/sdk/unity/04-authentication.mdx#2-social-sign-in","136":"docs/pages/sdk/unity/04-authentication.mdx#ios","137":"docs/pages/sdk/unity/04-authentication.mdx#macos","138":"docs/pages/sdk/unity/04-authentication.mdx#pc","139":"docs/pages/sdk/unity/04-authentication.mdx#android","140":"docs/pages/sdk/unity/04-authentication.mdx#webgl","141":"docs/pages/sdk/unity/04-authentication.mdx#connecting-with-waas","142":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#write-to-blockchain","143":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#rawtransaction","144":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#senderc20","145":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#complex-erc20-interactions","146":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#senderc721","147":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#complex-erc721-interactions","148":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#senderc1155","149":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#complex-erc1155-interactions","150":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#delayedencode","151":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#batch-transactions","152":"docs/pages/sdk/unity/06-read-from-blockchain.mdx#read-from-blockchain","153":"docs/pages/sdk/unity/07-sign-messages.mdx#sign-messages","154":"docs/pages/sdk/unity/08-deploy-contracts.mdx#contract-deployment","155":"docs/pages/sdk/unity/09-wallet-ui.mdx#wallet-ui","156":"docs/pages/sdk/unity/09-wallet-ui.mdx#how-it-works","157":"docs/pages/sdk/unity/09-wallet-ui.mdx#ui-customizability","158":"docs/pages/sdk/unity/09-wallet-ui.mdx#color-scheme-manager","159":"docs/pages/sdk/unity/09-wallet-ui.mdx#more-customization-tools-coming-soon","160":"docs/pages/sdk/unreal/01-overview.mdx#introduction","161":"docs/pages/sdk/unreal/01-overview.mdx#requirements","162":"docs/pages/sdk/unreal/02-installation.mdx#installation","163":"docs/pages/sdk/unreal/02-installation.mdx#credentials","164":"docs/pages/sdk/unreal/02-installation.mdx#security","165":"docs/pages/sdk/unreal/03-setup.mdx#setup","166":"docs/pages/sdk/unreal/04-authentication.mdx#authentication","167":"docs/pages/sdk/unreal/04-authentication.mdx#custom-ui-integration","168":"docs/pages/sdk/unreal/04-authentication.mdx#email-based-authentication","169":"docs/pages/sdk/unreal/04-authentication.mdx#social-signin-based-authentication-on-desktop","170":"docs/pages/sdk/unreal/04-authentication.mdx#social-signin-based-authentication-on-mobile","171":"docs/pages/sdk/unreal/05-api-integration.mdx#api-integration","172":"docs/pages/sdk/unreal/05-api-integration.mdx#sequence-api","173":"docs/pages/sdk/unreal/05-api-integration.mdx#sequence-unreal-api","174":"docs/pages/sdk/unreal/05-api-integration.mdx#usequencewallet","175":"docs/pages/sdk/unreal/05-api-integration.mdx#sequence-api-methods","176":"docs/pages/sdk/unreal/06-packaging.mdx#packaging","177":"docs/pages/sdk/unreal/06-packaging.mdx#google-sso-setup","178":"docs/pages/sdk/unreal/06-packaging.mdx#ios","179":"docs/pages/sdk/unreal/06-packaging.mdx#unreal-and-xcode-specifics","180":"docs/pages/solutions/builder/analytics.mdx#analytics-in-builder","181":"docs/pages/solutions/builder/analytics.mdx#how-it-works","182":"docs/pages/solutions/builder/analytics.mdx#overview","183":"docs/pages/solutions/builder/analytics.mdx#wallets-connected","184":"docs/pages/solutions/builder/analytics.mdx#marketplace-transactions","185":"docs/pages/solutions/builder/analytics.mdx#transaction-requests","186":"docs/pages/solutions/marketplaces/overview.mdx#marketplaces-overview","187":"docs/pages/solutions/marketplaces/overview.mdx#what-are-the-differences-between-these-options","188":"docs/pages/solutions/marketplaces/overview.mdx#getting-started","189":"docs/pages/solutions/wallets/overview.mdx#sequence-wallets-overview","190":"docs/pages/solutions/wallets/overview.mdx#what-are-the-differences-between-these-options","191":"docs/pages/solutions/wallets/overview.mdx#what-are-the-benefits-of-each-and-how-can-i-leverage-them","192":"docs/pages/solutions/wallets/overview.mdx#getting-started","193":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#connect-wallet","194":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#connecting-your-dapp-with-0xsequence","195":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#wallet-login-and-connect-options","196":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#app","197":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#appprotocol","198":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#origin","199":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#expiry","200":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#authorize","201":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#authorizenonce","202":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#refresh","203":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#keepwalletopened","204":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#askforemail","205":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingstheme","206":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingsbannerurl","207":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingssigninwith","208":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingssigninwithemail","209":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingssigninoptions","210":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingsincludedpaymentproviders","211":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingsdefaultfundingcurrency","212":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingsdefaultpurchaseamount","213":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingslockfundingcurrencytodefault","214":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#connecting-your-dapp-with-web3js-or-ethersjs","215":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#connecting-to-any-ethereum-dapp-with-the-sequence-wallet-chrome-extension","216":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#connecting-via-walletconnect","217":"docs/pages/sdk/typescript/03-guides/02-auth-address.mdx#authenticate-users-with-message-signature","218":"docs/pages/sdk/typescript/03-guides/02-auth-address.mdx#ask-for-the-wallet-address","219":"docs/pages/sdk/typescript/03-guides/02-auth-address.mdx#authenticate-wallet","220":"docs/pages/sdk/typescript/03-guides/02-auth-address.mdx#authenticate-wallet-server-side","221":"docs/pages/sdk/typescript/03-guides/03-sign-message.mdx#todo---replace-with-code-groups-from-vocs","222":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#no-wallet-confirmation-signatures","223":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#session-keys","224":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#using-session-keys-with-sequence","225":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#1-initialize-sequence-wallet-and-connect","226":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#2-generate-a-session-key","227":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#3-sign-authorization-message","228":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#4-verify-authorization-signature","229":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#5-sign-message-with-session-key","230":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#6-verify-session-signature","231":"docs/pages/sdk/typescript/03-guides/05-send-transaction.mdx#sending-transactions","232":"docs/pages/sdk/typescript/03-guides/06-send-erc20.mdx#sending-erc-20-tokens","233":"docs/pages/sdk/typescript/03-guides/07-send-erc721.mdx#sending-erc-721-nft-tokens","234":"docs/pages/sdk/typescript/03-guides/08-send-erc1155.mdx#sending-erc-1155-collectible-tokens","235":"docs/pages/sdk/typescript/03-guides/09-send-batch-transactions.mdx#sending-a-batch-of-transactions","236":"docs/pages/sdk/typescript/03-guides/10-building-backends.mdx#building-backends-with-sequence","237":"docs/pages/sdk/typescript/03-guides/10-building-backends.mdx#nodejs","238":"docs/pages/sdk/typescript/03-guides/10-building-backends.mdx#go","239":"docs/pages/sdk/typescript/03-guides/10-building-backends.mdx#ethkit","240":"docs/pages/sdk/typescript/03-guides/10-building-backends.mdx#support-for-other-backend-languages","241":"docs/pages/sdk/typescript/03-guides/overview.mdx#install","242":"docs/pages/sdk/typescript/03-guides/overview.mdx#cdn-distribution-as-native-js","243":"docs/pages/sdk/typescript/connectors/01-overview.mdx#wallet-connectors","244":"docs/pages/sdk/typescript/connectors/02-sequence-kit.mdx#sequence-kit-seamlessly-integrate-web3-wallets-into-your-applications","245":"docs/pages/sdk/typescript/connectors/02-sequence-kit.mdx#key-features","246":"docs/pages/sdk/typescript/connectors/02-sequence-kit.mdx#next-steps","247":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#using-wagmi","248":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#installation","249":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#usage","250":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#parameters","251":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#chains","252":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#optionsconnect-optional","253":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#optionsdefaultnetwork-optional","254":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#using-older-versions-of-wagmi--012x","255":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#using-nextjs","256":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#examples","257":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#using-rainbowkit","258":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#installation","259":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#usage","260":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#parameters","261":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#chains","262":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#connect-optional","263":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#defaultnetwork-optional","264":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#using-nextjs","265":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#using-older-versions-of-wagmi--012x","266":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#examples","267":"docs/pages/sdk/typescript/connectors/05-web3-onboard.mdx#using-web3-onboard","268":"docs/pages/sdk/typescript/connectors/05-web3-onboard.mdx#installation","269":"docs/pages/sdk/typescript/connectors/05-web3-onboard.mdx#usage","270":"docs/pages/sdk/typescript/connectors/05-web3-onboard.mdx#parameters","271":"docs/pages/sdk/typescript/connectors/05-web3-onboard.mdx#network-optional","272":"docs/pages/sdk/typescript/connectors/05-web3-onboard.mdx#appname-optional","273":"docs/pages/sdk/typescript/connectors/05-web3-onboard.mdx#example","274":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#using-web3-react-v6","275":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#installation","276":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#usage","277":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#initialization","278":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#activationdeactivation","279":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#options","280":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#chainid","281":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#appname-optional","282":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#example","283":"docs/pages/sdk/typescript/connectors/07-web3modal.mdx#using-web3modal","284":"docs/pages/sdk/typescript/connectors/07-web3modal.mdx#usage","285":"docs/pages/sdk/typescript/connectors/07-web3modal.mdx#example","286":"docs/pages/sdk/typescript/connectors/08-FAQ.mdx#nextjs","287":"docs/pages/sdk/typescript/connectors/08-FAQ.mdx#why-does-my-wallet-integration-produce-an-error-when-used-with-nextjs","288":"docs/pages/sdk/typescript/connectors/08-FAQ.mdx#how-do-i-use-a-wallet-library-and-connector-with-nextjs-using-the-pages-directory-all-versions-of-nextjs","289":"docs/pages/sdk/typescript/connectors/08-FAQ.mdx#how-do-i-use-a-wallet-library-and-connector-with-nextjs-using-the-app-directory-version-13-and-above-only","290":"docs/pages/sdk/unity/Advanced/01-introduction.mdx#advanced---introduction","291":"docs/pages/sdk/unity/Advanced/01-introduction.mdx#important-components","292":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#wallets","293":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#1-ethwallet","294":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#2-waastowalletadapter","295":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#methods","296":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#getaddress","297":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#sendtransaction","298":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#sendtransactionandwaitforreceipt","299":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#sendtransactionbatch","300":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#sendtransactionbatchandwaitforreceipts","301":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#signmessage","302":"docs/pages/sdk/unity/Advanced/03-clients.mdx#clients","303":"docs/pages/sdk/unity/Advanced/03-clients.mdx#methods","304":"docs/pages/sdk/unity/Advanced/03-clients.mdx#balanceat","305":"docs/pages/sdk/unity/Advanced/03-clients.mdx#blockbynumber","306":"docs/pages/sdk/unity/Advanced/03-clients.mdx#blockbyhash","307":"docs/pages/sdk/unity/Advanced/03-clients.mdx#blocknumber","308":"docs/pages/sdk/unity/Advanced/03-clients.mdx#blockrange","309":"docs/pages/sdk/unity/Advanced/03-clients.mdx#chainid","310":"docs/pages/sdk/unity/Advanced/03-clients.mdx#codeat","311":"docs/pages/sdk/unity/Advanced/03-clients.mdx#estimategas","312":"docs/pages/sdk/unity/Advanced/03-clients.mdx#feehistory","313":"docs/pages/sdk/unity/Advanced/03-clients.mdx#networkid","314":"docs/pages/sdk/unity/Advanced/03-clients.mdx#nonceat","315":"docs/pages/sdk/unity/Advanced/03-clients.mdx#sendrawtransaction","316":"docs/pages/sdk/unity/Advanced/03-clients.mdx#suggestgasprice","317":"docs/pages/sdk/unity/Advanced/03-clients.mdx#suggestgastipcap","318":"docs/pages/sdk/unity/Advanced/03-clients.mdx#transactionbyhash","319":"docs/pages/sdk/unity/Advanced/03-clients.mdx#transactioncount","320":"docs/pages/sdk/unity/Advanced/03-clients.mdx#waitfortransactionreceipt","321":"docs/pages/sdk/unity/Advanced/04-transfers.mdx#transfers","322":"docs/pages/sdk/unity/Advanced/05-contracts.mdx#contracts","323":"docs/pages/sdk/unity/Advanced/05-contracts.mdx#calling-smart-contract-functions","324":"docs/pages/sdk/unity/Advanced/05-contracts.mdx#understanding-data-type-mappings","325":"docs/pages/sdk/unity/Advanced/05-contracts.mdx#querying-contracts","326":"docs/pages/sdk/unity/Advanced/05-contracts.mdx#deploying-contracts","327":"docs/pages/sdk/unity/Advanced/06-tokens.mdx#tokens","328":"docs/pages/sdk/unity/Advanced/06-tokens.mdx#bonus-ownable","329":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#how-to-manage-item-metadata-in-sequence-builder","330":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#introduction","331":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-1-prepare-your-token-images-and-metadata","332":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-2-set-up-on-pinatacloud","333":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-3-upload-your-metadata-files","334":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-4-get-the-folder-url","335":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-5-set-up-on-sequence-builder","336":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-6-deploy-your-contract","337":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-7-move-to-contract-details","338":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-8-update-contract-attributes","339":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-9-set-the-base-metadata-uri","340":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-10-minting-time","341":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-11-finalize-and-admire","342":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-12-updating-metadata","343":"docs/pages/solutions/marketplaces/orderbook/02-quickstart.mdx#quickstart","344":"docs/pages/solutions/marketplaces/orderbook/02-quickstart.mdx#try-a-demo","345":"docs/pages/solutions/marketplaces/orderbook/02-quickstart.mdx#template","346":"docs/pages/solutions/marketplaces/orderbook/02-quickstart.mdx#try-an-api-call","347":"docs/pages/solutions/payments/onramps/01-fiat-on-ramps.mdx#fiat-on-ramps","348":"docs/pages/solutions/technical-references/wallet-contracts/01-why.mdx#why-smart-contracts-wallets","349":"docs/pages/solutions/technical-references/wallet-contracts/01-why.mdx#externally-owned-accounts","350":"docs/pages/solutions/technical-references/wallet-contracts/01-why.mdx#pros","351":"docs/pages/solutions/technical-references/wallet-contracts/01-why.mdx#popular-examples","352":"docs/pages/solutions/technical-references/wallet-contracts/01-why.mdx#smart-contract-wallets","353":"docs/pages/solutions/technical-references/wallet-contracts/01-why.mdx#pros-1","354":"docs/pages/solutions/technical-references/wallet-contracts/01-why.mdx#examples","355":"docs/pages/solutions/wallets/embedded-wallet/01-overview.mdx#sequence-embedded-wallet","356":"docs/pages/solutions/wallets/embedded-wallet/01-overview.mdx#architecture-overview","357":"docs/pages/solutions/wallets/embedded-wallet/01-overview.mdx#signer-1-sequence-auth","358":"docs/pages/solutions/wallets/embedded-wallet/01-overview.mdx#signer-2-sequence-guard","359":"docs/pages/solutions/wallets/embedded-wallet/01-overview.mdx#threat-model","360":"docs/pages/solutions/wallets/embedded-wallet/02-quickstart.mdx#quickstart","361":"docs/pages/solutions/wallets/embedded-wallet/02-quickstart.mdx#try-a-demo","362":"docs/pages/solutions/wallets/embedded-wallet/02-quickstart.mdx#template","363":"docs/pages/solutions/wallets/embedded-wallet/02-quickstart.mdx#getting-started","364":"docs/pages/solutions/wallets/embedded-wallet/02-quickstart.mdx#sdk-installation","365":"docs/pages/solutions/wallets/embedded-wallet/02-quickstart.mdx#project-setup","366":"docs/pages/solutions/wallets/embedded-wallet/02-quickstart.mdx#library-setup","367":"docs/pages/solutions/wallets/universal-wallet/02-quickstart.mdx#quickstart","368":"docs/pages/solutions/wallets/universal-wallet/02-quickstart.mdx#try-a-demo","369":"docs/pages/solutions/wallets/universal-wallet/02-quickstart.mdx#template","370":"docs/pages/solutions/wallets/universal-wallet/02-quickstart.mdx#install","371":"docs/pages/solutions/wallets/universal-wallet/02-quickstart.mdx#cdn-distribution-as-native-js","372":"docs/pages/solutions/wallets/universal-wallet/04-sequence-kit.mdx#sequence-kit-seamlessly-integrate-web3-wallets-into-your-applications","373":"docs/pages/solutions/wallets/universal-wallet/04-sequence-kit.mdx#key-features","374":"docs/pages/solutions/wallets/universal-wallet/04-sequence-kit.mdx#next-steps","375":"docs/pages/solutions/wallets/universal-wallet/05-platforms.mdx#platforms","376":"docs/pages/solutions/wallets/universal-wallet/05-platforms.mdx#web-wallet","377":"docs/pages/solutions/wallets/universal-wallet/05-platforms.mdx#mobile-wallet","378":"docs/pages/solutions/wallets/universal-wallet/05-platforms.mdx#browser-extension-wallet","379":"docs/pages/solutions/wallets/universal-wallet/06-fiat-on-ramps.mdx#fiat-on-ramps","380":"docs/pages/solutions/wallets/universal-wallet/07-key-management.mdx#key-management","381":"docs/pages/solutions/wallets/universal-wallet/07-key-management.mdx#social-login-wallets","382":"docs/pages/solutions/wallets/universal-wallet/07-key-management.mdx#session-keys","383":"docs/pages/solutions/wallets/universal-wallet/07-key-management.mdx#guard-key","384":"docs/pages/solutions/wallets/universal-wallet/07-key-management.mdx#torus-key","385":"docs/pages/solutions/marketplaces/orderbook/examples/05-get-user-activities.mdx#getuseractivities","386":"docs/pages/solutions/marketplaces/orderbook/examples/05-get-user-activities.mdx#example-implementation","387":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#wallet-configuration","388":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#configuration-layout","389":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#signer-layout","390":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#example","391":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#the-valid-combinations-of-signers-are","392":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#configuration-hash---imagehash","393":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#compute-image-hash","394":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#initial-wallet-configuration","395":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#compute-wallet-address","396":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#modules--wallet-update","397":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#wallet-implementation","398":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#_updateconfiguration","399":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#parameters","400":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#reading-current-implementation","401":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#wallet-configuration-validation","402":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#_isvalidimage","403":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#parameters-1","404":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#return-values","405":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#mainmoduleupgradeable","406":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#updateimagehash","407":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#parameters-2","408":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#first-configuration-update","409":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#delegatecall-false","410":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#revertonerror-true","411":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#to-wallet","412":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#value-ethersconstantszero","413":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#gaslimit-ethersconstantszero","414":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#subsequent-configuration-updates","415":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#retrieving-the-current-configuration","416":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#retrieving-the-wallet-configuration","417":"docs/pages/solutions/technical-references/internals/v1/06-main-module-upgradeable.mdx#mainmoduleupgradeable--configuration-migration","418":"docs/pages/solutions/technical-references/internals/v1/08-signature-encoding.mdx#signature-encoding","419":"docs/pages/solutions/technical-references/internals/v1/08-signature-encoding.mdx#erc-191-ethereum-signed-data","420":"docs/pages/solutions/technical-references/internals/v1/08-signature-encoding.mdx#erc-712-structured-data-signatures","421":"docs/pages/solutions/technical-references/internals/v1/08-signature-encoding.mdx#verification","422":"docs/pages/solutions/technical-references/internals/v1/09-nested-transaction-batching.mdx#nested-transaction-batching","423":"docs/pages/solutions/technical-references/internals/v1/10-guest-module.mdx#guestmodule-and-on-demand-deployment","424":"docs/pages/solutions/technical-references/internals/v1/11-wallet-context.mdx#wallet-context","425":"docs/pages/solutions/technical-references/internals/v1/12-contract-audits.mdx#contract-audits","426":"docs/pages/solutions/technical-references/internals/v1/12-contract-audits.mdx#quantstamp","427":"docs/pages/solutions/technical-references/internals/v1/12-contract-audits.mdx#consensys-diligence","428":"docs/pages/solutions/technical-references/internals/v1/12-contract-audits.mdx#zellic","429":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#wallet-configuration","430":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#top-level-properties","431":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#threshold","432":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#checkpoint","433":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#tree","434":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#signer","435":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#subdigest","436":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#subtree-nested-configuration","437":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#imagehash","438":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#initial-configuration","439":"docs/pages/solutions/wallets/embedded-wallet/examples/03-manage-sessions.mdx#session-management","440":"docs/pages/solutions/wallets/embedded-wallet/examples/03-manage-sessions.mdx#sign-in--sign-up","441":"docs/pages/solutions/wallets/embedded-wallet/examples/03-manage-sessions.mdx#email-sign-in--sign-up","442":"docs/pages/solutions/wallets/embedded-wallet/examples/03-manage-sessions.mdx#google--apple-auth","443":"docs/pages/solutions/wallets/embedded-wallet/examples/03-manage-sessions.mdx#list-sessions","444":"docs/pages/solutions/wallets/embedded-wallet/examples/03-manage-sessions.mdx#close-session","445":"docs/pages/solutions/wallets/embedded-wallet/examples/05-validation.mdx#validation","446":"docs/pages/solutions/wallets/embedded-wallet/examples/05-validation.mdx#email-login-one-time-code","447":"docs/pages/solutions/wallets/embedded-wallet/examples/05-validation.mdx#social-login","448":"docs/pages/solutions/wallets/embedded-wallet/examples/05-validation.mdx#validation-status","449":"docs/pages/solutions/wallets/embedded-wallet/examples/05-validation.mdx#trigger-session-validation","450":"docs/pages/solutions/wallets/embedded-wallet/examples/05-validation.mdx#onvalidationrequired-callback","451":"docs/pages/solutions/wallets/embedded-wallet/examples/05-validation.mdx#listen-for-session-validations","452":"docs/pages/solutions/wallets/embedded-wallet/examples/05-validation.mdx#automatic-session-validation","453":"docs/pages/solutions/wallets/embedded-wallet/examples/06-transaction-receipts.mdx#transaction-receipts","454":"docs/pages/solutions/wallets/embedded-wallet/examples/06-transaction-receipts.mdx#successful-transaction-response","455":"docs/pages/solutions/wallets/embedded-wallet/examples/06-transaction-receipts.mdx#failed-transaction-response","456":"docs/pages/solutions/wallets/universal-wallet/examples/02-auth-address.mdx#authenticate-users-with-message-signature","457":"docs/pages/solutions/wallets/universal-wallet/examples/02-auth-address.mdx#ask-for-the-wallet-address","458":"docs/pages/solutions/wallets/universal-wallet/examples/02-auth-address.mdx#authenticate-wallet","459":"docs/pages/solutions/wallets/universal-wallet/examples/02-auth-address.mdx#authenticate-wallet-server-side","460":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#no-wallet-confirmation-signatures","461":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#session-keys","462":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#using-session-keys-with-sequence","463":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#1-initialize-sequence-wallet-and-connect","464":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#2-generate-a-session-key","465":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#3-sign-authorization-message","466":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#4-verify-authorization-signature","467":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#5-sign-message-with-session-key","468":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#6-verify-session-signature","469":"docs/pages/solutions/wallets/universal-wallet/examples/05-send-transaction.mdx#sending-transactions","470":"docs/pages/solutions/wallets/universal-wallet/examples/06-send-erc20.mdx#sending-erc-20-tokens","471":"docs/pages/solutions/wallets/universal-wallet/examples/07-send-erc721.mdx#sending-erc-721-nft-tokens","472":"docs/pages/solutions/wallets/universal-wallet/examples/08-send-erc1155.mdx#sending-erc-1155-collectible-tokens","473":"docs/pages/solutions/wallets/universal-wallet/examples/09-send-batch-transactions.mdx#sending-a-batch-of-transactions","474":"docs/pages/solutions/wallets/universal-wallet/examples/10-building-backends.mdx#building-backends-with-sequence","475":"docs/pages/solutions/wallets/universal-wallet/examples/10-building-backends.mdx#nodejs","476":"docs/pages/solutions/wallets/universal-wallet/examples/10-building-backends.mdx#go","477":"docs/pages/solutions/wallets/universal-wallet/examples/10-building-backends.mdx#ethkit","478":"docs/pages/solutions/wallets/universal-wallet/examples/10-building-backends.mdx#support-for-other-backend-languages"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,58],"1":[2,1,39],"2":[2,1,48],"3":[6,2,100],"4":[6,2,147],"5":[3,2,22],"6":[2,1,46],"7":[4,2,76],"8":[2,1,114],"9":[6,1,1],"10":[3,1,1],"11":[6,1,41],"12":[4,1,1],"13":[4,1,1],"14":[4,1,1],"15":[5,1,1],"16":[5,1,1],"17":[4,1,1],"18":[5,1,1],"19":[7,1,1],"20":[8,1,1],"21":[4,1,1],"22":[2,1,29],"23":[13,3,179],"24":[11,3,142],"25":[2,1,56],"26":[1,2,105],"27":[4,2,69],"28":[2,2,63],"29":[4,2,15],"30":[6,1,144],"31":[8,1,29],"32":[16,8,101],"33":[1,1,129],"34":[4,1,11],"35":[2,1,47],"36":[3,1,29],"37":[8,3,160],"38":[3,1,29],"39":[13,4,130],"40":[4,1,29],"41":[14,5,158],"42":[2,1,37],"43":[10,2,115],"44":[4,2,14],"45":[1,1,35],"46":[4,2,41],"47":[2,2,28],"48":[4,2,15],"49":[6,1,81],"50":[1,6,176],"51":[1,6,35],"52":[2,6,45],"53":[2,6,49],"54":[3,6,31],"55":[2,1,44],"56":[9,2,111],"57":[3,2,142],"58":[3,5,19],"59":[3,2,57],"60":[2,2,1],"61":[1,3,164],"62":[1,3,144],"63":[3,3,82],"64":[1,3,55],"65":[4,1,37],"66":[2,4,226],"67":[8,4,62],"68":[3,11,1],"69":[3,11,1],"70":[4,11,1],"71":[4,11,1],"72":[5,11,131],"73":[2,4,121],"74":[7,1,114],"75":[11,7,123],"76":[2,18,37],"77":[12,7,171],"78":[2,20,25],"79":[2,20,12],"80":[7,7,212],"81":[4,15,47],"82":[6,15,39],"83":[3,15,67],"84":[5,15,94],"85":[6,7,175],"86":[1,1,1],"87":[3,1,11],"88":[1,1,11],"89":[2,1,1],"90":[2,3,32],"91":[2,3,41],"92":[2,3,62],"93":[1,1,33],"94":[1,1,36],"95":[2,1,40],"96":[2,2,78],"97":[2,1,33],"98":[5,1,23],"99":[4,5,48],"100":[5,1,83],"101":[6,1,72],"102":[4,1,46],"103":[5,1,26],"104":[2,1,18],"105":[2,1,38],"106":[2,1,1],"107":[1,2,40],"108":[1,2,22],"109":[6,2,12],"110":[2,8,12],"111":[2,8,12],"112":[2,8,14],"113":[2,8,48],"114":[2,8,48],"115":[1,2,39],"116":[1,1,11],"117":[1,1,46],"118":[4,1,30],"119":[4,1,12],"120":[5,5,39],"121":[5,5,22],"122":[5,1,30],"123":[4,5,89],"124":[3,1,85],"125":[4,1,34],"126":[1,1,67],"127":[1,1,48],"128":[1,1,1],"129":[3,1,95],"130":[1,4,145],"131":[1,1,137],"132":[1,1,102],"133":[1,1,112],"134":[4,1,46],"135":[4,1,70],"136":[1,5,41],"137":[1,5,43],"138":[1,5,5],"139":[1,5,155],"140":[1,5,3],"141":[3,1,91],"142":[3,1,104],"143":[1,3,103],"144":[1,3,87],"145":[3,4,94],"146":[1,3,53],"147":[3,4,92],"148":[1,3,76],"149":[3,4,93],"150":[1,3,190],"151":[2,3,119],"152":[3,1,54],"153":[2,1,76],"154":[2,1,139],"155":[2,1,93],"156":[3,2,12],"157":[2,2,25],"158":[3,3,118],"159":[5,3,46],"160":[1,1,71],"161":[1,1,11],"162":[1,1,1],"163":[1,1,46],"164":[1,1,47],"165":[1,1,113],"166":[1,1,1],"167":[3,2,160],"168":[3,2,67],"169":[6,2,50],"170":[6,2,2],"171":[2,1,1],"172":[2,3,135],"173":[3,3,51],"174":[1,3,72],"175":[3,3,83],"176":[1,1,19],"177":[3,2,55],"178":[1,2,13],"179":[4,2,140],"180":[3,1,42],"181":[3,4,47],"182":[1,3,53],"183":[2,5,17],"184":[2,5,17],"185":[2,5,15],"186":[2,1,26],"187":[8,3,111],"188":[2,3,50],"189":[3,1,27],"190":[8,4,101],"191":[13,4,80],"192":[2,4,44],"193":[2,1,145],"194":[5,2,205],"195":[5,2,26],"196":[1,6,22],"197":[1,6,8],"198":[1,6,23],"199":[1,6,20],"200":[1,6,19],"201":[1,6,23],"202":[1,6,17],"203":[1,6,20],"204":[1,6,26],"205":[2,6,21],"206":[2,6,38],"207":[2,6,36],"208":[2,6,29],"209":[2,6,28],"210":[2,6,27],"211":[2,6,31],"212":[2,6,27],"213":[2,6,40],"214":[8,2,25],"215":[11,2,5],"216":[3,2,106],"217":[5,1,1],"218":[5,5,17],"219":[2,5,121],"220":[4,5,139],"221":[7,1,1],"222":[4,1,28],"223":[2,1,95],"224":[5,1,1],"225":[6,6,17],"226":[5,6,33],"227":[4,6,28],"228":[4,6,35],"229":[6,6,25],"230":[4,6,49],"231":[2,1,42],"232":[4,1,72],"233":[5,1,85],"234":[5,1,93],"235":[5,1,82],"236":[4,1,1],"237":[1,5,22],"238":[1,5,33],"239":[1,5,36],"240":[5,5,72],"241":[1,1,93],"242":[5,2,32],"243":[2,1,105],"244":[9,1,40],"245":[2,9,78],"246":[2,1,33],"247":[2,1,34],"248":[1,2,32],"249":[1,2,38],"250":[1,2,1],"251":[1,3,18],"252":[4,3,29],"253":[4,3,27],"254":[11,2,37],"255":[2,2,51],"256":[1,2,34],"257":[2,1,38],"258":[1,2,17],"259":[1,2,38],"260":[1,2,1],"261":[1,3,18],"262":[3,3,28],"263":[3,3,27],"264":[2,2,54],"265":[11,2,37],"266":[1,2,23],"267":[3,1,39],"268":[1,3,17],"269":[1,3,21],"270":[1,3,1],"271":[3,4,12],"272":[3,4,20],"273":[1,3,14],"274":[4,1,26],"275":[1,4,16],"276":[1,4,1],"277":[1,5,31],"278":[2,5,33],"279":[1,4,1],"280":[1,5,15],"281":[3,5,16],"282":[1,4,11],"283":[2,1,33],"284":[1,2,23],"285":[1,2,18],"286":[1,1,1],"287":[14,2,75],"288":[21,2,88],"289":[21,2,159],"290":[2,1,90],"291":[2,2,24],"292":[1,1,21],"293":[2,1,29],"294":[2,1,41],"295":[1,1,15],"296":[1,2,9],"297":[1,2,17],"298":[1,2,20],"299":[1,2,62],"300":[1,2,64],"301":[1,2,48],"302":[1,1,64],"303":[1,1,50],"304":[1,2,73],"305":[1,2,31],"306":[1,2,17],"307":[1,2,18],"308":[1,2,39],"309":[1,2,19],"310":[1,2,37],"311":[1,2,18],"312":[1,2,35],"313":[1,2,20],"314":[1,2,38],"315":[1,2,19],"316":[1,2,14],"317":[1,2,17],"318":[1,2,14],"319":[1,2,20],"320":[1,2,20],"321":[1,1,51],"322":[1,1,79],"323":[4,1,107],"324":[4,1,64],"325":[2,1,69],"326":[2,1,24],"327":[1,1,107],"328":[2,1,47],"329":[8,1,1],"330":[1,8,25],"331":[8,8,61],"332":[7,8,54],"333":[6,8,31],"334":[6,8,25],"335":[7,8,25],"336":[5,8,20],"337":[6,8,17],"338":[5,8,58],"339":[7,8,66],"340":[4,8,65],"341":[5,8,28],"342":[4,8,62],"343":[1,1,1],"344":[3,1,12],"345":[1,1,11],"346":[4,1,41],"347":[3,1,63],"348":[5,1,35],"349":[3,5,20],"350":[1,7,11],"351":[2,7,5],"352":[3,5,46],"353":[1,6,23],"354":[1,5,5],"355":[3,1,57],"356":[2,3,38],"357":[4,5,109],"358":[4,5,116],"359":[2,3,86],"360":[1,1,1],"361":[3,1,11],"362":[1,1,11],"363":[2,1,1],"364":[2,3,32],"365":[2,3,41],"366":[2,3,63],"367":[1,1,1],"368":[3,1,11],"369":[1,1,9],"370":[1,1,68],"371":[5,3,32],"372":[9,1,40],"373":[2,9,78],"374":[2,1,33],"375":[1,1,1],"376":[2,1,27],"377":[2,1,48],"378":[3,1,5],"379":[3,1,65],"380":[2,1,69],"381":[3,2,76],"382":[2,5,32],"383":[2,5,45],"384":[2,5,102],"385":[1,1,158],"386":[2,2,24],"387":[2,1,18],"388":[2,2,26],"389":[2,3,26],"390":[1,4,21],"391":[7,4,31],"392":[3,3,51],"393":[3,5,28],"394":[3,2,23],"395":[3,7,65],"396":[4,1,40],"397":[2,4,25],"398":[2,6,44],"399":[2,7,42],"400":[3,6,53],"401":[3,4,58],"402":[2,7,42],"403":[2,8,9],"404":[3,8,12],"405":[1,4,18],"406":[1,5,20],"407":[2,6,88],"408":[3,4,82],"409":[2,7,31],"410":[2,7,32],"411":[2,7,19],"412":[4,7,20],"413":[4,7,73],"414":[3,6,37],"415":[4,6,35],"416":[4,9,49],"417":[4,1,1],"418":[2,1,17],"419":[5,2,72],"420":[5,2,96],"421":[1,2,87],"422":[3,1,1],"423":[5,1,1],"424":[2,1,20],"425":[2,1,30],"426":[1,2,7],"427":[2,2,3],"428":[1,2,3],"429":[2,1,35],"430":[3,2,37],"431":[1,5,34],"432":[1,5,41],"433":[1,5,37],"434":[1,6,41],"435":[1,6,49],"436":[4,6,127],"437":[1,2,69],"438":[2,2,68],"439":[2,1,40],"440":[3,2,102],"441":[4,5,107],"442":[3,5,173],"443":[2,2,94],"444":[2,2,51],"445":[1,1,17],"446":[6,2,29],"447":[2,2,68],"448":[2,1,34],"449":[3,2,49],"450":[2,5,60],"451":[4,2,35],"452":[3,1,51],"453":[2,1,21],"454":[3,2,124],"455":[3,2,133],"456":[5,1,1],"457":[5,5,17],"458":[2,5,121],"459":[4,5,139],"460":[4,1,28],"461":[2,1,95],"462":[5,1,1],"463":[6,6,17],"464":[5,6,33],"465":[4,6,28],"466":[4,6,35],"467":[6,6,25],"468":[4,6,49],"469":[2,1,42],"470":[4,1,72],"471":[5,1,85],"472":[5,1,93],"473":[5,1,82],"474":[4,1,1],"475":[1,5,22],"476":[1,5,33],"477":[1,5,36],"478":[5,5,72]},"averageFieldLength":[3.0981210855949906,3.2672233820459295,48.741127348643005],"storedFields":{"0":{"href":"/support#support","html":"\n
Sequence has a front line Support Team in multiple timezones to tackle problems that arise with the Stack, as well as answer any question for new projects in order to integrate web3 experiences in games and applications.
\n
If one of the members of the team does not know the answer, we'll further investigate (with backup support from the Sequence dev team) to get to the bottom of your troubles.
","isPage":true,"text":"\nSequence has a front line Support Team in multiple timezones to tackle problems that arise with the Stack, as well as answer any question for new projects in order to integrate web3 experiences in games and applications.\nIf one of the members of the team does not know the answer, we'll further investigate (with backup support from the Sequence dev team) to get to the bottom of your troubles.\nStart talking to support today","title":"Support","titles":[]},"1":{"href":"/api/marketplace#marketplace-api","html":"\n\n
The Sequence Marketplace API service offers a simple and fast way to interact with sequence marketplace protocols. The API is designed to be easy to use and to have all the features you need to build a fully functional marketplace.
\n
#TODO add example from solutions
","isPage":true,"text":"\nMarketplace API documentation and testing\nThe Sequence Marketplace API service offers a simple and fast way to interact with sequence marketplace protocols. The API is designed to be easy to use and to have all the features you need to build a fully functional marketplace.\n#TODO add example from solutions","title":"Marketplace API","titles":[]},"2":{"href":"/api/metadata#metadata-api","html":"\n\n
The Sequence Metadata API service offers a simple and fast API to query, manage, and update collections, token & NFT metadata for Ethereum-compatible chains.
\n\n","isPage":true,"text":"\nMetadata API documentation and endpoints\nThe Sequence Metadata API service offers a simple and fast API to query, manage, and update collections, token & NFT metadata for Ethereum-compatible chains.\nOur Metadata service is managed through Sequence Builder and requires a Service Account & Token in order to call the corresponding endpoints. Please follow the [section](/api/metadata#Obtaining a Service Account & Token) below prior to calling the endpoints\n","title":"Metadata API","titles":[]},"3":{"href":"/api/metadata#obtaining-a-service-account--token","html":"\n
Since the Metadata API requires write access in order to update on-chain state, you will need to first obtain a Service Account & Token to call this from your backend. Importantly, this is a secret key and should not be exposed publicly.
\n\n
Create a New Project using our Builder. Navigate to Settings > API Keys > Add Service Account.
\n
In the modal that pops up, click the dropdown for Permission and change to Write. After completed click Add.
\n
On the next screen, you will be given your Secret API Token. Copy the key and store it securely as it is not possible to see it again. Once this is done, click Confirm and you are all set to utilize the API.
\n\n
Keep in mind, in contrast to our Public API Access key - this Secret API Token should be stored securely and not be used publicly. You will pass this token as a normal JWT in the Request Headers as X-Access-Key
\n","isPage":false,"text":"\nSince the Metadata API requires write access in order to update on-chain state, you will need to first obtain a Service Account & Token to call this from your backend. Importantly, this is a secret key and should not be exposed publicly.\n\nCreate a New Project using our Builder. Navigate to Settings > API Keys > Add Service Account.\nIn the modal that pops up, click the dropdown for Permission and change to Write. After completed click Add.\nOn the next screen, you will be given your Secret API Token. Copy the key and store it securely as it is not possible to see it again. Once this is done, click Confirm and you are all set to utilize the API.\n\nKeep in mind, in contrast to our Public API Access key - this Secret API Token should be stored securely and not be used publicly. You will pass this token as a normal JWT in the Request Headers as X-Access-Key\n","title":"Obtaining a Service Account & Token","titles":["Metadata API"]},"4":{"href":"/api/metadata#creating-collections-tokens-and-managing-metadata","html":"\n
The below steps walk through an end to end example utilizing our Metadata API in order to deploy an NFT collection, create tokens within that collection, and deploy asset metadata to such as an image to that token.
CreateToken - use returned collectionId from previous request
\n
\n
\n
CreateAsset - use collectionId and your tokenId
\n
\n
set metadataField (assetType) to one of the following\n
\n
image
\n
animation_url
\n
audio
\n
video
\n
\n
\n
\n
\n
\n
Upload file with PUT method to this endpoint PUT {metadata-server}/projects/{projectId}/collections/{collectionId}/tokens/{tokenId}/upload/{assetIdOrAssetType}- use assetId that is returned in step 3 OR, you can pass assetType, such as "image"
Asset is now privately accessible with JWT token at GET {metadata-server}/projects/{projectID}/collections/{collectionID}/tokens/{tokenID}/asset/{assetType}
Finally, to use the metadata in your contract, simply update your contract's metadata base URIs to the values above, and everything will simply work.
\n\n
Below is an architecture demonstrating the steps above of how an NFT collection (ERC721 or ERC1155) is created and managed.\n
\n","isPage":false,"text":"\nThe below steps walk through an end to end example utilizing our Metadata API in order to deploy an NFT collection, create tokens within that collection, and deploy asset metadata to such as an image to that token.\n\n\nCall CreateCollection endpoint - ensure you pass in the Secret Service Token created in the prior section.\n\n\nCreateToken - use returned collectionId from previous request\n\n\nCreateAsset - use collectionId and your tokenId\n\nset metadataField (assetType) to one of the following\n\nimage\nanimation_url\naudio\nvideo\n\n\n\n\n\nUpload file with PUT method to this endpoint PUT {metadata-server}/projects/{projectId}/collections/{collectionId}/tokens/{tokenId}/upload/{assetIdOrAssetType}- use assetId that is returned in step 3 OR, you can pass assetType, such as "image"\n\n\n\nFor example you can upload to https://metadata.sequence.app/projects/486/collections/1/tokens/1/upload/image which will find the asset of the type "image" for the token, and will upload there.\n\nYou can also pass in the assetId if you prefer, i.e., PUT https://metadata.sequence.app/projects/486/collections/1/assets/1/upload\n\n\nAsset types include: image, audio, video, animation_url\n\n\n\nAsset is now privately accessible with JWT token at GET {metadata-server}/projects/{projectID}/collections/{collectionID}/tokens/{tokenID}/asset/{assetType}\n\nfor example: https://metadata.sequence.app/projects/486/collections/1/tokens/1/asset/image\n\n\n\nPublishCollection -- this sets the collection to be accessible by the public\n\n\nGetCollection -- will return both baseURIs for contract and token level metadata.\n\n\n\nCollection-level metadata (aka contract-level) metadata: https://metadata.sequence.app/projects/486/collections/1 or https://metadata.sequence.app/projects/486/collections/1.json\nToken-level metadata: https://metadata.sequence.app/projects/486/collections/1/tokens/{tokenId}\n\nie. https://metadata.sequence.app/projects/486/collections/1/tokens/1 or https://metadata.sequence.app/projects/486/collections/1/tokens/1.json\n\n\n\n\nFinally, to use the metadata in your contract, simply update your contract's metadata base URIs to the values above, and everything will simply work.\n\nBelow is an architecture demonstrating the steps above of how an NFT collection (ERC721 or ERC1155) is created and managed.\n\n","title":"Creating Collections, Tokens, and Managing Metadata","titles":["Metadata API"]},"5":{"href":"/api/metadata#pricing--usage","html":"\n
The Sequence Metadata is available for free with moderate request limits, but if your project requires higher limits, please contact the Sequence team.
","isPage":false,"text":"\nThe Sequence Metadata is available for free with moderate request limits, but if your project requires higher limits, please contact the Sequence team.","title":"Pricing & Usage","titles":["Metadata API"]},"6":{"href":"/api/node-gateway#node-gateway","html":"\n
Sequence Node gateway infrastructure enables you to have fail-over resilient RPC endpoints that can scale with your application.
\n
By using our infrastructure, you save money for not having to deploy your own stack, and benefits from the feature of aggregating multiple public RPC providers into a single endpoint for use.
\n","isPage":true,"text":"\nSequence Node gateway infrastructure enables you to have fail-over resilient RPC endpoints that can scale with your application.\nBy using our infrastructure, you save money for not having to deploy your own stack, and benefits from the feature of aggregating multiple public RPC providers into a single endpoint for use.\n","title":"Node Gateway","titles":[]},"7":{"href":"/api/node-gateway#give-it-a-try","html":"\n
Install ethers with pnpm install ethers or yarn add ethers
And acquire a Builder access key to authenticate your connection and append to the endpoint
\n
// Import the ethers library\nimport { ethers } from "ethers";\n\n// Function to create a provider and fetch the latest block\nasync function getLatestBlock() {\n // Replace the following URL with your actual RPC endpoint\n const rpcUrl =\n "https://nodes.sequence.app/<chain_handle>/<project_access_key>";\n\n // Create a provider using the RPC URL\n const provider = new ethers.providers.JsonRpcProvider(rpcUrl);\n\n // Fetch the latest block\n const latestBlock = await provider.getBlock("latest");\n\n console.log("Latest Block:", latestBlock);\n}\n\n// Call the function to get the latest block\ngetLatestBlock().catch(console.error);
","isPage":false,"text":"\nInstall ethers with pnpm install ethers or yarn add ethers\nEnsure to choose a network handle from our network options\nAnd acquire a Builder access key to authenticate your connection and append to the endpoint\n// Import the ethers library\nimport { ethers } from "ethers";\n \n// Function to create a provider and fetch the latest block\nasync function getLatestBlock() {\n // Replace the following URL with your actual RPC endpoint\n const rpcUrl =\n "https://nodes.sequence.app/<chain_handle>/<project_access_key>";\n \n // Create a provider using the RPC URL\n const provider = new ethers.providers.JsonRpcProvider(rpcUrl);\n \n // Fetch the latest block\n const latestBlock = await provider.getBlock("latest");\n \n console.log("Latest Block:", latestBlock);\n}\n \n// Call the function to get the latest block\ngetLatestBlock().catch(console.error);","title":"Give it a try","titles":["Node Gateway"]},"8":{"href":"/api/relayer#relayer-api","html":"\n\n
The Sequence Relayer service offers a simple interface for dispatching meta-transactions on Ethereum-compatible networks.
\n
Meta-transactions are the idea of a transaction inside of a transaction. The benefits of Sequence meta-transactions are that they allow:
\n
\n
Gas abstraction -- whereby users can pay for network gas in a variety of tokens (ie. USDC, DAI, etc.)
\n
Sponsored gas -- projects may sponsor the gas of specific contracts to allow free gas for their users
\n
Batched transactions -- group a bunch of independent transactions and allow them to be mined as a single transaction
\n
Parallel transactions -- parallelize the dispatch of transactions in some cases
\n
Fire + forget model -- easily send transactions to the relayer which will automatically manage nonces, bump gas, and other features which will ensure fast delivery
\n
Optimal gas pricing for transactions
\n
\n
The best part: transactions with Sequence Relayer are compatible with any existing/deployed Ethereum contract, and thus, integrating the Sequence Relayer doesn't require any changes to your contracts or dapp.
\n
The Sequence Relayer is usable by frontend dapps, or even in your backends.
","isPage":true,"text":"\nRelayer API documentation and endpoints\nThe Sequence Relayer service offers a simple interface for dispatching meta-transactions on Ethereum-compatible networks.\nMeta-transactions are the idea of a transaction inside of a transaction. The benefits of Sequence meta-transactions are that they allow:\n\nGas abstraction -- whereby users can pay for network gas in a variety of tokens (ie. USDC, DAI, etc.)\nSponsored gas -- projects may sponsor the gas of specific contracts to allow free gas for their users\nBatched transactions -- group a bunch of independent transactions and allow them to be mined as a single transaction\nParallel transactions -- parallelize the dispatch of transactions in some cases\nFire + forget model -- easily send transactions to the relayer which will automatically manage nonces, bump gas, and other features which will ensure fast delivery\nOptimal gas pricing for transactions\n\nThe best part: transactions with Sequence Relayer are compatible with any existing/deployed Ethereum contract, and thus, integrating the Sequence Relayer doesn't require any changes to your contracts or dapp.\nThe Sequence Relayer is usable by frontend dapps, or even in your backends.","title":"Relayer API","titles":[]},"9":{"href":"/guides/lootbox#deploy-an-in-game-collectibles-contract","html":"\n","isPage":true,"text":"\n","title":"Deploy an in-game collectibles contract","titles":[null]},"10":{"href":"/guides/lootbox#query-contract-details","html":"\n","isPage":false,"text":"\n","title":"Query contract details","titles":[null]},"11":{"href":"/guides/lootbox#fetch-token-balances-of-a-wallet","html":"\n\n
\n
Builder Signup & Project Creation
\n
\n
\n
Access Key Management
\n
\n
\n
Deploy a Contract
\n
\n
\n
Sponsor contract gas
\n
\n
\n
Deploying a cloudflare worker
\n
\n
\n
Generating AI Prompts & Images
\n
\n
\n
Uploading metadata to Sequence Metadata Service
\n
\n
\n
Minting Onchain with Relayer
\n
\n
\n
iframe-to-Webapp Communication
\n
\n
\n
Secure your cloudflare relayer from outside requests
\n
\n","isPage":false,"text":"\n\n\nBuilder Signup & Project Creation\n\n\nAccess Key Management\n\n\nDeploy a Contract\n\n\nSponsor contract gas\n\n\nDeploying a cloudflare worker\n\n\nGenerating AI Prompts & Images\n\n\nUploading metadata to Sequence Metadata Service\n\n\nMinting Onchain with Relayer\n\n\niframe-to-Webapp Communication\n\n\nSecure your cloudflare relayer from outside requests\n\n","title":"Fetch token balances of a wallet","titles":[null]},"12":{"href":"/guides/unity-guide#integrate-sequencekit-with-waas","html":"\n","isPage":true,"text":"\n","title":"Integrate SequenceKit with WaaS","titles":[null]},"13":{"href":"/guides/unity-guide#deploy-a-collectibles-contract","html":"\n","isPage":false,"text":"\n","title":"Deploy a collectibles contract","titles":[null]},"14":{"href":"/guides/unity-guide#deploy-a-remote-minter","html":"\n","isPage":false,"text":"\n","title":"Deploy a remote minter","titles":[null]},"15":{"href":"/guides/unity-guide#mint-in-game-achievement-tokens","html":"\n","isPage":false,"text":"\n","title":"Mint in-game achievement tokens","titles":[null]},"16":{"href":"/guides/unity-guide#burn-in-game-achievement-tokens","html":"\n","isPage":false,"text":"\n","title":"Burn in-game achievement tokens","titles":[null]},"17":{"href":"/guides/unity-guide#integrate-an-embedded-marketplace","html":"\n","isPage":false,"text":"\n","title":"Integrate an embedded marketplace","titles":[null]},"18":{"href":"/solutions/minter#mint-tokens-using-builder-manually","html":"\n","isPage":true,"text":"\n","title":"Mint tokens using Builder manually","titles":[null]},"19":{"href":"/solutions/minter#deploy-a-serverless-minter-on-cloudflare-workers","html":"\n","isPage":false,"text":"\n","title":"Deploy a serverless minter on Cloudflare Workers","titles":[null]},"20":{"href":"/solutions/nft-checkout#integrate-nft-checkout-on-web-coming-soon","html":"\n","isPage":true,"text":"\n","title":"Integrate NFT Checkout on web (coming soon)","titles":[null]},"21":{"href":"/solutions/onramps#integrate-onramp-on-web","html":"\n","isPage":true,"text":"\n","title":"Integrate onramp on web","titles":[null]},"22":{"href":"/api/indexer/fetch-tokens#tokens-api","html":"\n\n","isPage":true,"text":"\nINTRODUCING THE SEQUENCE BUILDER - Our Indexer service is now managed through Sequence Builder. Sign up to grab your API access key.Get started with the Sequence Builder Free Plan today!\n","title":"Tokens API","titles":[]},"23":{"href":"/api/indexer/fetch-tokens#fetches-list-of-erc20-erc721-and-erc1155-tokens-and-metadata-in-any-wallet","html":"\n
Sequence Indexer GetTokenBalances Method:
\n
\n
Request: POST /rpc/Indexer/GetTokenBalances
\n
Content-Type: application/json
\n
Body (in JSON):\n
\n
accountAddress (string) -- the wallet account address
\n
includeMetadata (boolean - optional - default: false) -- toggle token metadata to be included in the response
\n
metadataOptions (object - optional) -- additional options for metadata\n
\n
verifiedOnly (boolean - optional) -- return only contracts which are 'verified' to help reduce spam
\n
includeContracts ([]string - optional) -- list of specific contract addresses to always be included, even if verifiedOnly is enabled.
\n
\n
\n
\n
\n
\n \nExample: GetTokenBalances of a wallet account address on Polygon using an API_Access_Key\n\n
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n\nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n\n// try any account address you'd like :)\nconst accountAddress = '0xabc...'\n\n// query Sequence Indexer for all token balances of the account on Polygon\nconst tokenBalances = await indexer.getTokenBalances({\n\taccountAddress: accountAddress,\n\tincludeMetadata: true\n})\nconsole.log('tokens in your account:', tokenBalances)
Please [contact our team](/support) for assistance with integrations to another target.
\n \n\n","isPage":false,"text":"\nSequence Indexer GetTokenBalances Method:\n\nRequest: POST /rpc/Indexer/GetTokenBalances\nContent-Type: application/json\nBody (in JSON):\n\naccountAddress (string) -- the wallet account address\nincludeMetadata (boolean - optional - default: false) -- toggle token metadata to be included in the response\nmetadataOptions (object - optional) -- additional options for metadata\n\nverifiedOnly (boolean - optional) -- return only contracts which are 'verified' to help reduce spam\nincludeContracts ([]string - optional) -- list of specific contract addresses to always be included, even if verifiedOnly is enabled.\n\n\n\n\n\n\nExample: GetTokenBalances of a wallet account address on Polygon using an API_Access_Key\nThis code requires an API Access Key from Sequence Builder.\ncurl -X POST -H "Content-Type: application/json" -H "X-Access-Key: c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA" https://polygon-indexer.sequence.app/rpc/Indexer/GetTokenBalances -d '{ "accountAddress": "0x8e3E38fe7367dd3b52D1e281E4e8400447C8d8B9", "includeMetadata": true }'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n \nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n \n// try any account address you'd like :)\nconst accountAddress = '0xabc...'\n \n// query Sequence Indexer for all token balances of the account on Polygon\nconst tokenBalances = await indexer.getTokenBalances({\n\taccountAddress: accountAddress,\n\tincludeMetadata: true\n})\nconsole.log('tokens in your account:', tokenBalances)import (\n\t"context"\n\t"fmt"\n\t"log"\n\t"net/http"\n \n\t"github.com/0xsequence/go-sequence/indexer"\n)\n \nfunc GetTokenBalances(accountAddress string) {\n\tseqIndexer := indexer.NewIndexer("https://polygon-indexer.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \n\tincludeMetadata := true\n \n\ttokenBalances, _, err := seqIndexer.GetTokenBalances(context.Background(), &accountAddress, nil, &includeMetadata, nil)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println("tokenBalances:", tokenBalances)\n}Please [contact our team](/support) for assistance with integrations to another target.\n\nPRO TIP: fetching ERC721/1155 token IDsYou'll notice that, by default, GetTokenBalances will return at most one token instance from each contract.\nIn order to fetch ERC721/1155 token balances, you must pass the contractAddress to the GetTokenBalances method.\nThis will return all of the tokens owned by accountAddress from the specified contractAddress.\nSee section below for more information.\n","title":"Fetches list of ERC20, ERC721 and ERC1155 tokens and metadata in any wallet.","titles":["Tokens API",null]},"24":{"href":"/api/indexer/fetch-tokens#fetch-token-ids-balances-and-metadata-of-erc721-and-erc1155-collections","html":"\n
Sequence Indexer GetTokenBalances Method:
\n
\n
Request: POST /rpc/Indexer/GetTokenBalances
\n
Content-Type: application/json
\n
Body (in JSON):\n
\n
accountAddress (string) -- the wallet account address
\n
contractAddress (string) -- the contract address of the ERC721 / ERC1155 collection
\n
includeMetadata (boolean - optional - default: false) -- toggle token metadata to be included in the response
\n
metadataOptions (object - optional) -- additional options for metadata\n
\n
verifiedOnly (boolean - optional) -- return only contracts which are 'verified' to help reduce spam
\n
includeContracts ([]string - optional) -- list of specific contract addresses to always be included, even if verifiedOnly is enabled.
\n
\n
\n
\n
\n
\n \nExample: GetTokenBalances of a contract + account address on Polygon using an c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA\n
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n\nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n\n// try any contract and account address you'd like :)\nconst contractAddress = '0x631998e91476DA5B870D741192fc5Cbc55F5a52E'\nconst accountAddress = '0xabc...'\n\n// query Sequence Indexer for all nft balances of the account on Polygon\nconst nftBalances = await indexer.getTokenBalances({\n\tcontractAddress: contractAddress,\n\taccountAddress: accountAddress,\n\tincludeMetadata: true\n})\n\nconsole.log('collection of items:', nftBalances)
","isPage":false,"text":"\nSequence Indexer GetTokenBalances Method:\n\nRequest: POST /rpc/Indexer/GetTokenBalances\nContent-Type: application/json\nBody (in JSON):\n\naccountAddress (string) -- the wallet account address\ncontractAddress (string) -- the contract address of the ERC721 / ERC1155 collection\nincludeMetadata (boolean - optional - default: false) -- toggle token metadata to be included in the response\nmetadataOptions (object - optional) -- additional options for metadata\n\nverifiedOnly (boolean - optional) -- return only contracts which are 'verified' to help reduce spam\nincludeContracts ([]string - optional) -- list of specific contract addresses to always be included, even if verifiedOnly is enabled.\n\n\n\n\n\n\nExample: GetTokenBalances of a contract + account address on Polygon using an c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA\ncurl -X POST -H "Content-Type: application/json" -H "X-Access-Key: c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA" https://polygon-indexer.sequence.app/rpc/Indexer/GetTokenBalances -d '{ "contractAddress": "0x631998e91476DA5B870D741192fc5Cbc55F5a52E", "accountAddress": "0x8e3E38fe7367dd3b52D1e281E4e8400447C8d8B9", "includeMetadata": true }'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n \nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n \n// try any contract and account address you'd like :)\nconst contractAddress = '0x631998e91476DA5B870D741192fc5Cbc55F5a52E'\nconst accountAddress = '0xabc...'\n \n// query Sequence Indexer for all nft balances of the account on Polygon\nconst nftBalances = await indexer.getTokenBalances({\n\tcontractAddress: contractAddress,\n\taccountAddress: accountAddress,\n\tincludeMetadata: true\n})\n \nconsole.log('collection of items:', nftBalances)import (\n\t"context"\n\t"fmt"\n\t"log"\n\t"net/http"\n \n\t"github.com/0xsequence/go-sequence/indexer"\n)\n \nfunc GetTokenBalances(contractAddress, accountAddress string) {\n\tseqIndexer := indexer.NewIndexer("https://polygon-indexer.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \n\tincludeMetadata := true\n \n\tnftBalances, _, err := seqIndexer.GetTokenBalances(context.Background(), &accountAddress, &contractAddress, &includeMetadata, nil)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println("nftBalances:", nftBalances)\n}","title":"Fetch token IDs, balances and metadata of ERC721 and ERC1155 collections.","titles":["Tokens API",null]},"25":{"href":"/api/indexer/installation#indexer-installation","html":"\n\n
Sequence Indexer is a simple API to query any blockchain token and NFT data. Below are instructions\non how to integrate the Sequence Indexer API into your Webapps, Games, and backends. In case you missed\nit, please also see the Indexer Overview.
\n","isPage":true,"text":"\nINTRODUCING THE SEQUENCE BUILDER - Our Indexer service is managed through Sequence Builder. Sign up to grab your API access key.Get started with the Sequence Builder Free Plan today!\nSequence Indexer is a simple API to query any blockchain token and NFT data. Below are instructions\non how to integrate the Sequence Indexer API into your Webapps, Games, and backends. In case you missed\nit, please also see the Indexer Overview.\n","title":"Indexer Installation","titles":[]},"26":{"href":"/api/indexer/installation#installation","html":"\n
The Sequence Indexer is built as a HTTP API with RPC endpoints that you may call directly\nfrom your Webapp, Game or server backend. Below you'll find information on the RPC endpoint\nschema with sample curl commands, along with examples in both Javascript/Typescript and Go.
\n
We provide SDKs for Web / node.js and Go.\nOr if you'd like to integrate the Indexer with another language target, simply follow the API reference below\nto implement the HTTP requests. Additionally, read the Typescript client source code as reference\nimplementation of the Indexer API client as well.
\n\n \n","isPage":false,"text":"\nThe Sequence Indexer is built as a HTTP API with RPC endpoints that you may call directly\nfrom your Webapp, Game or server backend. Below you'll find information on the RPC endpoint\nschema with sample curl commands, along with examples in both Javascript/Typescript and Go.\nWe provide SDKs for Web / node.js and Go.\nOr if you'd like to integrate the Indexer with another language target, simply follow the API reference below\nto implement the HTTP requests. Additionally, read the Typescript client source code as reference\nimplementation of the Indexer API client as well.\nSequence Indexer offers the same API across a variety of EVM networks. Make sure to check the Indexer endpoints\nand use the corresponding host for your dapp/game. For example, on Ethereum mainnet the Sequence Indexer endpoint is\nhttps://mainnet-indexer.sequence.app and Polygon is https://polygon-indexer.sequence.app.🌄 View the full list of supported networks and Indexer endpoints here\n\n","title":"Installation","titles":["Indexer Installation"]},"27":{"href":"/api/indexer/installation#web--nodejs-installation","html":"\n
npm install 0xsequence ethers
\n
or
\n
pnpm install 0xsequence ethers
\n
or
\n
yarn add 0xsequence ethers
\n\n
import { SequenceIndexer } from '@0xsequence/indexer'\n\n// see https://docs.sequence.xyz/solutions/technical-references/chain-support for list of\n// indexer hosts for the chain you'd like to query\nconst indexer = new SequenceIndexer('https://mainnet-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n\n// see examples below for the kinds of queries you can make\nconst tokenBalances = await indexer.getTokenBalances(...)
\n
NOTE: if you're using @0xsequence/indexer from node.js, we recommend using node v18.x or newer.
\n \n","isPage":false,"text":"\nnpm install 0xsequence ethers\nor\npnpm install 0xsequence ethers\nor\nyarn add 0xsequence ethers\nThis code requires an API Access Key from Sequence Builder.\nimport { SequenceIndexer } from '@0xsequence/indexer'\n \n// see https://docs.sequence.xyz/solutions/technical-references/chain-support for list of\n// indexer hosts for the chain you'd like to query\nconst indexer = new SequenceIndexer('https://mainnet-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n \n// see examples below for the kinds of queries you can make\nconst tokenBalances = await indexer.getTokenBalances(...)\nNOTE: if you're using @0xsequence/indexer from node.js, we recommend using node v18.x or newer.\n\n","title":"Web / node.js Installation","titles":["Indexer Installation","Installation"]},"28":{"href":"/api/indexer/installation#go-installation","html":"\n
go get -u github.com/0xsequence/go-sequence@latest
\n
then in your app,
\n
import (\n\t"github.com/0xsequence/go-sequence/indexer"\n)\n\n// see https://docs.sequence.xyz/solutions/technical-references/chain-support for list of\n// indexer hosts for the chain you'd like to query\nseqIndexer := indexer.NewIndexer("https://polygon-indexer.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n\n// see examples below for the kinds of queries you can make\naccountAddress := "ACCOUNT_ADDRESS"\nincludeMetadata := true\nmetadataOptions := indexer.MetadataOptions{\n\tVerifiedOnly: true,\n}\n\n_, tokenBalances, err := seqIndexer.GetTokenBalances(context.Background(), &accountAddress, nil, nil, &includeMetadata, &metadataOptions, nil)
\n \n","isPage":false,"text":"\ngo get -u github.com/0xsequence/go-sequence@latest\nthen in your app,\nimport (\n\t"github.com/0xsequence/go-sequence/indexer"\n)\n \n// see https://docs.sequence.xyz/solutions/technical-references/chain-support for list of\n// indexer hosts for the chain you'd like to query\nseqIndexer := indexer.NewIndexer("https://polygon-indexer.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \n// see examples below for the kinds of queries you can make\naccountAddress := "ACCOUNT_ADDRESS"\nincludeMetadata := true\nmetadataOptions := indexer.MetadataOptions{\n\tVerifiedOnly: true,\n}\n \n_, tokenBalances, err := seqIndexer.GetTokenBalances(context.Background(), &accountAddress, nil, nil, &includeMetadata, &metadataOptions, nil)\n\n","title":"Go Installation","titles":["Indexer Installation","Installation"]},"29":{"href":"/api/indexer/installation#unity-or-unreal-installation","html":"\n
\n ","isPage":false,"text":"\nThe Sequence Indexer is integrated directly inside of the respective Sequence Unity and Sequence Unreal SDKs.\n","title":"Unity or Unreal Installation","titles":["Indexer Installation","Installation"]},"30":{"href":"/api/indexer/metadata-tips#metadata-tips--notes-on-spam","html":"\n
The Sequence Indexer and Sequence Metadata services will pick up everything and anything\nthat is published on a blockchain. Our services are designed to provide data in real-time\nas blocks are mined, and adhere to all popular ERC20, ERC721 and ERC1155 metadata\nstandards so things just work.
\n
This is very helpful for your applications to be able to have access to the complete set of data\non-chain, but it also means it will include spam tokens when querying with default settings.
\n
To combat spam, we introduced metadataOptions arguments which can be passed to Indexer RPC\ncalls to control the results returned.
\n
The Sequence Metadata service keeps track of contracts which are "verified" by checking popular\nsources like Coingecko, OpenSea, Sequence Builder (https://sequence.build) and the Sequence Token\nDirectory (https://github.com/0xsequence/token-directory). By calling the Indexer RPC methods with\n"metadataOptions": { "verifiedOnly": true }, any contract address which has not been verified, will\nbe omitted from the results. We recommend using this option all the time, but, the downside is\nif your project's contracts are unverified, then they will also be omitted from the results. To help\nwith this, your options are to get verified with one of the sources above, or in your RPC calls to pass\n"metadataOptions": { "verifiedOnly": true, "includeContracts": ["0x631998e91476DA5B870D741192fc5Cbc55F5a52E", "0x8bb759bb68995343ff1e9d57ac85ff5c5fb79334"] }\nas an example.
","isPage":true,"text":"\nThe Sequence Indexer and Sequence Metadata services will pick up everything and anything\nthat is published on a blockchain. Our services are designed to provide data in real-time\nas blocks are mined, and adhere to all popular ERC20, ERC721 and ERC1155 metadata\nstandards so things just work.\nThis is very helpful for your applications to be able to have access to the complete set of data\non-chain, but it also means it will include spam tokens when querying with default settings.\nTo combat spam, we introduced metadataOptions arguments which can be passed to Indexer RPC\ncalls to control the results returned.\nThe Sequence Metadata service keeps track of contracts which are "verified" by checking popular\nsources like Coingecko, OpenSea, Sequence Builder (https://sequence.build) and the Sequence Token\nDirectory (https://github.com/0xsequence/token-directory). By calling the Indexer RPC methods with\n"metadataOptions": { "verifiedOnly": true }, any contract address which has not been verified, will\nbe omitted from the results. We recommend using this option all the time, but, the downside is\nif your project's contracts are unverified, then they will also be omitted from the results. To help\nwith this, your options are to get verified with one of the sources above, or in your RPC calls to pass\n"metadataOptions": { "verifiedOnly": true, "includeContracts": ["0x631998e91476DA5B870D741192fc5Cbc55F5a52E", "0x8bb759bb68995343ff1e9d57ac85ff5c5fb79334"] }\nas an example.","title":"Metadata Tips & Notes on Spam","titles":[]},"31":{"href":"/api/indexer/native-network-balance#native-network-balances-ie-eth-matic-etc","html":"\n\n","isPage":true,"text":"\nINTRODUCING THE SEQUENCE BUILDER - Our Indexer service is now managed through Sequence Builder. Sign up to grab your API access key.Get started with the Sequence Builder Free Plan today!\n","title":"Native network balances (ie. ETH, MATIC, etc.)","titles":[]},"32":{"href":"/api/indexer/native-network-balance#fetch-native-network-balance-aka-eth-on-ethereum-matic-on-polygon-avax-on-avalanche-bnb-on-bsc-etc","html":"\n
Sequence Indexer GetEtherBalance Method:
\n
\n
Request: POST /rpc/Indexer/GetEtherBalance
\n
Content-Type: application/json
\n
Body (in JSON):\n
\n
accountAddress (string) -- the wallet account address
\n
\n
\n
\n \nExample: GetEtherBalance MATIC balance of a wallet account address on Polygon using an API_Access_Key\n
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n\nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n\n// try any account address you'd like :)\nconst accountAddress = '0xabc...'\n\n// query Sequence Indexer for the MATIC balance on Polygon\nconst balance = await indexer.getEtherBalance({\n\taccountAddress: accountAddress,\n})\n\t\nconsole.log('tokens in your account:', tokenBalances)
","isPage":false,"text":"\nSequence Indexer GetEtherBalance Method:\n\nRequest: POST /rpc/Indexer/GetEtherBalance\nContent-Type: application/json\nBody (in JSON):\n\naccountAddress (string) -- the wallet account address\n\n\n\n\nExample: GetEtherBalance MATIC balance of a wallet account address on Polygon using an API_Access_Key\ncurl -X POST -H "Content-Type: application/json" -H "X-Access-Key: c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA" https://polygon-indexer.sequence.app/rpc/Indexer/GetEtherBalance -d '{ "accountAddress": "0x8e3E38fe7367dd3b52D1e281E4e8400447C8d8B9" }'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n \nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n \n// try any account address you'd like :)\nconst accountAddress = '0xabc...'\n \n// query Sequence Indexer for the MATIC balance on Polygon\nconst balance = await indexer.getEtherBalance({\n\taccountAddress: accountAddress,\n})\n\t\nconsole.log('tokens in your account:', tokenBalances)import (\n\t"context"\n\t"fmt"\n\t"log"\n\t"net/http"\n \n\t"github.com/0xsequence/go-sequence/indexer"\n)\n \nfunc GetTokenBalances(accountAddress string) {\n\tseqIndexer := indexer.NewIndexer("https://polygon-indexer.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \n\tincludeMetadata := true\n \n\ttokenBalances, _, err := seqIndexer.GetTokenBalances(context.Background(), &accountAddress, nil, &includeMetadata, nil)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println("tokenBalances:", tokenBalances)\n}","title":"Fetch native network balance (aka ETH on Ethereum, MATIC on Polygon, AVAX on Avalanche, BNB on BSC, etc.)","titles":["Native network balances (ie. ETH, MATIC, etc.)",null]},"33":{"href":"/api/indexer/overview#indexer","html":"\n\n
The Sequence Indexer is a modular web3 service that makes it easy to query blockchain token and NFT data from Ethereum-compatible networks. The Indexer automatically indexes every ERC20, ERC721 and ERC1155 token from Ethereum-compatible chains.
\n\n
The Sequence Indexer is a modular web3 service that makes it easy to query blockchain token\nand NFT data from Ethereum-compatible networks. The Indexer automatically indexes every\nERC20, ERC721 and ERC1155 token from Ethereum-compatible chains.
\n
In fact, the Sequence Wallet uses the Indexer behind the scenes so it can seamlessly\nrender all token information in any wallet. But of course, the Indexer is a modular piece\nof infrastructure, and you may use it directly from your dapp, game, or even from\na server.
\nFeatures:\n
\n
Super-fast API to query all token balances, history, metadata and NFTs with multi-chain support
\n
Real-time indexing of ERC20, ERC721 and ERC1155 transactions across EVM-compatible chains
\n
Automatically detects all tokens on the chain, without the need for a contract registry
\n
Resilient to node failures and chain re-organizations
\n
Easily listen for specific events and transactions on-chain accurately with a simple API
\n
Built-in token / nft metadata support to easily render tokens in your apps / games
\n
High uptime and availability
\n
\n","isPage":true,"text":"\nIndexer API documentation and testing\nThe Sequence Indexer is a modular web3 service that makes it easy to query blockchain token and NFT data from Ethereum-compatible networks. The Indexer automatically indexes every ERC20, ERC721 and ERC1155 token from Ethereum-compatible chains.\nINTRODUCING THE SEQUENCE BUILDER - Our Indexer service is now managed through Sequence Builder. Sign up to grab your API access key.Get started with the Sequence Builder Free Plan today!\nThe Sequence Indexer is a modular web3 service that makes it easy to query blockchain token\nand NFT data from Ethereum-compatible networks. The Indexer automatically indexes every\nERC20, ERC721 and ERC1155 token from Ethereum-compatible chains.\nIn fact, the Sequence Wallet uses the Indexer behind the scenes so it can seamlessly\nrender all token information in any wallet. But of course, the Indexer is a modular piece\nof infrastructure, and you may use it directly from your dapp, game, or even from\na server.\nFeatures:\n\nSuper-fast API to query all token balances, history, metadata and NFTs with multi-chain support\nReal-time indexing of ERC20, ERC721 and ERC1155 transactions across EVM-compatible chains\nAutomatically detects all tokens on the chain, without the need for a contract registry\nResilient to node failures and chain re-organizations\nEasily listen for specific events and transactions on-chain accurately with a simple API\nBuilt-in token / nft metadata support to easily render tokens in your apps / games\nHigh uptime and availability\n\n","title":"Indexer","titles":[]},"34":{"href":"/api/indexer/overview#supported-networks--endpoints","html":"\n
\n","isPage":false,"text":"\nYou can see the full list of supported networks here.\n","title":"Supported Networks & Endpoints","titles":["Indexer"]},"35":{"href":"/api/indexer/overview#getting-started","html":"\n
Here are a few example queries you can make to a blockchain from your dapp, game, or wallet:
","isPage":false,"text":"\nHere are a few example queries you can make to a blockchain from your dapp, game, or wallet:\n\nFetch all tokens & NFTS in any wallet including all metadata\nFetch the transaction history for any wallet address\nFetch all unique tokens in a particular ERC20/721/1155 contract, including total supplies\nWhat is the total token supply of an ERC20 token? What is the total token supply of\nall the ERC1155 tokens in a particular contract?\nFetch the transaction history for any token contract address\n","title":"Getting Started","titles":["Indexer"]},"36":{"href":"/api/indexer/transaction-history#wallet-transaction-history","html":"\n\n","isPage":true,"text":"\nINTRODUCING THE SEQUENCE BUILDER - Our Indexer service is now managed through Sequence Builder. Sign up to grab your API access key.Get started with the Sequence Builder Free Plan today!\n","title":"Wallet transaction history","titles":[]},"37":{"href":"/api/indexer/transaction-history#fetch-the-transaction-history-for-any-wallet-address","html":"\n
Fetches the transaction / token history for any wallet address of any ERC20, ERC721 and ERC1155 token.\nThe response includes decoded transaction details for easy consumption / rendering.
\n
Sequence Indexer GetTransactionHistory Method:
\n
\n
Request: POST /rpc/Indexer/GetTransactionHistory
\n
Content-Type: application/json
\n
Body (in JSON):\n
\n
filter (object)\n
\n
accountAddress (string) -- the wallet account address
\n
contractAddress (string) -- optionally specify a contract address to filter
\n
accountAddresses (string array) -- optionally specify a list of wallet account addresses
\n
contractAddresses (string array) -- optionally specify a list of contract address
\n
transactionHashes (string array) -- optionally specify a list of transaction hashes
\n
metaTransactionIDs (string array) -- optionally specify a list of meta transaction IDs
\n
\n
\n
includeMetadata (boolean - optional - default: false) -- toggle token metadata to be included in the response
\n
metadataOptions (object - optional) -- additional options for metadata\n
\n
verifiedOnly (boolean - optional) -- return only contracts which are 'verified' to help reduce spam
\n
includeContracts ([]string - optional) -- list of specific contract addresses to always be included, even if verifiedOnly is enabled.
\n
\n
\n
\n
\n
\n \nExample: GetTransactionHistory of a wallet account address on Polygon using an API_Access_Key\n
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n\nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n\n// try any account address you'd like :)\nconst filter = {\n\taccountAddress: "0xabc..."\n}\n\n// query Sequence Indexer for all token transaction history on Polygon\nconst transactionHistory = await indexer.getTransactionHistory({\n\tfilter: filter,\n\tincludeMetadata: true\n})\n\t\nconsole.log('transaction history in account:', transactionHistory)
","isPage":false,"text":"\nFetches the transaction / token history for any wallet address of any ERC20, ERC721 and ERC1155 token.\nThe response includes decoded transaction details for easy consumption / rendering.\nSequence Indexer GetTransactionHistory Method:\n\nRequest: POST /rpc/Indexer/GetTransactionHistory\nContent-Type: application/json\nBody (in JSON):\n\nfilter (object)\n\naccountAddress (string) -- the wallet account address\ncontractAddress (string) -- optionally specify a contract address to filter\naccountAddresses (string array) -- optionally specify a list of wallet account addresses\ncontractAddresses (string array) -- optionally specify a list of contract address\ntransactionHashes (string array) -- optionally specify a list of transaction hashes\nmetaTransactionIDs (string array) -- optionally specify a list of meta transaction IDs\n\n\nincludeMetadata (boolean - optional - default: false) -- toggle token metadata to be included in the response\nmetadataOptions (object - optional) -- additional options for metadata\n\nverifiedOnly (boolean - optional) -- return only contracts which are 'verified' to help reduce spam\nincludeContracts ([]string - optional) -- list of specific contract addresses to always be included, even if verifiedOnly is enabled.\n\n\n\n\n\n\nExample: GetTransactionHistory of a wallet account address on Polygon using an API_Access_Key\ncurl -X POST -H "Content-Type: application/json" -H "X-Access-Key: c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA" https://polygon-indexer.sequence.app/rpc/Indexer/GetTransactionHistory -d '{ "filter": { "accountAddress": "0x8e3E38fe7367dd3b52D1e281E4e8400447C8d8B9" }, "includeMetadata": true }'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n \nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n \n// try any account address you'd like :)\nconst filter = {\n\taccountAddress: "0xabc..."\n}\n \n// query Sequence Indexer for all token transaction history on Polygon\nconst transactionHistory = await indexer.getTransactionHistory({\n\tfilter: filter,\n\tincludeMetadata: true\n})\n\t\nconsole.log('transaction history in account:', transactionHistory)import (\n\t"context"\n\t"fmt"\n\t"log"\n\t"net/http"\n \n\t"github.com/0xsequence/go-sequence/indexer"\n)\n \nfunc GetTransactionHistory(accountAddress string) {\n\tseqIndexer := indexer.NewIndexer("https://polygon-indexer.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \n\tfilter := &indexer.TransactionHistoryFilter{\n\t\tAccountAddress: &accountAddress,\n\t}\n\tincludeMetadata := true\n \n\t_, history, err := seqIndexer.GetTransactionHistory(context.Background(), filter, nil, &includeMetadata)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println("transaction history:", history)\n}","title":"Fetch the transaction history for any wallet address","titles":["Wallet transaction history"]},"38":{"href":"/api/indexer/transation-history-token-contract#contract-token-history","html":"\n\n","isPage":true,"text":"\nINTRODUCING THE SEQUENCE BUILDER - Our Indexer service is now managed through Sequence Builder. Sign up to grab your API access key.Get started with the Sequence Builder Free Plan today!\n","title":"Contract token history","titles":[]},"39":{"href":"/api/indexer/transation-history-token-contract#fetch--listen-to-the-transaction-history-for-any-erc20-erc721-erc1155-contract","html":"\n
This query is helpful to track transaction history of a particular token contract.\nIn this example, we use the Skyweaver token contract address 0x631998e91476DA5B870D741192fc5Cbc55F5a52E\non the Polygon network. You may query any contract address on any of the supported networks (but make\nsure to query the indexer of the corresponding network).
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n\nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n\n// here we query the Skyweaver contract address, but you can use any\nconst contractAddress = '0x631998e91476DA5B870D741192fc5Cbc55F5a52E'\n\n// query Sequence Indexer for all token details / supplies\n// try any contract address you'd like :)\nconst filter = {\n\tcontractAddress: contractAddress\n}\n\n// query Sequence Indexer for all token transaction history on Polygon\nconst transactionHistory = await indexer.getTransactionHistory({\n\tfilter: filter\n})\n\t\nconsole.log('transaction history of contract:', transactionHistory)
","isPage":false,"text":"\nThis query is helpful to track transaction history of a particular token contract.\nIn this example, we use the Skyweaver token contract address 0x631998e91476DA5B870D741192fc5Cbc55F5a52E\non the Polygon network. You may query any contract address on any of the supported networks (but make\nsure to query the indexer of the corresponding network).\nSequence Indexer GetTransactionHistory Method:\n\nRequest: POST /rpc/Indexer/GetTransactionHistory\nContent-Type: application/json\nBody (in JSON):\n\nfilter (object)\n\ncontractAddress (string) -- a ERC20 / ERC721 / ERC1155 contract address\n\n\n\n\n\n\nExample: GetTransactionHistory of Skyweaver contract on Polygon using an c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA\ncurl -X POST -H "Content-Type: application/json" -H "X-Access-Key: c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA" https://polygon-indexer.sequence.app/rpc/Indexer/GetTransactionHistory -d '{ "filter": { "accountAddress": "0x631998e91476DA5B870D741192fc5Cbc55F5a52E" }, "includeMetadata": true }'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n \nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n \n// here we query the Skyweaver contract address, but you can use any\nconst contractAddress = '0x631998e91476DA5B870D741192fc5Cbc55F5a52E'\n \n// query Sequence Indexer for all token details / supplies\n// try any contract address you'd like :)\nconst filter = {\n\tcontractAddress: contractAddress\n}\n \n// query Sequence Indexer for all token transaction history on Polygon\nconst transactionHistory = await indexer.getTransactionHistory({\n\tfilter: filter\n})\n\t\nconsole.log('transaction history of contract:', transactionHistory)import (\n\t"context"\n\t"fmt"\n\t"log"\n\t"net/http"\n \n\t"github.com/0xsequence/go-sequence/indexer"\n)\n \nfunc GetTransactionHistory(accountAddress string) {\n\tseqIndexer := indexer.NewIndexer("https://polygon-indexer.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \n\tfilter := &indexer.TransactionHistoryFilter{\n\t\tContractAddress: &contractAddress,\n\t}\n\tincludeMetadata := true\n \n\t_, history, err := seqIndexer.GetTransactionHistory(context.Background(), filter, nil, &includeMetadata)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println("transaction history:", history)\n}","title":"Fetch / listen to the transaction history for any ERC20, ERC721, ERC1155 contract.","titles":["Contract token history",null]},"40":{"href":"/api/indexer/unique-tokens#tokens-in-a-contract","html":"\n\n","isPage":true,"text":"\nINTRODUCING THE SEQUENCE BUILDER - Our Indexer service is now managed through Sequence Builder. Sign up to grab your API access key.Get started with the Sequence Builder Free Plan today!\n","title":"Tokens in a contract","titles":[]},"41":{"href":"/api/indexer/unique-tokens#fetch-all-unique-tokens-in-a-particular-erc207211155-contract-including-total-supplies","html":"\nFetches token supplies and metadata for any ERC20, ERC721, ERC1155 contract.\n
This query is helpful to render all tokens in a token contract, or to query the total token supplies.\nIn this example, we use the Skyweaver token contract address 0x631998e91476DA5B870D741192fc5Cbc55F5a52E\non the Polygon network. You may query any contract address on any of the supported networks (but make\nsure to query the indexer of the corresponding network).
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n\nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n\n// here we query the Skyweaver contract address, but you can use any\nconst contractAddress = '0x631998e91476DA5B870D741192fc5Cbc55F5a52E'\n\n// query Sequence Indexer for all token details / supplies\nconst tokenDetails = await indexer.getTokenSupplies({\n\tcontractAddress: contractAddress,\n\tincludeMetadata: true\n})\nconsole.log('token details of contract:', tokenDetails)
","isPage":false,"text":"\nFetches token supplies and metadata for any ERC20, ERC721, ERC1155 contract.\nThis query is helpful to render all tokens in a token contract, or to query the total token supplies.\nIn this example, we use the Skyweaver token contract address 0x631998e91476DA5B870D741192fc5Cbc55F5a52E\non the Polygon network. You may query any contract address on any of the supported networks (but make\nsure to query the indexer of the corresponding network).\nSequence Indexer GetTokenSupplies Method:\n\nRequest: POST /rpc/Indexer/GetTokenSupplies\nContent-Type: application/json\nBody (in JSON):\n\ncontractAddress (string) -- a ERC20 / ERC721 / ERC1155 contract address\nincludeMetadata (boolean - optional - default: false) -- toggle token metadata to be included in the response\nmetadataOptions (object - optional) -- additional options for metadata\n\nverifiedOnly (boolean - optional) -- return only contracts which are 'verified' to help reduce spam\nincludeContracts ([]string - optional) -- list of specific contract addresses to always be included, even if verifiedOnly is enabled.\n\n\n\n\n\n\nExample: GetTokenSupplies of Skyweaver contract on Polygon using an c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA\ncurl -X POST -H "Content-Type: application/json" -H "X-Access-Key: c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA" https://polygon-indexer.sequence.app/rpc/Indexer/GetTokenSupplies -d '{ "contractAddress": "0x631998e91476DA5B870D741192fc5Cbc55F5a52E", "includeMetadata": true }'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n \nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n \n// here we query the Skyweaver contract address, but you can use any\nconst contractAddress = '0x631998e91476DA5B870D741192fc5Cbc55F5a52E'\n \n// query Sequence Indexer for all token details / supplies\nconst tokenDetails = await indexer.getTokenSupplies({\n\tcontractAddress: contractAddress,\n\tincludeMetadata: true\n})\nconsole.log('token details of contract:', tokenDetails)go\nimport (\n\t"context"\n\t"fmt"\n\t"log"\n\t"net/http"\n \n\t"github.com/0xsequence/go-sequence/indexer"\n)\n \nfunc GetTokenSupplies(contractAddress string) {\n\tseqIndexer := indexer.NewIndexer("https://polygon-indexer.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \n\tfilter := &indexer.TransactionHistoryFilter{\n\t\tContractAddress: &contractAddress,\n\t}\n\tincludeMetadata := true\n \n\t_, tokenDetails, err := seqIndexer.GetTokenSupplies(context.Background(), filter, nil, &includeMetadata)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println("token details:", tokenDetails)\n}","title":"Fetch all unique tokens in a particular ERC20/721/1155 contract, including total supplies","titles":["Tokens in a contract",null]},"42":{"href":"/api/metadata/contract-metadata#contract-metadata","html":"\n
\n\n","isPage":true,"text":"\n\nLearn how to query contract-level metadata directly for any contract\nLearn about contract-level metadata for ERC20, ERC721 and ERC1155 tokens\n\nPRO TIP: Sequence Indexer also returns token metadataWhen using the Sequence Indexer, pass "includeMetadata": true to your request to\nquery token metadata for any ERC20, ERC721 or ERC1155 contract. See below how to fetch\ncontract-level metadata directly.\n","title":"Contract Metadata","titles":[]},"43":{"href":"/api/metadata/contract-metadata#fetch-contract-metadata-of-any-erc20-erc721-or-erc1155-contract-address","html":"\n
Sequence Metadata GetContractInfoBatch Method:
\n
\n
Request: POST /rpc/Metadata/GetContractInfoBatch
\n
Content-Type: application/json
\n
Body (in JSON):\n
\n
chainID (string) -- the chain id, as a name or number (ie. "1" or "mainnet", "137" or "polygon", etc.)
\n
contractAddresses (string of strings) -- array of contract addresses
\n
\n
\n
\n \nExample: GetContractInfoBatch of some contracts on Polygon using an c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA\n\n
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceMetadata } from '@0xsequence/metadata'\n\nconst metadataClient = new SequenceMetadata("https://metadata.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n\nconst contractMetadata = await metadataClient.getContractInfoBatch({\n chainID: 'polygon',\n contractAddresses: [\n '0x631998e91476DA5B870D741192fc5Cbc55F5a52E',\n '0x17b66009af459dc8ebf37acf8a8b355379be2fe5',\n '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',\n '0x2953399124f0cbb46d2cbacd8a89cf0599974963',\n '0x7227e371540cf7b8e512544ba6871472031f3335',\n '0x7c0ebabfc394ec6d926e801fe0e69a1f15a7fe4d',\n '0x8f3cf7ad23cd3cadbd9735aff958023239c6a063',\n '0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4'\n ]\n})\n\nconsole.log('Contract info for above addresses:', contractMetadata)
Please [contact our team](/support) for assistance with integrations to another target.
\n \n","isPage":false,"text":"\nSequence Metadata GetContractInfoBatch Method:\n\nRequest: POST /rpc/Metadata/GetContractInfoBatch\nContent-Type: application/json\nBody (in JSON):\n\nchainID (string) -- the chain id, as a name or number (ie. "1" or "mainnet", "137" or "polygon", etc.)\ncontractAddresses (string of strings) -- array of contract addresses\n\n\n\n\nExample: GetContractInfoBatch of some contracts on Polygon using an c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA\nThis code requires an API Access Key from Sequence Builder.\ncurl -X POST -H "Content-Type: application/json" -H "X-Access-Key: c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA" https://metadata.sequence.app/rpc/Metadata/GetContractInfoBatch -d '{ "chainID": "polygon", "contractAddresses": ["0x631998e91476DA5B870D741192fc5Cbc55F5a52E", "0x17b66009af459dc8ebf37acf8a8b355379be2fe5", "0x2791bca1f2de4661ed88a30c99a7a9449aa84174", "0x2953399124f0cbb46d2cbacd8a89cf0599974963", "0x7227e371540cf7b8e512544ba6871472031f3335", "0x7c0ebabfc394ec6d926e801fe0e69a1f15a7fe4d", "0x8f3cf7ad23cd3cadbd9735aff958023239c6a063", "0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4"] }'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceMetadata } from '@0xsequence/metadata'\n \nconst metadataClient = new SequenceMetadata("https://metadata.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \nconst contractMetadata = await metadataClient.getContractInfoBatch({\n chainID: 'polygon',\n contractAddresses: [\n '0x631998e91476DA5B870D741192fc5Cbc55F5a52E',\n '0x17b66009af459dc8ebf37acf8a8b355379be2fe5',\n '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',\n '0x2953399124f0cbb46d2cbacd8a89cf0599974963',\n '0x7227e371540cf7b8e512544ba6871472031f3335',\n '0x7c0ebabfc394ec6d926e801fe0e69a1f15a7fe4d',\n '0x8f3cf7ad23cd3cadbd9735aff958023239c6a063',\n '0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4'\n ]\n})\n \nconsole.log('Contract info for above addresses:', contractMetadata)import (\n\t"github.com/0xsequence/go-sequence/metadata"\n)\n \nseqMetadata := metadata.NewMetadata("c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \ncontractInfo, err := seqMetadata.GetContractInfo(context.Background(), "polygon", "0x631998e91476DA5B870D741192fc5Cbc55F5a52E")Please [contact our team](/support) for assistance with integrations to another target.\n\n","title":"Fetch contract metadata of any ERC20, ERC721 or ERC1155 contract address","titles":["Contract Metadata"]},"44":{"href":"/api/metadata/contract-metadata#contract-level-metadata-standards","html":"\n
\n\n","isPage":true,"text":"\nThe Sequence Metadata API service offers a simple and fast API to query token & NFT metadata\nfor Ethereum-compatible chains.\nTo learn how to use the Sequence Metadata service, please read:\n\nToken metadata API & standards\nContract-level metadata API & standards\nAlternative, REST API Usage\n\n\n","title":"Metadata","titles":[]},"46":{"href":"/api/metadata/overview#web--nodejs-installation","html":"\n
npm install 0xsequence
\n
or
\n
npm install @0xsequence/metadata
\n\n
then in your app (using your API Access Key),
\n
import { SequenceMetadata } from '@0xsequence/metadata'\n\nconst metadata = new SequenceMetadata('https://metadata.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')
\n
NOTE: if you're using @0xsequence/metadata from node.js, we recommend using node v18.x or newer.
\n","isPage":false,"text":"\nnpm install 0xsequence\nor\nnpm install @0xsequence/metadata\nThis installation requires an API Access Key from Sequence Builder.\nthen in your app (using your API Access Key),\nimport { SequenceMetadata } from '@0xsequence/metadata'\n \nconst metadata = new SequenceMetadata('https://metadata.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\nNOTE: if you're using @0xsequence/metadata from node.js, we recommend using node v18.x or newer.\n","title":"Web / node.js Installation","titles":["Metadata",null]},"47":{"href":"/api/metadata/overview#go-installation","html":"\n
go get -u github.com/0xsequence/go-sequence@latest
\n ","isPage":false,"text":"\nThe Sequence Metadata is integrated directly inside of the respective Sequence Unity and Sequence Unreal SDKs.\n","title":"Unity or Unreal Installation","titles":["Metadata",null]},"49":{"href":"/api/metadata/rest-api#metadata-rest-api-reference--usage","html":"\n
The Sequence Metadata API service offers a simple and fast API to query token & NFT metadata\nfor Ethereum-compatible chains.
\n
Quite simply, the Metadata API allows you to query the token metadata of any ERC20, ERC721 or ERC1155\ncontract on a number of supported Ethereum chains.
\n
As well, the Sequence Metadata service is automatically integrated in the Sequence Indexer.\nBut as we demonstrate below, it's also useful to be able to query the token/contract metadata directly too :)
\n\n","isPage":true,"text":"\nThe Sequence Metadata API service offers a simple and fast API to query token & NFT metadata\nfor Ethereum-compatible chains.\nQuite simply, the Metadata API allows you to query the token metadata of any ERC20, ERC721 or ERC1155\ncontract on a number of supported Ethereum chains.\nAs well, the Sequence Metadata service is automatically integrated in the Sequence Indexer.\nBut as we demonstrate below, it's also useful to be able to query the token/contract metadata directly too :)\nPRO TIP: RPC vs REST endpointsSequence Metadata service is available with both RPC and REST endpoints. We recommend the RPC endpoints\nfor your application, but the REST endpoints are an available option for convenience.For RPC endpoint see Token metadata RPC and Contract metadata RPC.\n","title":"Metadata REST API Reference & Usage","titles":[]},"50":{"href":"/api/metadata/rest-api#example","html":"\n
Let's say you'd like to query the metadata of a Skyweaver 1155 card on the Polygon network. Of course, the\nbelow example will work for any network / contract / token combination as well.
\n
First, the Skyweaver 1155 assets contract is located at address 0x631998e91476DA5B870D741192fc5Cbc55F5a52E\non the Polygon network. Second, let's build the metadata lookup endpoint to query Skyweaver's contract\nfor token ID 20:
Feel free to try tweaking the metadata.sequence.app URL above for your own contract, or another popular\nproject to see how the responses come back. You can change the network to one of our supported networks\nand specify any contract and/or token id.
\n
In addition to easily querying token-level metadata like in the above example, you can also query contract-level metadata.\nContract-level metadata provides you more information about a contract address such as a name, contract type, logo, and description.\nSimply change the metadata URL above to just query the contract address: https://metadata.sequence.app/tokens/polygon/0x631998e91476DA5B870D741192fc5Cbc55F5a52E
\n
and see result:
\n
{\n "chainId": 137,\n "address": "0x631998e91476da5b870d741192fc5cbc55f5a52e",\n "name": "Skyweaver",\n "type": "ERC1155",\n "symbol": "SKYWVR",\n "logoURI": "https://assets.skyweaver.net/_tX5dRVi/webapp/icons/skyweaver-token.png",\n "extensions": {\n "link": "https://www.skyweaver.net/",\n "description": "Skyweaver is a Free-to-Play, trading card game powered by Polygon and Ethereum.",\n "ogImage": "https://skyweaver.net/images/skyweavercover.jpg",\n "originAddress": "0x631998e91476da5b870d741192fc5cbc55f5a52e"\n }\n}
\n \n","isPage":false,"text":"\nLet's say you'd like to query the metadata of a Skyweaver 1155 card on the Polygon network. Of course, the\nbelow example will work for any network / contract / token combination as well.\nFirst, the Skyweaver 1155 assets contract is located at address 0x631998e91476DA5B870D741192fc5Cbc55F5a52E\non the Polygon network. Second, let's build the metadata lookup endpoint to query Skyweaver's contract\nfor token ID 20:\nRequest:\nhttps://metadata.sequence.app/tokens/polygon/0x631998e91476DA5B870D741192fc5Cbc55F5a52E/20\nResponse:\n[\n {\n "tokenId": "20",\n "contractAddress": "0x631998e91476da5b870d741192fc5cbc55f5a52e",\n "name": "Unstoppable Chop",\n "description": "Attach Silence to target unit. Do 4 damage to it.",\n "image": "https://assets.skyweaver.net/TNqWLuJZ/webapp/cards/full-cards/6x/20-silver.png",\n "decimals": 2,\n "properties": {\n "baseCardId": 20,\n "goldCardId": 131092,\n "grade": "oldSilver",\n "id": 20,\n "silverCardId": 65556\n },\n "attributes": null\n }\n]\nIf you'd like to query a number of tokens at the same time, you can include more token ids comma-separated:\nhttps://metadata.sequence.app/tokens/polygon/0x631998e91476DA5B870D741192fc5Cbc55F5a52E/20,21,22 -- click\nto see the JSON response to query token ids 20, 21, and 22 in a single batched request.\nFeel free to try tweaking the metadata.sequence.app URL above for your own contract, or another popular\nproject to see how the responses come back. You can change the network to one of our supported networks\nand specify any contract and/or token id.\nIn addition to easily querying token-level metadata like in the above example, you can also query contract-level metadata.\nContract-level metadata provides you more information about a contract address such as a name, contract type, logo, and description.\nSimply change the metadata URL above to just query the contract address: https://metadata.sequence.app/tokens/polygon/0x631998e91476DA5B870D741192fc5Cbc55F5a52E\nand see result:\n{\n "chainId": 137,\n "address": "0x631998e91476da5b870d741192fc5cbc55f5a52e",\n "name": "Skyweaver",\n "type": "ERC1155",\n "symbol": "SKYWVR",\n "logoURI": "https://assets.skyweaver.net/_tX5dRVi/webapp/icons/skyweaver-token.png",\n "extensions": {\n "link": "https://www.skyweaver.net/",\n "description": "Skyweaver is a Free-to-Play, trading card game powered by Polygon and Ethereum.",\n "ogImage": "https://skyweaver.net/images/skyweavercover.jpg",\n "originAddress": "0x631998e91476da5b870d741192fc5cbc55f5a52e"\n }\n}\n\n","title":"Example","titles":["Metadata REST API Reference & Usage"]},"51":{"href":"/api/metadata/rest-api#usage","html":"\n
The Metadata API service is accessible either with a simple REST interface, or a RPC client.\nFor the RPC client, we offer Web browser, node and Go clients. We recommend the RPC client for most integrations, but\nmake the REST interface available for convenience.
\n \n","isPage":false,"text":"\nThe Metadata API service is accessible either with a simple REST interface, or a RPC client.\nFor the RPC client, we offer Web browser, node and Go clients. We recommend the RPC client for most integrations, but\nmake the REST interface available for convenience.\n\n","title":"Usage","titles":["Metadata REST API Reference & Usage"]},"52":{"href":"/api/metadata/rest-api#rest-endpoints","html":"\n
As mentioned in the example above. The general format of the REST endpoint is:
\n
GET https://metadata.sequence.app/tokens/<network>/<contractAddress>[/<tokenID>]
\n \n","isPage":false,"text":"\nAs mentioned in the example above. The general format of the REST endpoint is:\nGET https://metadata.sequence.app/tokens/<network>/<contractAddress>[/<tokenID>]\nWhere <network> must be one of the Chain ID or Chain Handle of the supported networks.\n\nFetch contract-level metadata:\nGET https://metadata.sequence.app/tokens/<network>/<contractAddress>\nExample: https://metadata.sequence.app/tokens/polygon/0x631998e91476DA5B870D741192fc5Cbc55F5a52E\n\nFetch token-level metadata:\nGET https://metadata.sequence.app/tokens/<network>/<contractAddress>/<tokenID>[,<tokenID>,...]\nExamples:\n\nhttps://metadata.sequence.app/tokens/polygon/0x631998e91476DA5B870D741192fc5Cbc55F5a52E/20\nhttps://metadata.sequence.app/tokens/polygon/0x631998e91476DA5B870D741192fc5Cbc55F5a52E/20,21\n\n\n","title":"REST endpoints","titles":["Metadata REST API Reference & Usage"]},"53":{"href":"/api/metadata/rest-api#rpc-client","html":"\n
The Metadata RPC interface offers the full capabilities of the Metadata service.
\n
We provide SDKs for Web / node.js and Go.\nOr if you'd like to integrate the Metadata service with another language target, simply follow the API reference below\nto implement the HTTP requests. Additionally, read the Typescript client source code as reference\nimplementation of the Metadata RPC client as well.
\n","isPage":false,"text":"\nThe Metadata RPC interface offers the full capabilities of the Metadata service.\nWe provide SDKs for Web / node.js and Go.\nOr if you'd like to integrate the Metadata service with another language target, simply follow the API reference below\nto implement the HTTP requests. Additionally, read the Typescript client source code as reference\nimplementation of the Metadata RPC client as well.\n","title":"RPC Client","titles":["Metadata REST API Reference & Usage"]},"54":{"href":"/api/metadata/rest-api#metadata-rpc-methods","html":"\n
GetTokenMetadata - fetch token metadata of ERC721 or ERC1155 tokens from a single contract
\n
GetTokenMetadataBatch - fetch token metadata of ERC721 or ERC1155 token from a batch of contracts
\n
GetContractInfo - fetch contract metadata of an ERC20, ERC721 or ERC1155 contract address
\n
GetContractInfoBatch - fetch contract metadata of a batch of ERC20, ERC721 or ERC1155 contract addresses
\n
","isPage":false,"text":"\nMetadata API endpoint: https://metadata.sequence.app\nMetadata RPC methods:\n\nGetTokenMetadata - fetch token metadata of ERC721 or ERC1155 tokens from a single contract\nGetTokenMetadataBatch - fetch token metadata of ERC721 or ERC1155 token from a batch of contracts\nGetContractInfo - fetch contract metadata of an ERC20, ERC721 or ERC1155 contract address\nGetContractInfoBatch - fetch contract metadata of a batch of ERC20, ERC721 or ERC1155 contract addresses\n","title":"Metadata RPC Methods","titles":["Metadata REST API Reference & Usage"]},"55":{"href":"/api/metadata/token-metadata#token-metadata","html":"\n
Sequence provides a metadata service for fetching token metadata for any ERC721 or ERC1155 contract, on any EVM chain.
\n\n","isPage":true,"text":"\nSequence provides a metadata service for fetching token metadata for any ERC721 or ERC1155 contract, on any EVM chain.\n\nLearn how to query token metadata directly for any contract\nLearn about token metadata standards and formats for ERC721 and ERC1155 tokens\n\nPRO TIP: Sequence Indexer also supports token metadataWhen using the Sequence Indexer, pass "includeMetadata": true to your request to\nquery token metadata for any ERC721 or ERC1155 contract. See below how to fetch\ntoken metadata directly.\n","title":"Token Metadata","titles":[]},"56":{"href":"/api/metadata/token-metadata#fetch-token-metadata-for-any-erc721-or-erc1155-contract","html":"\n
Sequence Metadata GetTokenMetadata Method:
\n
\n
Request: POST /rpc/Metadata/GetTokenMetadata
\n
Content-Type: application/json
\n
Body (in JSON):\n
\n
chainID (string) -- the chain id, as a name or number (ie. "1" or "mainnet", "137" or "polygon", etc.)
\n
contractAddress (string) -- the contract address
\n
tokenIDs (array of strings) -- array of strings containing token ids to fetch metadata
\n
\n
\n
\n \nExample: GetTokenMetadata of some tokens using an c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA\n\n
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceMetadata } from '@0xsequence/metadata'\n\nconst metadataClient = new SequenceMetadata("https://metadata.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n\nconst tokenMetadata = await metadataClient.getTokenMetadata({\n chainID: 'polygon',\n contractAddress: '0x631998e91476DA5B870D741192fc5Cbc55F5a52E',\n tokenIDs: ['65537', '65538', '65539']\n})\n\nconsole.log('token metadata: ', tokenMetadata)
Please [contact our team](/support) for assistance with integrations to another target.
\n","isPage":false,"text":"\nSequence Metadata GetTokenMetadata Method:\n\nRequest: POST /rpc/Metadata/GetTokenMetadata\nContent-Type: application/json\nBody (in JSON):\n\nchainID (string) -- the chain id, as a name or number (ie. "1" or "mainnet", "137" or "polygon", etc.)\ncontractAddress (string) -- the contract address\ntokenIDs (array of strings) -- array of strings containing token ids to fetch metadata\n\n\n\n\nExample: GetTokenMetadata of some tokens using an c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA\nThis code requires an API Access Key from Sequence Builder.\ncurl -X POST -H "Content-Type: application/json" -H "X-Access-Key: c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA" https://metadata.sequence.app/rpc/Metadata/GetTokenMetadata -d '{"chainID":"polygon", "contractAddress": "0x631998e91476DA5B870D741192fc5Cbc55F5a52E", "tokenIDs": ["65537", "65538", "65539"] }'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceMetadata } from '@0xsequence/metadata'\n \nconst metadataClient = new SequenceMetadata("https://metadata.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \nconst tokenMetadata = await metadataClient.getTokenMetadata({\n chainID: 'polygon',\n contractAddress: '0x631998e91476DA5B870D741192fc5Cbc55F5a52E',\n tokenIDs: ['65537', '65538', '65539']\n})\n \nconsole.log('token metadata: ', tokenMetadata)import (\n\t"github.com/0xsequence/go-sequence/metadata"\n)\n \nseqMetadata := metadata.NewMetadata("c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \ncollectibleInfo, err := seqMetadata.GetTokenMetadata(context.Background(), "polygon", "0x631998e91476DA5B870D741192fc5Cbc55F5a52E", []string{"1", "2"})TODOTODOPlease [contact our team](/support) for assistance with integrations to another target.\n","title":"Fetch token metadata for any ERC721 or ERC1155 contract","titles":["Token Metadata"]},"57":{"href":"/api/metadata/token-metadata#refreshing-token-metadata","html":"\n
When deploying new contracts or metadata updates the refresh token metadata url should be called with an access key from (the Sequence Builder) via a HTTPS POST request by command line or via metadata SDK in a program for data to indexeable in the Sequence Indexer metadata service.
\n
Sequence Metadata enqueueTokensForRefresh Method:
\n
\n
Request: POST /rpc/Metadata/EnqueueTokensForRefresh
\n
Content-Type: application/json
\n
Body (in JSON):\n
\n
chainID (string) -- the chain id, as a name or number (ie. "1" or "mainnet", "137" or "polygon", etc.)
\n
contractAddress (string) -- the contract address
\n
tokenIDs (array of strings) -- array of strings containing token ids to fetch metadata
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceMetadata } from '@0xsequence/metadata'\n\nconst metadataClient = new SequenceMetadata("https://metadata.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n\nconst jobID = await metadataClient.enqueueTokensForRefresh({\n chainID: 'polygon',\n contractAddress: '0x631998e91476DA5B870D741192fc5Cbc55F5a52E',\n tokenIDs: ['65537', '65538', '65539']\n})\n\nconsole.log('refresh job id: ', tokenMetadata)
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceMetadata } from '@0xsequence/metadata'\n\nconst metadataClient = new SequenceMetadata("https://metadata.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n\nconst refreshJobStatus = await metadataClient.getTokenRefreshStatus({\n taskId: 1234\n})\n\nconsole.log('refresh job status: ', refreshJobStatus)
Please [contact our team](/support) for assistance with integrations to another target.
\n","isPage":false,"text":"\nWhen deploying new contracts or metadata updates the refresh token metadata url should be called with an access key from (the Sequence Builder) via a HTTPS POST request by command line or via metadata SDK in a program for data to indexeable in the Sequence Indexer metadata service.\nSequence Metadata enqueueTokensForRefresh Method:\n\nRequest: POST /rpc/Metadata/EnqueueTokensForRefresh\nContent-Type: application/json\nBody (in JSON):\n\nchainID (string) -- the chain id, as a name or number (ie. "1" or "mainnet", "137" or "polygon", etc.)\ncontractAddress (string) -- the contract address\ntokenIDs (array of strings) -- array of strings containing token ids to fetch metadata\n\n\n\ncurl -v -X POST -H "Content-type: application/json" -H "X-Access-Key: wuELppeX0pttvJABl8bIuxPAAAAAAAAAA" https://metadata.sequence.app/rpc/Metadata/EnqueueTokensForRefresh -d '{"chainID":"polygon", "contractAddress":"0x631998e91476DA5B870D741192fc5Cbc55F5a52E", "tokenIDs": ["1","2"]}'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceMetadata } from '@0xsequence/metadata'\n \nconst metadataClient = new SequenceMetadata("https://metadata.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \nconst jobID = await metadataClient.enqueueTokensForRefresh({\n chainID: 'polygon',\n contractAddress: '0x631998e91476DA5B870D741192fc5Cbc55F5a52E',\n tokenIDs: ['65537', '65538', '65539']\n})\n \nconsole.log('refresh job id: ', tokenMetadata)import (\n\t"github.com/0xsequence/go-sequence/metadata"\n)\n \nseqMetadata := metadata.NewMetadata("c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \nrefreshJob, err := seqMetadata.EnqueueTokensForRefresh(context.Background(), "polygon", "0x631998e91476DA5B870D741192fc5Cbc55F5a52E", []string{"1", "2"}, nil)Please [contact our team](/support) for assistance with integrations to another target.\nSequence Metadata getTokenRefreshStatus Method:\n\nRequest: POST /rpc/Metadata/GetTokenRefreshStatus\nContent-Type: application/json\nBody (in JSON):\n\ntaskId (uint) -- the task id returned from enqueueTokensForRefresh\n\n\n\ncurl -v -X POST -H "Content-type: application/json" -H "X-Access-Key: wuELppeX0pttvJABl8bIuxPAAAAAAAAAA" https://metadata.sequence.app/rpc/Metadata/GetTokenRefreshStatus -d '{"taskId": 1234}'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceMetadata } from '@0xsequence/metadata'\n \nconst metadataClient = new SequenceMetadata("https://metadata.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \nconst refreshJobStatus = await metadataClient.getTokenRefreshStatus({\n taskId: 1234\n})\n \nconsole.log('refresh job status: ', refreshJobStatus)import (\n\t"github.com/0xsequence/go-sequence/metadata"\n)\n \nseqMetadata := metadata.NewMetadata("c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \nrefreshJobStatus, err := seqMetadata.GetTokenRefreshStatus(context.Background(), uint64(1234))Please [contact our team](/support) for assistance with integrations to another target.\n","title":"Refreshing token metadata","titles":["Token Metadata"]},"58":{"href":"/api/metadata/token-metadata#testing-instructions","html":"\n\n
\n\n","isPage":false,"text":"\n\nCheck current token metadata using token metadata fetch\nModify token metadata content either onchain or via token baseURI\nCall refresh token ID endpoints using refresh metadata\nCheck token metadata changes using token metadata fetch\n\n","title":"Testing instructions:","titles":["Token Metadata","Refreshing token metadata"]},"59":{"href":"/api/metadata/token-metadata#token-metadata-standards","html":"\n
Popular token standards like EIP721 and EIP1155 both\nhave similar metadata standard formats with some subtle differences. In addition to the standards, we've seen in practice that projects\noften slightly deviate from the standards but are sensical, easy to parse and well supported in the ecosystem, include the Sequence Metadata service.\nBelow we describe the standards and common practices across projects to help demystify how to format your token metadata for your projects.
\n","isPage":false,"text":"\nPopular token standards like EIP721 and EIP1155 both\nhave similar metadata standard formats with some subtle differences. In addition to the standards, we've seen in practice that projects\noften slightly deviate from the standards but are sensical, easy to parse and well supported in the ecosystem, include the Sequence Metadata service.\nBelow we describe the standards and common practices across projects to help demystify how to format your token metadata for your projects.\n","title":"Token Metadata Standards","titles":["Token Metadata"]},"60":{"href":"/api/metadata/token-metadata#metadata-standards","html":"\n","isPage":false,"text":"\n","title":"Metadata Standards","titles":["Token Metadata"]},"61":{"href":"/api/metadata/token-metadata#erc721","html":"\n
ERC721 token contracts contain a method on the contract called tokenURI(uint256) string. When querying the tokenURI method on the contract, it will return a URI which contains additional metadata for that asset.
In the case of this Bored Ape, it appears there is no name or description set,\nbut they do have "attributes" as an array of { "trait_type": string, "value: string }.
Note that OpenSea technically breaks the ERC1155 standard by suggesting to use "attributes", where in fact,\nthe ERC1155 calls uses the field name "properties" instead of "attributes", see\nhttps://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema (read section below).\nHowever this is completely okay and mixed use of properties / attributes is compatible in practice.\nOn Sequence Metadata, we support both structures for token contracts which use either format for their properties/attributes.
\n","isPage":false,"text":"\nERC721 token contracts contain a method on the contract called tokenURI(uint256) string. When querying the tokenURI method on the contract, it will return a URI which contains additional metadata for that asset.\nSee EIP for specific details: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\nHere is an example Bored Ape (token id 9):\nhttps://metadata.sequence.app/tokens/mainnet/0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d/9\nresponse:\n{\n "tokenId": "9",\n "contractAddress": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d",\n "name": "",\n "description": "",\n "image": "https://ipfs.sequence.info/ipfs/QmUQgKka8EW7exiUHnMwZ4UoXA11wV7NFjHAogVAbasSYy",\n "decimals": 0,\n "properties": null,\n "attributes": [\n {\n "trait_type": "Earring",\n "value": "Silver Stud"\n },\n {\n "trait_type": "Eyes",\n "value": "Sleepy"\n },\n {\n "trait_type": "Mouth",\n "value": "Small Grin"\n },\n {\n "trait_type": "Fur",\n "value": "Brown"\n },\n {\n "trait_type": "Hat",\n "value": "Seaman's Hat"\n },\n {\n "trait_type": "Clothes",\n "value": "Stunt Jacket"\n },\n {\n "trait_type": "Background",\n "value": "Purple"\n }\n ]\n}\nIn the case of this Bored Ape, it appears there is no name or description set,\nbut they do have "attributes" as an array of { "trait_type": string, "value: string }.\nAdditionally, see OpenSea for more information: https://docs.opensea.io/docs/metadata-standards\nNote that OpenSea technically breaks the ERC1155 standard by suggesting to use "attributes", where in fact,\nthe ERC1155 calls uses the field name "properties" instead of "attributes", see\nhttps://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema (read section below).\nHowever this is completely okay and mixed use of properties / attributes is compatible in practice.\nOn Sequence Metadata, we support both structures for token contracts which use either format for their properties/attributes.\nAnother example is from Neon District: https://metadata.sequence.app/tokens/polygon/0x7227e371540CF7b8e512544Ba6871472031F3335/158456331411102687640546264635\n","title":"ERC721","titles":["Token Metadata","Metadata Standards"]},"62":{"href":"/api/metadata/token-metadata#erc1155","html":"\n
ERC1155 token contracts contain a method on the contract called uri(uint256) string. When querying the uri method on the\ncontract, it will return a URI which contains additional metadata for that asset.
{\n "tokenId": "65548",\n "contractAddress": "0x27a11c1563a5dda238379b95c91b3abbad9c0cf6",\n "name": "Weighted Die (Silver)",\n "description": "Give +1/+1, armor, and guard to a random ally unit, six times.\\n\\n\\"I will not bow to fate. If the dice fall against me, I'll cut off the hand that cast them.\\"\\n -Horik",\n "image": "https://assets.skyweaver.net/LV7xNcQh/webapp/cards/full-cards/6x/12-silver.png",\n "decimals": 2,\n "properties": {\n "artists": {\n "name": "Artist",\n "value": [\n {\n "id": "xavi",\n "name": "Henrique Xavier",\n "url": "https://www.artstation.com/kitexavier"\n }\n ]\n },\n "baseCardId": 12,\n "cardType": "Spell",\n "element": "Metal",\n "mana": 8,\n "prism": "Strength",\n "type": "Silver"\n },\n "attributes": null\n}
\n
As you can see, Skyweaver an ERC1155 token's metadata uses the properties object, which is an object/dictionary type of arbitrary data.
\n","isPage":false,"text":"\nERC1155 token contracts contain a method on the contract called uri(uint256) string. When querying the uri method on the\ncontract, it will return a URI which contains additional metadata for that asset.\nSee EIP for specific details: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema\nHere is an example Skyweaver card (token id 65548):\nhttps://metadata.sequence.app/tokens/polygon/0x27A11C1563a5dDa238379B95c91B3AbBaD9C0cf6/65548\n{\n "tokenId": "65548",\n "contractAddress": "0x27a11c1563a5dda238379b95c91b3abbad9c0cf6",\n "name": "Weighted Die (Silver)",\n "description": "Give +1/+1, armor, and guard to a random ally unit, six times.\\n\\n\\"I will not bow to fate. If the dice fall against me, I'll cut off the hand that cast them.\\"\\n -Horik",\n "image": "https://assets.skyweaver.net/LV7xNcQh/webapp/cards/full-cards/6x/12-silver.png",\n "decimals": 2,\n "properties": {\n "artists": {\n "name": "Artist",\n "value": [\n {\n "id": "xavi",\n "name": "Henrique Xavier",\n "url": "https://www.artstation.com/kitexavier"\n }\n ]\n },\n "baseCardId": 12,\n "cardType": "Spell",\n "element": "Metal",\n "mana": 8,\n "prism": "Strength",\n "type": "Silver"\n },\n "attributes": null\n}\nAs you can see, Skyweaver an ERC1155 token's metadata uses the properties object, which is an object/dictionary type of arbitrary data.\n","title":"ERC1155","titles":["Token Metadata","Metadata Standards"]},"63":{"href":"/api/metadata/token-metadata#attributes-vs-properties","html":"\n
As you can see, the standard format of token metadata contains both attributes and properties. The attributes field is an array of\nobjects. The properties field is an object/dictionary of arbitrary data. In technical terms, the attributes type is defined as\n[]map<string,any> and the properties type is defined as map<string,any>.
\n
In practice, we've seen that many projects use both attributes and properties to store the same data, and in some cases, they use\nattributes to store data that should be in properties and vice versa. Sometimes project use both fields, and this is completely fine\nin practice, as marketplaces and services will parse both areas.
\n
Finally, if you are looking to extend the metadata format to suit your project, we recommend to utilize either or both the attributes\nand properties fields for either ERC721 or ERC1155.
\n","isPage":false,"text":"\nAs you can see, the standard format of token metadata contains both attributes and properties. The attributes field is an array of\nobjects. The properties field is an object/dictionary of arbitrary data. In technical terms, the attributes type is defined as\n[]map<string,any> and the properties type is defined as map<string,any>.\nIn practice, we've seen that many projects use both attributes and properties to store the same data, and in some cases, they use\nattributes to store data that should be in properties and vice versa. Sometimes project use both fields, and this is completely fine\nin practice, as marketplaces and services will parse both areas.\nFinally, if you are looking to extend the metadata format to suit your project, we recommend to utilize either or both the attributes\nand properties fields for either ERC721 or ERC1155.\n","title":"Attributes vs Properties","titles":["Token Metadata","Metadata Standards"]},"64":{"href":"/api/metadata/token-metadata#erc20","html":"\n
Finally, a note on ERC20 tokens. ERC20 tokens are just a single token, so they themselves do not have a token ID, but\nare represented entirely by their contract address. We can infer some information about the token by querying the contract\nmethods such as name and decimals. Additionally, ERC20 tokens can take advantage of the contractURI extension used\nby OpenSea and described in more detail in our Contract metadata section.
","isPage":false,"text":"\nFinally, a note on ERC20 tokens. ERC20 tokens are just a single token, so they themselves do not have a token ID, but\nare represented entirely by their contract address. We can infer some information about the token by querying the contract\nmethods such as name and decimals. Additionally, ERC20 tokens can take advantage of the contractURI extension used\nby OpenSea and described in more detail in our Contract metadata section.","title":"ERC20","titles":["Token Metadata","Metadata Standards"]},"65":{"href":"/guides/templates/02-building-relaying-server#building-a-relaying-server","html":"\n
With Sequence, you can create a smart contract wallet your server can use to dispatch transactions for your users\nwithout you having to be worried about transaction speed, throughput and re-orgs.
\n
:::info Sequentual Transactions\nBy default, Sequence transactions will be executed sequentially.\n:::
\n","isPage":true,"text":"\nWith Sequence, you can create a smart contract wallet your server can use to dispatch transactions for your users\nwithout you having to be worried about transaction speed, throughput and re-orgs.\n:::info Sequentual Transactions\nBy default, Sequence transactions will be executed sequentially.\n:::\n","title":"Building a Relaying Server","titles":[]},"66":{"href":"/guides/templates/02-building-relaying-server#nodejs-server","html":"\n
Your server will need an EOA wallet that will be able to sign messages. It will be the owner of your server-side Sequence\nwallet which will be used to dispatch transactions.
\n
This Sequence wallet should have the correct ownership at your contract level, not the EOA.\nAlso, the Sequence wallet should be sufficiently funded in order to pay fees needed by the relayer to dispatch your transactions.
\n
Using this approach - versus the next section (with sponsoring) - includes the ability to pay for gas in any available currency by our relayer (e.g. 'MATIC', 'DAI', 'USDC', 'WETH').
\n
import { Session } from "@0xsequence/auth";\n\n// Create your server EOA\nconst walletEOA = new ethers.Wallet(serverPrivateKey, provider);\n\n// Open a Sequence session, this will find or create\n// a Sequence wallet controlled by your server EOA\nconst session = await Session.singleSigner({\n signer: walletEOA,\n projectAccessKey: "<access_key>",\n});\n\n// Get the Sequence wallet address\nconsole.log(session.account.address);\n\n// Get a signer for a specific network\n// - 1: Ethereum Mainnet\n// - 137: Polygon Mainnet\n// - 42161: Arbitrum One\n// See https://chainid.network/ for more\nconst signer = session.account.getSigner(137);\n\n// Craft your transaction\nconst erc721Interface = new ethers.utils.Interface([\n "function safeTransferFrom(address _from, address _to, uint256 _tokenId)",\n]);\n\nconst data = erc721Interface.encodeFunctionData("safeTransferFrom", [\n senderAddress,\n recipientAddress,\n id,\n]);\n\nconst txn = {\n to: erc721TokenAddress,\n data,\n};\n\n// Send the transaction\nconst txnResponse = await signer.sendTransaction(txn);\n\n// Check if transaction was successful\nif (txnReceipt.status != 1) {\n console.log(`Unexpected status: ${txnReceipt.status}`);\n}
\n
You can also enforce a specific way to pay for gas fees, or the openning of a specific Sequence wallet.
\n
import { Session } from '@0xsequence/auth'\n\n// Create your server EOA\nconst walletEOA = new ethers.Wallet(serverPrivateKey, provider)\n\n// Open a Sequence session, this will find or create\n// a Sequence wallet controlled by your server EOA\nconst session = await Session.singleSigner({\n signer: walletEOA,\n projectAccessKey: '<access_key>'\n // OPTIONAL: Multiple wallets could be found for the same EOA\n // to enforce a specific wallet you can use the following callback\n selectWallet: async (wallets: string[]) => {\n const found = wallets.find(w => w === EXPECTED_WALLET_ADDRESS)\n if (!found) throw Error('wallet not found')\n // Returning the wallet address will make the session use it\n // returning undefined will make the session create a new wallet\n return found\n }\n})\n\nconst signer = session.account.getSigner(137, {\n // OPTIONAL: You can also enforce a specific way to pay for gas fees\n // if not provided the sdk will select one for you\n selectFee: async (\n _txs: any,\n options: FeeOption[]\n ) => {\n // Find the option to pay with native tokens\n const found = options.find(o => !o.token.contractAddress)\n if (!found) throw Error('fee option not found')\n return found\n }\n})\n\n// Initialize the contract\nconst usdc = new ethers.Contract(\n '0x2791bca1f2de4661ed88a30c99a7a9449aa84174', // USDC on Polygon\n ERC_20_ABI,\n signer\n)\n\n// Send the transaction\nconst txnResponse = await usdc.transfer(recipient, 1)\n\n// Check if transaction was successful\nif (txnReceipt.status != 1) {\n console.log(`Unexpected status: ${txnReceipt.status}`)\n}
\n
:::caution Triggers migration
\n
Openning a session may trigger a migration of your Sequence wallet to a new version, this could be v1 to v2 or v2 to future versions.
\n
Migration is a one-way process, once your wallet is migrated it cannot be reverted to a previous version.
\n
To catch any unwanted migration, you can use the onMigration callback.\n:::
\n","isPage":false,"text":"\nYour server will need an EOA wallet that will be able to sign messages. It will be the owner of your server-side Sequence\nwallet which will be used to dispatch transactions.\nThis Sequence wallet should have the correct ownership at your contract level, not the EOA.\nAlso, the Sequence wallet should be sufficiently funded in order to pay fees needed by the relayer to dispatch your transactions.\nUsing this approach - versus the next section (with sponsoring) - includes the ability to pay for gas in any available currency by our relayer (e.g. 'MATIC', 'DAI', 'USDC', 'WETH').\nimport { Session } from "@0xsequence/auth";\n \n// Create your server EOA\nconst walletEOA = new ethers.Wallet(serverPrivateKey, provider);\n \n// Open a Sequence session, this will find or create\n// a Sequence wallet controlled by your server EOA\nconst session = await Session.singleSigner({\n signer: walletEOA,\n projectAccessKey: "<access_key>",\n});\n \n// Get the Sequence wallet address\nconsole.log(session.account.address);\n \n// Get a signer for a specific network\n// - 1: Ethereum Mainnet\n// - 137: Polygon Mainnet\n// - 42161: Arbitrum One\n// See https://chainid.network/ for more\nconst signer = session.account.getSigner(137);\n \n// Craft your transaction\nconst erc721Interface = new ethers.utils.Interface([\n "function safeTransferFrom(address _from, address _to, uint256 _tokenId)",\n]);\n \nconst data = erc721Interface.encodeFunctionData("safeTransferFrom", [\n senderAddress,\n recipientAddress,\n id,\n]);\n \nconst txn = {\n to: erc721TokenAddress,\n data,\n};\n \n// Send the transaction\nconst txnResponse = await signer.sendTransaction(txn);\n \n// Check if transaction was successful\nif (txnReceipt.status != 1) {\n console.log(`Unexpected status: ${txnReceipt.status}`);\n}\nYou can also enforce a specific way to pay for gas fees, or the openning of a specific Sequence wallet.\nimport { Session } from '@0xsequence/auth'\n \n// Create your server EOA\nconst walletEOA = new ethers.Wallet(serverPrivateKey, provider)\n \n// Open a Sequence session, this will find or create\n// a Sequence wallet controlled by your server EOA\nconst session = await Session.singleSigner({\n signer: walletEOA,\n projectAccessKey: '<access_key>'\n // OPTIONAL: Multiple wallets could be found for the same EOA\n // to enforce a specific wallet you can use the following callback\n selectWallet: async (wallets: string[]) => {\n const found = wallets.find(w => w === EXPECTED_WALLET_ADDRESS)\n if (!found) throw Error('wallet not found')\n // Returning the wallet address will make the session use it\n // returning undefined will make the session create a new wallet\n return found\n }\n})\n \nconst signer = session.account.getSigner(137, {\n // OPTIONAL: You can also enforce a specific way to pay for gas fees\n // if not provided the sdk will select one for you\n selectFee: async (\n _txs: any,\n options: FeeOption[]\n ) => {\n // Find the option to pay with native tokens\n const found = options.find(o => !o.token.contractAddress)\n if (!found) throw Error('fee option not found')\n return found\n }\n})\n \n// Initialize the contract\nconst usdc = new ethers.Contract(\n '0x2791bca1f2de4661ed88a30c99a7a9449aa84174', // USDC on Polygon\n ERC_20_ABI,\n signer\n)\n \n// Send the transaction\nconst txnResponse = await usdc.transfer(recipient, 1)\n \n// Check if transaction was successful\nif (txnReceipt.status != 1) {\n console.log(`Unexpected status: ${txnReceipt.status}`)\n}\n:::caution Triggers migration\nOpenning a session may trigger a migration of your Sequence wallet to a new version, this could be v1 to v2 or v2 to future versions.\nMigration is a one-way process, once your wallet is migrated it cannot be reverted to a previous version.\nTo catch any unwanted migration, you can use the onMigration callback.\n:::\n","title":"Nodejs Server","titles":["Building a Relaying Server"]},"67":{"href":"/guides/templates/02-building-relaying-server#nodejs-server-with-gas-sponsoring-using-sequence-builder","html":"\n
If you want to have your transactions sponsored & paid for with a credit card, you can follow the below steps before beginning your code, at the following link: https://sequence.build/
\n
By sponsoring your transaction, you can now just send the transaction without a fee object and not have to fund the smart contract wallet before relaying any transactions.
\n
:::info Already Deployed Contract\nFor this example, we assume you have a smart contract deployed with a contract address to include in the last step.\n:::
\n","isPage":false,"text":"\nIf you want to have your transactions sponsored & paid for with a credit card, you can follow the below steps before beginning your code, at the following link: https://sequence.build/\nBy sponsoring your transaction, you can now just send the transaction without a fee object and not have to fund the smart contract wallet before relaying any transactions.\n:::info Already Deployed Contract\nFor this example, we assume you have a smart contract deployed with a contract address to include in the last step.\n:::\n","title":"Nodejs Server with Gas Sponsoring using Sequence Builder","titles":["Building a Relaying Server"]},"68":{"href":"/guides/templates/02-building-relaying-server#a-create-dapp","html":"\n
\n","isPage":false,"text":"\n\n","title":"A. Create Dapp","titles":["Building a Relaying Server","Nodejs Server with Gas Sponsoring using Sequence Builder"]},"69":{"href":"/guides/templates/02-building-relaying-server#b-new-dapp","html":"\n
\n","isPage":false,"text":"\n\n","title":"B. New Dapp","titles":["Building a Relaying Server","Nodejs Server with Gas Sponsoring using Sequence Builder"]},"70":{"href":"/guides/templates/02-building-relaying-server#c1-gas-tank","html":"\n
\n","isPage":false,"text":"\n\n","title":"C.1 Gas Tank","titles":["Building a Relaying Server","Nodejs Server with Gas Sponsoring using Sequence Builder"]},"71":{"href":"/guides/templates/02-building-relaying-server#c2-add-gas","html":"\n
\n","isPage":false,"text":"\n\n","title":"C.2 Add Gas","titles":["Building a Relaying Server","Nodejs Server with Gas Sponsoring using Sequence Builder"]},"72":{"href":"/guides/templates/02-building-relaying-server#c3-add-sponsored-address","html":"\n
\n
The following is example code that implements a relayed transaction, same as the above example (i.e. Nodejs Server) but without fees, taken care of by the Sequence Builder.
\n
import { Session } from "@0xsequence/auth";\n\n// Create your server EOA\nconst walletEOA = new ethers.Wallet(serverPrivateKey, provider);\n\n// Open a Sequence session, this will find or create\n// a Sequence wallet controlled by your server EOA\nconst session = await Session.singleSigner({\n signer: walletEOA,\n projectAccessKey: "<access_key>",\n});\n\n// Get the Sequence wallet address\nconsole.log(session.account.address);\n\n// Get a signer for a specific network\n// - 1: Ethereum Mainnet\n// - 137: Polygon Mainnet\n// - 42161: Arbitrum One\n// See https://chainid.network/ for more\nconst signer = session.account.getSigner(137, {\n // OPTIONAL: This ensures that the transaction is paid for by the gas tank\n // but if not provided, the gas tank will be used anyway\n selectFee: async (_txs: any, _options: FeeOption[]) => {\n return undefined;\n },\n});\n\n// Craft your transaction\nconst erc721Interface = new ethers.utils.Interface([\n "function safeTransferFrom(address _from, address _to, uint256 _tokenId)",\n]);\n\nconst data = erc721Interface.encodeFunctionData("safeTransferFrom", [\n senderAddress,\n recipientAddress,\n id,\n]);\n\nconst txn = {\n to: erc721TokenAddress,\n data,\n};\n\n// Send the transaction\nconst txnResponse = await signer.sendTransaction(txn);\n\n// Check if transaction was successful\nif (txnReceipt.status != 1) {\n console.log(`Unexpected status: ${txnReceipt.status}`);\n}
\n","isPage":false,"text":"\n\nThe following is example code that implements a relayed transaction, same as the above example (i.e. Nodejs Server) but without fees, taken care of by the Sequence Builder.\nimport { Session } from "@0xsequence/auth";\n \n// Create your server EOA\nconst walletEOA = new ethers.Wallet(serverPrivateKey, provider);\n \n// Open a Sequence session, this will find or create\n// a Sequence wallet controlled by your server EOA\nconst session = await Session.singleSigner({\n signer: walletEOA,\n projectAccessKey: "<access_key>",\n});\n \n// Get the Sequence wallet address\nconsole.log(session.account.address);\n \n// Get a signer for a specific network\n// - 1: Ethereum Mainnet\n// - 137: Polygon Mainnet\n// - 42161: Arbitrum One\n// See https://chainid.network/ for more\nconst signer = session.account.getSigner(137, {\n // OPTIONAL: This ensures that the transaction is paid for by the gas tank\n // but if not provided, the gas tank will be used anyway\n selectFee: async (_txs: any, _options: FeeOption[]) => {\n return undefined;\n },\n});\n \n// Craft your transaction\nconst erc721Interface = new ethers.utils.Interface([\n "function safeTransferFrom(address _from, address _to, uint256 _tokenId)",\n]);\n \nconst data = erc721Interface.encodeFunctionData("safeTransferFrom", [\n senderAddress,\n recipientAddress,\n id,\n]);\n \nconst txn = {\n to: erc721TokenAddress,\n data,\n};\n \n// Send the transaction\nconst txnResponse = await signer.sendTransaction(txn);\n \n// Check if transaction was successful\nif (txnReceipt.status != 1) {\n console.log(`Unexpected status: ${txnReceipt.status}`);\n}\n","title":"C.3 Add Sponsored Address","titles":["Building a Relaying Server","Nodejs Server with Gas Sponsoring using Sequence Builder"]},"73":{"href":"/guides/templates/02-building-relaying-server#parallel-transactions","html":"\n
If you want to send multiple independent transactions without needing to batch them, you can also send them in distinct nonce spaces.\nUsing distinct nonce spaces for your transactions signals to the relayer that there's no dependency between them and that\nthey can be executed on-chain in any order.
\n
This allows the transactions to be dispatched immediately in an unbuffered way without having to wait for a full batch.\nHere is an example of how to do that:
\n
// Generate random nonce spaces with ~0% probability of collision\nconst randomNonceSpace1 = ethers.BigNumber.from(\n ethers.utils.hexlify(ethers.utils.randomBytes(20))\n);\nconst randomNonceSpace2 = ethers.BigNumber.from(\n ethers.utils.hexlify(ethers.utils.randomBytes(20))\n);\n\n// Create signers for each nonce space\nconst signer1 = session.account.getSigner(137, {\n nonceSpace: randomNonceSpace1,\n});\n\nconst signer2 = session.account.getSigner(137, {\n nonceSpace: randomNonceSpace2,\n});\n\n// Generate transactions\nconst txn1 = {\n to: tokenContract.address,\n data: erc20Interface.encodeFunctionData("transfer", [recipient1, amount1]),\n};\n\nconst txn2 = {\n to: tokenContract.address,\n data: erc20Interface.encodeFunctionData("transfer", [recipient2, amount2]),\n};\n\n// Dispatch transactions, which can now be executed in parallel\nawait Promise.all([\n signer1.sendTransaction(txn1),\n signer2.sendTransaction(txn2),\n]);
\n
If batching transactions is not a problem for your use-case, you can call await wallet.sendTransaction(txns).\nYou can read more about batch transactions in Sending Batched Transactions.
","isPage":false,"text":"\nIf you want to send multiple independent transactions without needing to batch them, you can also send them in distinct nonce spaces.\nUsing distinct nonce spaces for your transactions signals to the relayer that there's no dependency between them and that\nthey can be executed on-chain in any order.\nThis allows the transactions to be dispatched immediately in an unbuffered way without having to wait for a full batch.\nHere is an example of how to do that:\n// Generate random nonce spaces with ~0% probability of collision\nconst randomNonceSpace1 = ethers.BigNumber.from(\n ethers.utils.hexlify(ethers.utils.randomBytes(20))\n);\nconst randomNonceSpace2 = ethers.BigNumber.from(\n ethers.utils.hexlify(ethers.utils.randomBytes(20))\n);\n \n// Create signers for each nonce space\nconst signer1 = session.account.getSigner(137, {\n nonceSpace: randomNonceSpace1,\n});\n \nconst signer2 = session.account.getSigner(137, {\n nonceSpace: randomNonceSpace2,\n});\n \n// Generate transactions\nconst txn1 = {\n to: tokenContract.address,\n data: erc20Interface.encodeFunctionData("transfer", [recipient1, amount1]),\n};\n \nconst txn2 = {\n to: tokenContract.address,\n data: erc20Interface.encodeFunctionData("transfer", [recipient2, amount2]),\n};\n \n// Dispatch transactions, which can now be executed in parallel\nawait Promise.all([\n signer1.sendTransaction(txn1),\n signer2.sendTransaction(txn2),\n]);\nIf batching transactions is not a problem for your use-case, you can call await wallet.sendTransaction(txns).\nYou can read more about batch transactions in Sending Batched Transactions.","title":"Parallel Transactions","titles":["Building a Relaying Server"]},"74":{"href":"/guides/templates/03-mint-collectibles-serverless#mint-collectibles-using-a-gasless-serverless-relayer","html":"\n
Time to complete: 20-30 minutes
\n
The Sequence Relayer can be implemented on a serverless Cloudflare worker so a game or app user interaction is seamless without a confirmation signature or gas payment. You'll also benefit from not having to be worried about transaction speed, throughput and re-orgs by the relayer, and experience automatic scaling with Cloudflare.
\n
The following steps will guide you through how to build your hosted minter API in 4 steps:
The result, a secure API with the following specs:
\n
\n
HTTPS GET: returns blockNumber
\n
HTTPS POST(proof, address): mints a collectible & returns transaction hash
\n
\n
:::info Difficulty\nYou need basic knowledge of wrangler cli, npm, and Sequence Builder in order to complete this implementation.\n:::
\n","isPage":true,"text":"\nTime to complete: 20-30 minutes\nThe Sequence Relayer can be implemented on a serverless Cloudflare worker so a game or app user interaction is seamless without a confirmation signature or gas payment. You'll also benefit from not having to be worried about transaction speed, throughput and re-orgs by the relayer, and experience automatic scaling with Cloudflare.\nThe following steps will guide you through how to build your hosted minter API in 4 steps:\n\nSetup Cloudflare environment with wrangler cli and deploy a test\nDeploy, sponsor and update Metadata for an ERC1155 contract with Builder\nUse EthAuthProof to prevent EOA DDoS\nMint a collectible to wallet\n\nThe result, a secure API with the following specs:\n\nHTTPS GET: returns blockNumber\nHTTPS POST(proof, address): mints a collectible & returns transaction hash\n\n:::info Difficulty\nYou need basic knowledge of wrangler cli, npm, and Sequence Builder in order to complete this implementation.\n:::\n","title":"Mint Collectibles Using a Gasless Serverless Relayer","titles":[]},"75":{"href":"/guides/templates/03-mint-collectibles-serverless#1-setup-cloudflare-environment-with-wrangler-cli-and-deploy-a-test","html":"\n
In order to create the project from scratch, first create a project with mkdir, cd into the project, and run pnpm init to create a package.json.
\n
Next, make sure wrangler cli is installed in your project and set the wrangler keyword as an alias in your local bash session.
Create an account on the Cloudflare site and perform a login step to login to your Cloudflare dashboard to connect the Cloudflare platform to your local development environment.
\n
wrangler login
\n
Once logged in, initialize the project in the directory by accepting one of the randomly generated project folder names provided that you like, and follow the prompts to initialize your git tracked typescript "Hello World" Worker application.
\n
wrangler init
\n
To complete this step, you should press enter 4 times after wrangler init with the last step answered as No to decline deployment.
\n
This will clone down a starter repository that can be used to deploy code to the cloud.
\n
:::info Local API Testing\nAt any point in the guide, you can use the wrangler dev command in the project folder for local testing\n:::
\n","isPage":false,"text":"\nIn order to create the project from scratch, first create a project with mkdir, cd into the project, and run pnpm init to create a package.json.\nNext, make sure wrangler cli is installed in your project and set the wrangler keyword as an alias in your local bash session.\npnpm install wrangler --save-dev\nalias wrangler='./node_modules/.bin/wrangler'\nCreate an account on the Cloudflare site and perform a login step to login to your Cloudflare dashboard to connect the Cloudflare platform to your local development environment.\nwrangler login\nOnce logged in, initialize the project in the directory by accepting one of the randomly generated project folder names provided that you like, and follow the prompts to initialize your git tracked typescript "Hello World" Worker application.\nwrangler init\nTo complete this step, you should press enter 4 times after wrangler init with the last step answered as No to decline deployment.\nThis will clone down a starter repository that can be used to deploy code to the cloud.\n:::info Local API Testing\nAt any point in the guide, you can use the wrangler dev command in the project folder for local testing\n:::\n","title":"1. Setup Cloudflare environment with wrangler cli and deploy a test","titles":["Mint Collectibles Using a Gasless Serverless Relayer"]},"76":{"href":"/guides/templates/03-mint-collectibles-serverless#deploy-test","html":"\n
Finally, cd into the randomly generated project folder, and perform a wrangler deploy command.
\n
This should print a URL, which you can enter in the browser the URL https://<app>.<account>.workers.dev to view the Hello World! result.
\n","isPage":false,"text":"\nFinally, cd into the randomly generated project folder, and perform a wrangler deploy command.\nThis should print a URL, which you can enter in the browser the URL https://<app>.<account>.workers.dev to view the Hello World! result.\n","title":"Deploy Test","titles":["Mint Collectibles Using a Gasless Serverless Relayer","1. Setup Cloudflare environment with wrangler cli and deploy a test",null]},"77":{"href":"/guides/templates/03-mint-collectibles-serverless#2-deploy-sponsor-and-update-metadata-for-an-erc1155-contract-with-builder","html":"\n
Then, one must update the role access of the contract in the Builder to only receive requests from the minter wallet address, which can be done in 2 steps.
\n
You can do this in Sequence Builder by providing minter permission to your Sequence Wallet Relayer Address.
\n
In order to know what the relayer address you are working with is, one must first either:
\n\n
Have one generated for you using this dapp by selecting your network, and generating a wallet keypair with the generate local wallet button
\n
Or, you can print locally the account address produced from an EOA wallet private key using the following code snippet:
\n\n
import { Session } from "@0xsequence/auth";\nimport { ethers } from "ethers";\n\n(async () => {\n // Generate a new EOA\n // const wallet = ethers.Wallet.createRandom()\n // const privateKey = wallet.privateKey\n\n // Or, use an existing EOA private key\n const privateKey = "";\n const provider = new ethers.providers.JsonRpcProvider(\n "https://nodes.sequence.app/mainnet"\n );\n\n // Create your server EOA\n const walletEOA = new ethers.Wallet(privateKey, provider);\n\n // Open a Sequence session, this will find or create\n // a Sequence wallet controlled by your server EOA\n const session = await Session.singleSigner({\n signer: walletEOA,\n projectAccessKey: "access_key",\n });\n\n const signer = session.account.getSigner(1);\n console.log(`Your relayer wallet address: ${signer.account.address}`);\n})();
\n
To do so, open your project, navigate to the Contracts page, select your Linked contracts and under Write Contract tab expand the grantRole method.
Where the role string inputted is the result of keccak256("MINTER_ROLE") in solidity or ethers.utils.keccak256(ethers.utils.toUtf8Bytes("MINTER_ROLE")) in javascript
\n
This makes it so that only your specific address can mint from the contract, it will error otherwise.
\n
Complete the role update by clicking write and sign the sponsored transaction.
\n","isPage":false,"text":"\nFirst, follow this guide to deploy a contract.\nThen, one must update the role access of the contract in the Builder to only receive requests from the minter wallet address, which can be done in 2 steps.\nYou can do this in Sequence Builder by providing minter permission to your Sequence Wallet Relayer Address.\nIn order to know what the relayer address you are working with is, one must first either:\n\nHave one generated for you using this dapp by selecting your network, and generating a wallet keypair with the generate local wallet button\nOr, you can print locally the account address produced from an EOA wallet private key using the following code snippet:\n\nimport { Session } from "@0xsequence/auth";\nimport { ethers } from "ethers";\n \n(async () => {\n // Generate a new EOA\n // const wallet = ethers.Wallet.createRandom()\n // const privateKey = wallet.privateKey\n \n // Or, use an existing EOA private key\n const privateKey = "";\n const provider = new ethers.providers.JsonRpcProvider(\n "https://nodes.sequence.app/mainnet"\n );\n \n // Create your server EOA\n const walletEOA = new ethers.Wallet(privateKey, provider);\n \n // Open a Sequence session, this will find or create\n // a Sequence wallet controlled by your server EOA\n const session = await Session.singleSigner({\n signer: walletEOA,\n projectAccessKey: "access_key",\n });\n \n const signer = session.account.getSigner(1);\n console.log(`Your relayer wallet address: ${signer.account.address}`);\n})();\nTo do so, open your project, navigate to the Contracts page, select your Linked contracts and under Write Contract tab expand the grantRole method.\nComplete with the following details:\nbytes32 role: 0x9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6\naddress account: <Generated Sequence Relayer Wallet Address>\n\nWhere the role string inputted is the result of keccak256("MINTER_ROLE") in solidity or ethers.utils.keccak256(ethers.utils.toUtf8Bytes("MINTER_ROLE")) in javascript\nThis makes it so that only your specific address can mint from the contract, it will error otherwise.\nComplete the role update by clicking write and sign the sponsored transaction.\n","title":"2. Deploy, Sponsor and Update Metadata for an ERC1155 Contract with Builder","titles":["Mint Collectibles Using a Gasless Serverless Relayer"]},"78":{"href":"/guides/templates/03-mint-collectibles-serverless#update-metadata","html":"\n
Next, you'll need to update the metadata with your media or assets for your contract, which can be done by following this guide.
\n","isPage":false,"text":"\nNext, you'll need to update the metadata with your media or assets for your contract, which can be done by following this guide.\n","title":"Update metadata","titles":["Mint Collectibles Using a Gasless Serverless Relayer","2. Deploy, Sponsor and Update Metadata for an ERC1155 Contract with Builder",null]},"79":{"href":"/guides/templates/03-mint-collectibles-serverless#contract-sponsoring","html":"\n
Finally, in order to sponsor the contract follow this guide to sponsor a contract.
\n","isPage":false,"text":"\nFinally, in order to sponsor the contract follow this guide to sponsor a contract.\n","title":"Contract sponsoring","titles":["Mint Collectibles Using a Gasless Serverless Relayer","2. Deploy, Sponsor and Update Metadata for an ERC1155 Contract with Builder",null]},"80":{"href":"/guides/templates/03-mint-collectibles-serverless#3-use-ethauthproof-to-prevent-eoa-ddos","html":"\n
Now that we have a contract deployed, we can return to the cloudflare worker directory and project, and install ethers and 0xsequence to get access to sequence APIs in order to perform a proof validation that the request is coming from a trusted source, a sequence wallet.
\n
pnpm install 0xsequence @0xsequence/network
\n
Then, we have to add a type of middleware, after we check if it's a POST or GET request. If it's a POST request, verify that the passed in proofString and address are valid, as well as the environment variables.
\n
The code scaffold placed into src/index.ts would look like this, with callContract and getBlockNumber mocked out, using the mentioned verification step of calling verify before any contract call.
\n
import { sequence } from "0xsequence";\nimport { networks, findSupportedNetwork } from "@0xsequence/network";\n\nexport interface Env {\n PKEY: string; // Private key for EOA wallet\n CONTRACT_ADDRESS: string; // Deployed ERC1155 or ERC721 contract address\n PROJECT_ACCESS_KEY: string; // From sequence.build\n CHAIN_HANDLE: string; // Standardized chain name – See https://docs.sequence.xyz/multi-chain-support\n}\n\n// use the sequence api to verify proof came from a sequence wallet\nconst verify = async (\n chainId: string,\n walletAddress: string,\n ethAuthProofString: string\n): Promise<Boolean> => {\n const api = new sequence.api.SequenceAPIClient("https://api.sequence.app");\n const { isValid } = await api.isValidETHAuthProof({\n chainId,\n walletAddress,\n ethAuthProofString,\n });\n return isValid;\n};\n\nasync function handleRequest(\n request: Request,\n env: Env,\n ctx: ExecutionContext\n): Promise<Response> {\n if (env.PKEY === undefined || env.PKEY === "") {\n return new Response("Make sure PKEY is configured in your environment", {\n status: 400,\n });\n }\n\n if (env.CONTRACT_ADDRESS === undefined || env.CONTRACT_ADDRESS === "") {\n return new Response(\n "Make sure CONTRACT_ADDRESS is configured in your environment",\n { status: 400 }\n );\n }\n\n if (env.PROJECT_ACCESS_KEY === undefined || env.PROJECT_ACCESS_KEY === "") {\n return new Response(\n "Make sure PROJECT_ACCESS_KEY is configured in your environment",\n { status: 400 }\n );\n }\n\n if (env.CHAIN_HANDLE === undefined || env.CHAIN_HANDLE === "") {\n return new Response(\n "Make sure CHAIN_HANDLE is configured in your environment",\n { status: 400 }\n );\n }\n\n const chainConfig = findSupportedNetwork(env.CHAIN_HANDLE);\n\n if (chainConfig === undefined) {\n return new Response("Unsupported network or unknown CHAIN_HANDLE", {\n status: 400,\n });\n }\n\n // POST request\n if (request.method === "POST") {\n // parse the request body as JSON\n const body = await request.json();\n const { proof, address, tokenId }: any = body;\n try {\n // check that the proof is valid\n if (await verify(env.CHAIN_HANDLE, address, proof)) {\n try {\n // mocked call\n const res = await callContract(request, env, address, tokenId);\n return new Response(`${res.hash}`, { status: 200 });\n } catch (err: any) {\n console.log(err);\n return new Response(`Something went wrong: ${JSON.stringify(err)}`, {\n status: 400,\n });\n }\n } else {\n return new Response(`Unauthorized`, { status: 401 });\n }\n } catch (err: any) {\n return new Response(`Unauthorized ${JSON.stringify(err)}`, {\n status: 401,\n });\n }\n }\n // GET request\n else {\n try {\n // mocked call\n const res = await getBlockNumber(env.CHAIN_HANDLE, request);\n return new Response(`Block Number: ${res}`);\n } catch (err: any) {\n return new Response(`Something went wrong: ${JSON.stringify(err)}`, {\n status: 500,\n });\n }\n }\n}\n\nconst getBlockNumber = async (\n chainId: string,\n request: Request\n): Promise<number> => {\n return chainId;\n};\n\nconst callContract = async (\n request: Request,\n env: Env,\n address: string,\n tokenId: number\n): Promise<ethers.providers.TransactionResponse> => {\n return { hash: "0x" } as any;\n};\n\nexport default {\n async fetch(request: Request, env: Env, ctx: ExecutionContext) {\n // Process the request and create a response\n const response = await handleRequest(request, env, ctx);\n\n // Set CORS headers\n response.headers.set("Access-Control-Allow-Origin", "*");\n response.headers.set(\n "Access-Control-Allow-Methods",\n "GET, POST, PUT, DELETE, OPTIONS"\n );\n response.headers.set("Access-Control-Allow-Headers", "Content-Type");\n\n // return response\n return response;\n },\n};
\n","isPage":false,"text":"\nNow that we have a contract deployed, we can return to the cloudflare worker directory and project, and install ethers and 0xsequence to get access to sequence APIs in order to perform a proof validation that the request is coming from a trusted source, a sequence wallet.\npnpm install 0xsequence @0xsequence/network\nThen, we have to add a type of middleware, after we check if it's a POST or GET request. If it's a POST request, verify that the passed in proofString and address are valid, as well as the environment variables.\nThe code scaffold placed into src/index.ts would look like this, with callContract and getBlockNumber mocked out, using the mentioned verification step of calling verify before any contract call.\nimport { sequence } from "0xsequence";\nimport { networks, findSupportedNetwork } from "@0xsequence/network";\n \nexport interface Env {\n PKEY: string; // Private key for EOA wallet\n CONTRACT_ADDRESS: string; // Deployed ERC1155 or ERC721 contract address\n PROJECT_ACCESS_KEY: string; // From sequence.build\n CHAIN_HANDLE: string; // Standardized chain name – See https://docs.sequence.xyz/multi-chain-support\n}\n \n// use the sequence api to verify proof came from a sequence wallet\nconst verify = async (\n chainId: string,\n walletAddress: string,\n ethAuthProofString: string\n): Promise<Boolean> => {\n const api = new sequence.api.SequenceAPIClient("https://api.sequence.app");\n const { isValid } = await api.isValidETHAuthProof({\n chainId,\n walletAddress,\n ethAuthProofString,\n });\n return isValid;\n};\n \nasync function handleRequest(\n request: Request,\n env: Env,\n ctx: ExecutionContext\n): Promise<Response> {\n if (env.PKEY === undefined || env.PKEY === "") {\n return new Response("Make sure PKEY is configured in your environment", {\n status: 400,\n });\n }\n \n if (env.CONTRACT_ADDRESS === undefined || env.CONTRACT_ADDRESS === "") {\n return new Response(\n "Make sure CONTRACT_ADDRESS is configured in your environment",\n { status: 400 }\n );\n }\n \n if (env.PROJECT_ACCESS_KEY === undefined || env.PROJECT_ACCESS_KEY === "") {\n return new Response(\n "Make sure PROJECT_ACCESS_KEY is configured in your environment",\n { status: 400 }\n );\n }\n \n if (env.CHAIN_HANDLE === undefined || env.CHAIN_HANDLE === "") {\n return new Response(\n "Make sure CHAIN_HANDLE is configured in your environment",\n { status: 400 }\n );\n }\n \n const chainConfig = findSupportedNetwork(env.CHAIN_HANDLE);\n \n if (chainConfig === undefined) {\n return new Response("Unsupported network or unknown CHAIN_HANDLE", {\n status: 400,\n });\n }\n \n // POST request\n if (request.method === "POST") {\n // parse the request body as JSON\n const body = await request.json();\n const { proof, address, tokenId }: any = body;\n try {\n // check that the proof is valid\n if (await verify(env.CHAIN_HANDLE, address, proof)) {\n try {\n // mocked call\n const res = await callContract(request, env, address, tokenId);\n return new Response(`${res.hash}`, { status: 200 });\n } catch (err: any) {\n console.log(err);\n return new Response(`Something went wrong: ${JSON.stringify(err)}`, {\n status: 400,\n });\n }\n } else {\n return new Response(`Unauthorized`, { status: 401 });\n }\n } catch (err: any) {\n return new Response(`Unauthorized ${JSON.stringify(err)}`, {\n status: 401,\n });\n }\n }\n // GET request\n else {\n try {\n // mocked call\n const res = await getBlockNumber(env.CHAIN_HANDLE, request);\n return new Response(`Block Number: ${res}`);\n } catch (err: any) {\n return new Response(`Something went wrong: ${JSON.stringify(err)}`, {\n status: 500,\n });\n }\n }\n}\n \nconst getBlockNumber = async (\n chainId: string,\n request: Request\n): Promise<number> => {\n return chainId;\n};\n \nconst callContract = async (\n request: Request,\n env: Env,\n address: string,\n tokenId: number\n): Promise<ethers.providers.TransactionResponse> => {\n return { hash: "0x" } as any;\n};\n \nexport default {\n async fetch(request: Request, env: Env, ctx: ExecutionContext) {\n // Process the request and create a response\n const response = await handleRequest(request, env, ctx);\n \n // Set CORS headers\n response.headers.set("Access-Control-Allow-Origin", "*");\n response.headers.set(\n "Access-Control-Allow-Methods",\n "GET, POST, PUT, DELETE, OPTIONS"\n );\n response.headers.set("Access-Control-Allow-Headers", "Content-Type");\n \n // return response\n return response;\n },\n};\n","title":"3. Use EthAuthProof to prevent EOA DDoS","titles":["Mint Collectibles Using a Gasless Serverless Relayer"]},"81":{"href":"/guides/templates/03-mint-collectibles-serverless#add-cloudflare-environment-variables","html":"\n
Then, pass in the environment variables for your build by updating the [vars] section in your wrangler.toml.
\n
[vars]\nPKEY = "" # Private key for EOA wallet\nCONTRACT_ADDRESS = "" # // Deployed ERC1155 or ERC721 contract address\nPROJECT_ACCESS_KEY = "" # From sequence.build\nCHAIN_HANDLE = "" # // Standardized chain name – See https://docs.sequence.xyz/multi-chain-support
\n","isPage":false,"text":"\nThen, pass in the environment variables for your build by updating the [vars] section in your wrangler.toml.\n[vars]\nPKEY = "" # Private key for EOA wallet\nCONTRACT_ADDRESS = "" # // Deployed ERC1155 or ERC721 contract address\nPROJECT_ACCESS_KEY = "" # From sequence.build\nCHAIN_HANDLE = "" # // Standardized chain name – See https://docs.sequence.xyz/multi-chain-support\n","title":"Add cloudflare environment variables","titles":["Mint Collectibles Using a Gasless Serverless Relayer","3. Use EthAuthProof to prevent EOA DDoS",null]},"82":{"href":"/guides/templates/03-mint-collectibles-serverless#implement-window-object-in-wrangler-template","html":"\n
It should be noted, if you try to deploy this you'll get a missing window object required by the web3 modules.
\n
To prevent this, add the following line to your wrangler.toml file to make the environment compatible.
\n
...\nnode_compat = true # add this line\n...
\n","isPage":false,"text":"\nIt should be noted, if you try to deploy this you'll get a missing window object required by the web3 modules.\nTo prevent this, add the following line to your wrangler.toml file to make the environment compatible.\n...\nnode_compat = true # add this line\n...\n","title":"Implement window object in wrangler template","titles":["Mint Collectibles Using a Gasless Serverless Relayer","3. Use EthAuthProof to prevent EOA DDoS",null]},"83":{"href":"/guides/templates/03-mint-collectibles-serverless#testing-the-deploy","html":"\n
You can now redeploy using wrangler deploy
\n
And perform a curl request to test your endpoint like such:
\n
curl -X POST https://your-worker.your-subdomain.workers.dev \\\n-H "Content-Type: application/json" \\\n-d '{"proof": "<some_proof>", "address": "<some_address>", "tokenId": 0 }'\n\n... invalid proof string ...\n\n# and if you replace with actual proof (from a wallet client login) and address on polygon, it should return\nsuccess
\n
You can acquire your wallet address proof by using this dapp and follow the below steps.
\n","isPage":false,"text":"\nYou can now redeploy using wrangler deploy\nAnd perform a curl request to test your endpoint like such:\ncurl -X POST https://your-worker.your-subdomain.workers.dev \\\n-H "Content-Type: application/json" \\\n-d '{"proof": "<some_proof>", "address": "<some_address>", "tokenId": 0 }'\n\n... invalid proof string ...\n\n# and if you replace with actual proof (from a wallet client login) and address on polygon, it should return\nsuccess\nYou can acquire your wallet address proof by using this dapp and follow the below steps.\n","title":"Testing the deploy","titles":["Mint Collectibles Using a Gasless Serverless Relayer","3. Use EthAuthProof to prevent EOA DDoS",null]},"84":{"href":"/guides/templates/03-mint-collectibles-serverless#using-the-ethauthproof-viewer-dapp","html":"\n
When you arrive on the page, the first thing you should do is select a network.
\n
Then you have an option to either connect and generate the Proof, or, generate a local wallet
\n
\n
Press the connect button and then copy to clipboard.
\n
\n
It should be noted, it is best not to share this ETHAuthProof with anyone as this means someone can prove ownership of your wallet and interact with specific APIs.
\n
Finally, replace the url with your app from this step, the <some_proof> with the generated value copied from the viewer dapp, and <some_address> with your wallet address and it should return just the mocked 0x string.
\n","isPage":false,"text":"\nWhen you arrive on the page, the first thing you should do is select a network.\nThen you have an option to either connect and generate the Proof, or, generate a local wallet\n\nPress the connect button and then copy to clipboard.\n\nIt should be noted, it is best not to share this ETHAuthProof with anyone as this means someone can prove ownership of your wallet and interact with specific APIs.\nFinally, replace the url with your app from this step, the <some_proof> with the generated value copied from the viewer dapp, and <some_address> with your wallet address and it should return just the mocked 0x string.\ncurl -X POST https://your-worker.your-subdomain.workers.dev \\\n-H "Content-Type: application/json" \\\n-d '{"proof": "<some_proof>", "address": "<some_address>", "tokenId": 0 }'\n","title":"Using the ETHAuthProof Viewer dapp","titles":["Mint Collectibles Using a Gasless Serverless Relayer","3. Use EthAuthProof to prevent EOA DDoS",null]},"85":{"href":"/guides/templates/03-mint-collectibles-serverless#4-mint-a-collectible-to-wallet","html":"\n
Finally, to deploy and mint a collectible from the sponsored contract address, we install the following packages
\n
pnpm install @0xsequence/auth ethers@5.7.2
\n
and implement the callContract and getBlockNumber methods previously mocked out as follows:
Once these steps are complete, you can redeploy and test with the steps outlined in this prior step, and this time the POST request should return a transaction hash for the completed mint and the GET request would return a block number.
","isPage":false,"text":"\nFinally, to deploy and mint a collectible from the sponsored contract address, we install the following packages\npnpm install @0xsequence/auth ethers@5.7.2\nand implement the callContract and getBlockNumber methods previously mocked out as follows:\nimport { ethers } from 'ethers'\nimport { Session, SessionSettings } from '@0xsequence/auth'\n \n...\n \nconst getBlockNumber = async (chainId: string, request: Request): Promise<number> => {\n\tconst nodeUrl = `https://nodes.sequence.app/${chainId}`\n\tconst provider = new ethers.providers.JsonRpcProvider({ url: nodeUrl, skipFetchSetup: true })\n\treturn await provider.getBlockNumber()\n}\n \nconst callContract = async (request: Request, env: Env, address: string, tokenId: number): Promise<ethers.providers.TransactionResponse> => {\n \n\tconst nodeUrl = `https://nodes.sequence.app/${env.CHAIN_HANDLE}`\n\tconst relayerUrl = `https://{env.CHAIN_HANDLE}-relayer.sequence.app`\n\tconst provider = new ethers.providers.JsonRpcProvider({ url: nodeUrl, skipFetchSetup: true })\n const contractAddress = env.CONTRACT_ADDRESS\n \n // create EOA from private key\n\tconst walletEOA = new ethers.Wallet(env.PKEY, provider);\n \n\t// instantiate settings\n\tconst settings: Partial<SessionSettings> = {\n\t\tnetworks: [{\n\t\t\t...networks[findSupportedNetwork(env.CHAIN_HANDLE)!.chainId],\n\t\t\trpcUrl: findSupportedNetwork(env.CHAIN_HANDLE)!.rpcUrl,\n\t\t\tprovider: provider,\n\t\t\trelayer: {\n\t\t\t\turl: relayerUrl,\n\t\t\t\tprovider: {\n\t\t\t\t\turl: findSupportedNetwork(env.CHAIN_HANDLE)!.rpcUrl\n\t\t\t\t}\n\t\t\t}\n\t\t}],\n\t}\n \n // create a single signer sequence wallet session\n\tconst session = await Session.singleSigner({\n\t\tsettings: settings,\n\t\tsigner: walletEOA,\n\t\tprojectAccessKey: env.PROJECT_ACCESS_KEY\n\t})\n \n\t// get signer\n\tconst signer = session.account.getSigner(findSupportedNetwork(env.CHAIN_HANDLE)!.chainId)\n \n\t// create interface from partial abi\n\tconst collectibleInterface = new ethers.utils.Interface([\n\t\t'function mint(address to, uint256 tokenId, uint256 amount, bytes data)'\n\t])\n \n\t// create calldata\n\tconst data = collectibleInterface.encodeFunctionData(\n\t\t'mint', [address, tokenId, 1, "0x00"]\n\t)\n \n\t// create transaction object\n\tconst txn = { to: contractAddress, data }\n \n\ttry {\n\t\treturn await signer.sendTransaction(txn)\n\t} catch (err) {\n\t\tthrow err\n\t}\n}\nOnce these steps are complete, you can redeploy and test with the steps outlined in this prior step, and this time the POST request should return a transaction hash for the completed mint and the GET request would return a block number.\nIf you want to browse the full code, see an example implementation here","title":"4. Mint a collectible to wallet","titles":["Mint Collectibles Using a Gasless Serverless Relayer"]},"86":{"href":"/guides/templates/template-embedded-wallet#quickstart","html":"\n","isPage":true,"text":"\n","title":"Quickstart","titles":[]},"87":{"href":"/guides/templates/template-embedded-wallet#try-a-demo","html":"\n\n","isPage":false,"text":"\nTry out seamless UX of our embedded wallet at our demo\n","title":"Try a Demo","titles":["Quickstart"]},"88":{"href":"/guides/templates/template-embedded-wallet#template","html":"\n\n","isPage":false,"text":"\nGet started quickly with a template leveraging our embedded wallet.\n","title":"Template","titles":["Quickstart"]},"89":{"href":"/guides/templates/template-embedded-wallet#getting-started","html":"\n","isPage":false,"text":"\n","title":"Getting Started","titles":["Quickstart"]},"90":{"href":"/guides/templates/template-embedded-wallet#sdk-installation","html":"\n
We provide TypeScript and Unity SDKs for the Embedded Wallet authentication system. You can install the TypeScript SDK with:
\n
pnpm install @0xsequence/waas
\n
For more information on the Unity Embedded Wallet SDK, please refer to the TODO add link Unity SDK documentation
\n","isPage":false,"text":"\nWe provide TypeScript and Unity SDKs for the Embedded Wallet authentication system. You can install the TypeScript SDK with:\npnpm install @0xsequence/waas\nFor more information on the Unity Embedded Wallet SDK, please refer to the TODO add link Unity SDK documentation\n","title":"SDK Installation","titles":["Quickstart","Getting Started"]},"91":{"href":"/guides/templates/template-embedded-wallet#project-setup","html":"\n
Sequence Embedded Wallet is currently only available as a closed beta. To start using the Embedded Wallet SDKs, you'll need to contact the Sequence team and acquire API credentials. Once this is done, you will be provided with two keys:
\n
\n
Project access key
\n
Embedded Wallet configuration key
\n
\n","isPage":false,"text":"\nSequence Embedded Wallet is currently only available as a closed beta. To start using the Embedded Wallet SDKs, you'll need to contact the Sequence team and acquire API credentials. Once this is done, you will be provided with two keys:\n\nProject access key\nEmbedded Wallet configuration key\n\n","title":"Project Setup","titles":["Quickstart","Getting Started"]},"92":{"href":"/guides/templates/template-embedded-wallet#library-setup","html":"\n
To start using Sequence Embedded Wallet SDK, you'll need to create a new instance of the waas class:
\n
import { SequenceWaaS } from '@0xsequence/waas'\n\nconst waas = new SequenceWaaS({\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: 'mumbai'\n}, defaults.TEST)
\n
Note that the library is operational, but it can't be used to interact with any wallet until you have authenticated as a user.
","isPage":false,"text":"\nTo start using Sequence Embedded Wallet SDK, you'll need to create a new instance of the waas class:\nimport { SequenceWaaS } from '@0xsequence/waas'\n \nconst waas = new SequenceWaaS({\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: 'mumbai'\n}, defaults.TEST)\nNote that the library is operational, but it can't be used to interact with any wallet until you have authenticated as a user.","title":"Library Setup","titles":["Quickstart","Getting Started"]},"93":{"href":"/sdk/go/overview#go","html":"\n
go-sequence is the equivalent of 0xsequence\nbut for Go / Golang backends. In fact, all of Sequence's infrastructure is written in Go and is built with go-sequence.
\n","isPage":true,"text":"\nA complete Sequence SDK is also available in Go: https://github.com/0xsequence/go-sequence.\ngo-sequence is the equivalent of 0xsequence\nbut for Go / Golang backends. In fact, all of Sequence's infrastructure is written in Go and is built with go-sequence.\n","title":"Go","titles":[null,null]},"94":{"href":"/sdk/go/overview#ethkit","html":"\n
As part of the Sequence open source tools, our team has also built ethkit, which\nis an Ethereum dev toolkit for Go backends. ethkit supports EOA wallets,\nand you can think of it like ethers.js but for Go.
","isPage":false,"text":"\nAs part of the Sequence open source tools, our team has also built ethkit, which\nis an Ethereum dev toolkit for Go backends. ethkit supports EOA wallets,\nand you can think of it like ethers.js but for Go.","title":"ethkit","titles":[null,null]},"95":{"href":"/sdk/sequence-kit/01-overview#sequencekit-sdk","html":"\n
Sequence Kit 🧰 is the ultimate toolkit for effortlessly integrating web3 wallets into your applications, providing your users with a smooth and secure onboarding experience. With our robust tools built on the popular wagmi library, unlock a realm of possibilities in the world of web3.
\n","isPage":true,"text":"\nSequence Kit 🧰 is the ultimate toolkit for effortlessly integrating web3 wallets into your applications, providing your users with a smooth and secure onboarding experience. With our robust tools built on the popular wagmi library, unlock a realm of possibilities in the world of web3.\n","title":"SequenceKit SDK","titles":[]},"96":{"href":"/sdk/sequence-kit/01-overview#key-features","html":"\n
\n
\n
Universal Connections: Seamlessly connect via popular social logins such as Facebook, Google, Discord, and more! Your users will enjoy a smooth, secure onboarding process. 🔐🪪
\n
\n
\n
Web3 Wallet Integration: Effortlessly integrate with leading web3 wallets like WalletConnect and MetaMask. Unleash the power of blockchain with just a few clicks! 🦊 ⛓️
\n
\n
\n
Embedded Wallet Experience: Provide your users with a comprehensive embedded wallet, enabling them to manage their coins and collectibles all within your own application. 👛 🖼️ 🪙
\n
\n
\n
Explore the potential of Sequence Kit by trying out our demo!
\n","isPage":false,"text":"\n\n\nUniversal Connections: Seamlessly connect via popular social logins such as Facebook, Google, Discord, and more! Your users will enjoy a smooth, secure onboarding process. 🔐🪪\n\n\nWeb3 Wallet Integration: Effortlessly integrate with leading web3 wallets like WalletConnect and MetaMask. Unleash the power of blockchain with just a few clicks! 🦊 ⛓️\n\n\nEmbedded Wallet Experience: Provide your users with a comprehensive embedded wallet, enabling them to manage their coins and collectibles all within your own application. 👛 🖼️ 🪙\n\n\nExplore the potential of Sequence Kit by trying out our demo!\n","title":"Key Features","titles":["SequenceKit SDK"]},"97":{"href":"/sdk/sequence-kit/01-overview#next-steps","html":"\n
Ready to integrate Sequence Kit into your application? Check out our Getting Started guide. If you're already familiar with Sequence Kit dive into the available configuration options or take a look at the checkout.
","isPage":false,"text":"\nReady to integrate Sequence Kit into your application? Check out our Getting Started guide. If you're already familiar with Sequence Kit dive into the available configuration options or take a look at the checkout.","title":"Next Steps","titles":[]},"98":{"href":"/sdk/sequence-kit/02-getting-started#getting-started-with-sequence-kit","html":"\n
In this guide, we will walk you through installing Sequence Kit, triggering the connection modal, and displaying the embedded wallet in your application.
\n","isPage":true,"text":"\nIn this guide, we will walk you through installing Sequence Kit, triggering the connection modal, and displaying the embedded wallet in your application.\n","title":"Getting Started with Sequence Kit","titles":[]},"99":{"href":"/sdk/sequence-kit/02-getting-started#installing-sequence-kit-packages","html":"\n
Sequence Kit is modular, allowing you to install only the necessary packages. To get started, install the kit core package, the connectors package for interfacing with various wallet providers, and the wallet for the embedded wallet. Additionally, install other dependencies such as wagmi, viem, and 0xsequence.
\n","isPage":false,"text":"\nSequence Kit is modular, allowing you to install only the necessary packages. To get started, install the kit core package, the connectors package for interfacing with various wallet providers, and the wallet for the embedded wallet. Additionally, install other dependencies such as wagmi, viem, and 0xsequence.\nnpm install @0xsequence/kit @0xsequence/kit-connectors wagmi ethers@5.7.2 viem 0xsequence @tanstack/react-query\n# or\npnpm install @0xsequence/kit @0xsequence/kit-connectors wagmi ethers@5.7.2 viem 0xsequence @tanstack/react-query\n# or\nyarn add @0xsequence/kit @0xsequence/kit-connectors wagmi ethers@5.7.2 viem 0xsequence @tanstack/react-query\n","title":"Installing Sequence Kit Packages","titles":["Getting Started with Sequence Kit"]},"100":{"href":"/sdk/sequence-kit/02-getting-started#setting-up-the-kit-wrapper","html":"\n
To utilize the core kit wrapper for connecting web3 wallets to your application, follow these steps:
\n\n
Configure wagmi for your app. Below is a basic wagmi configuration. For advanced configurations, please refer to the wagmi documentation.
The modal will automatically close once the user signs in. You can utilize the useAccount hook from wagmi to detect the user's connection status.
\n","isPage":false,"text":"\n\nInvoke the connect modal using the useOpenConnectModal hook.\nimport { useOpenConnectModal } from '@0xsequence/kit'\nimport { useDisconnect, useAccount } from 'wagmi'\n \n \nconst MyReactComponent = () => {\n const { setOpenConnectModal } = useOpenConnectModal()\n \n const { isConnected } = useAccount()\n \n const onClick = () => {\n setOpenConnectModal(true)\n }\n \n return (\n <>\n {!isConnected && (\n <button onClick={onClick}>\n Sign in\n </button>\n )}\n </>\n )\n}\nThe modal will automatically close once the user signs in. You can utilize the useAccount hook from wagmi to detect the user's connection status.\n","title":"Triggering the Connect Modal","titles":[]},"103":{"href":"/sdk/sequence-kit/02-getting-started#invoking-the-embedded-wallet-modal","html":"\n
\n
Open the embedded wallet using the useOpenWalletModal react hook.
","isPage":false,"text":"\nThe Sequence Kit Github repository contains an example app that you can use for learning and testing.","title":"React Example","titles":[]},"105":{"href":"/sdk/sequence-kit/03-configuration#configuration-options","html":"\n
Developers can customize the Sequence Kit experience by passing configuration options to the KitProvider wrapper.
\n
Here's how you can configure the kit using these options:
\n","isPage":true,"text":"\nDevelopers can customize the Sequence Kit experience by passing configuration options to the KitProvider wrapper.\nHere's how you can configure the kit using these options:\n \n const kitConfig = {\n\t\tdefaultTheme: 'light',\n\t\tposition: 'top-left',\n\t\t...\n\t}\n \n <KitProvider config={kitConfig}>\n <App />\n <KitProvider>\n \n","title":"Configuration Options","titles":[]},"106":{"href":"/sdk/sequence-kit/03-configuration#available-options","html":"\n","isPage":false,"text":"\n","title":"Available Options","titles":[]},"107":{"href":"/sdk/sequence-kit/03-configuration#defaulttheme","html":"\n
Type
Default
string or object
dark
\n
The defaultTheme determines the color palette used for styling the modal. Possible values include:
\n
\n
'light'
\n
'dark'
\n
object
\n
\n
Specific colors can be overwritten by passing a theme override object. The Sequence Builder provides a useful playground for toying with the colors in Sequence Kit.
\n","isPage":false,"text":"\nTypeDefaultstring or objectdark\nThe defaultTheme determines the color palette used for styling the modal. Possible values include:\n\n'light'\n'dark'\nobject\n\nSpecific colors can be overwritten by passing a theme override object. The Sequence Builder provides a useful playground for toying with the colors in Sequence Kit.\n","title":"defaultTheme","titles":["Available Options"]},"108":{"href":"/sdk/sequence-kit/03-configuration#position","html":"\n
Type
Default
string
center
\n
The position parameter determines the location of the various modals on the screen. Possible values include:
\n
\n
center
\n
middle-right
\n
middle-left
\n
top-center
\n
top-right
\n
top-left
\n
bottom-center
\n
bottom-right
\n
bottom-left
\n
\n","isPage":false,"text":"\nTypeDefaultstringcenter\nThe position parameter determines the location of the various modals on the screen. Possible values include:\n\ncenter\nmiddle-right\nmiddle-left\ntop-center\ntop-right\ntop-left\nbottom-center\nbottom-right\nbottom-left\n\n","title":"position","titles":["Available Options"]},"109":{"href":"/sdk/sequence-kit/03-configuration#sign-in-modal-configuration-signin","html":"\n
The signIn object is used to configure the sign in modal.
\n","isPage":false,"text":"\nThe signIn object is used to configure the sign in modal.\n","title":"Sign In Modal Configuration (signIn)","titles":["Available Options"]},"110":{"href":"/sdk/sequence-kit/03-configuration#signinlogourl","html":"\n
\n
Type
Default
string
undefined
\n
URL of the logo to be shown in the sign in modal.
\n","isPage":false,"text":"\n\nTypeDefaultstringundefined\nURL of the logo to be shown in the sign in modal.\n","title":"signIn.logoUrl","titles":["Available Options","Sign In Modal Configuration (signIn)"]},"111":{"href":"/sdk/sequence-kit/03-configuration#signinprojectname","html":"\n
\n
Type
Default
string
undefined
\n
Name of the project to be shown in the sign in modal.
\n","isPage":false,"text":"\n\nTypeDefaultstringundefined\nName of the project to be shown in the sign in modal.\n","title":"signIn.projectName","titles":["Available Options","Sign In Modal Configuration (signIn)"]},"112":{"href":"/sdk/sequence-kit/03-configuration#signinshowemailinput","html":"\n
\n
Type
Default
boolean
true
\n
Determines whether the inline email input will be shown in the sign in modal.
\n","isPage":false,"text":"\n\nTypeDefaultbooleantrue\nDetermines whether the inline email input will be shown in the sign in modal.\n","title":"signIn.showEmailInput","titles":["Available Options","Sign In Modal Configuration (signIn)"]},"113":{"href":"/sdk/sequence-kit/03-configuration#signinsocialauthoptions","html":"\n
\n
Type
Default
string[]
['google', 'facebook', 'twitch', 'apple']
\n
Determines which authentication options will be shown as social options in the sign in modal.\nThe wallets will be displayed in the order they are passed in the array. The values correspond to the connector's id and a corresponding connector must be passed down to wagmi.
\n
For a full list of official connectors, see the connectors page.
\n","isPage":false,"text":"\n\nTypeDefaultstring[]['google', 'facebook', 'twitch', 'apple']\nDetermines which authentication options will be shown as social options in the sign in modal.\nThe wallets will be displayed in the order they are passed in the array. The values correspond to the connector's id and a corresponding connector must be passed down to wagmi.\nFor a full list of official connectors, see the connectors page.\n","title":"signIn.socialAuthOptions","titles":["Available Options","Sign In Modal Configuration (signIn)"]},"114":{"href":"/sdk/sequence-kit/03-configuration#signinwalletauthoptions","html":"\n
Determines which authentication options will be shown in the modal as web3 wallet options.\nThe wallets will be displayed in the order they are passed in the array. The values correspond to the connector's id and a corresponding connector must be passed down to wagmi.
\n
For a full list of official connectors, see the connectors page.
\n","isPage":false,"text":"\n\nTypeDefaultstring[]['sequence', 'metamask', 'wallet-connect', 'coinbase-wallet']\nDetermines which authentication options will be shown in the modal as web3 wallet options.\nThe wallets will be displayed in the order they are passed in the array. The values correspond to the connector's id and a corresponding connector must be passed down to wagmi.\nFor a full list of official connectors, see the connectors page.\n","title":"signIn.walletAuthOptions","titles":["Available Options","Sign In Modal Configuration (signIn)"]},"115":{"href":"/sdk/sequence-kit/03-configuration#displayedassets","html":"\n
Type
Default
[{ contractAddress: string, chainId: number }, ...]
undefined
\n
If provided, this will determine which assets are to be displayed in the embedded wallet modal main view.\nBy passing a list of displayed assets, only assets from the provided list will be displayed in the main view.\nIn the case that no assets are provided, all owned assets can be displayed in the main view.
","isPage":false,"text":"\nTypeDefault[{ contractAddress: string, chainId: number }, ...]undefined\nIf provided, this will determine which assets are to be displayed in the embedded wallet modal main view.\nBy passing a list of displayed assets, only assets from the provided list will be displayed in the main view.\nIn the case that no assets are provided, all owned assets can be displayed in the main view.","title":"displayedAssets","titles":["Available Options"]},"116":{"href":"/sdk/sequence-kit/04-checkout#overview","html":"\n
The checkout modal enables developers to easily facilitate cryptocurrency payments.
\n
\n","isPage":true,"text":"\nThe checkout modal enables developers to easily facilitate cryptocurrency payments.\n\n","title":"Overview","titles":[]},"117":{"href":"/sdk/sequence-kit/04-checkout#integration","html":"\n
To integrate the checkout feature, follow these steps:
\n","isPage":false,"text":"\nConfigure the checkout modal using the checkoutSettings object:\nconst checkoutSettings = {\n cryptoCheckout: {...},\n orderSummaryItems: {...}\n}\n","title":"Configuring the Checkout modal","titles":["Integration"]},"120":{"href":"/sdk/sequence-kit/04-checkout#crypto-checkout-configuration-cryptocheckout","html":"\n
The cryptoCheckout field specifies settings for checking out with cryptocurrency, e.g., interacting with a minting contract or marketplace contract.
","isPage":false,"text":"\nThe orderSummaryItems field specifies the list of collectibles shown in the order summary.\nExample configuration:\n orderSummaryItems: [\n {\n contractAddress: '0x631998e91476da5b870d741192fc5cbc55f5a52e',\n tokenId: '66597',\n quantityRaw: '100'\n },\n ]","title":"Order Summary Configuration (orderSummaryItems)","titles":["Integration","Configuring the Checkout modal"]},"122":{"href":"/sdk/sequence-kit/05-custom-connectors#custom-connectors-in-sequence-kit","html":"\n
Sequence Kit provides official connectors via the @0xsequence/kit-connectors package. However, you can also integrate custom connectors with Sequence Kit to support additional wallets. This guide will walk you through creating and using custom connectors.
\n","isPage":true,"text":"\nSequence Kit provides official connectors via the @0xsequence/kit-connectors package. However, you can also integrate custom connectors with Sequence Kit to support additional wallets. This guide will walk you through creating and using custom connectors.\n","title":"Custom Connectors in Sequence Kit","titles":[]},"123":{"href":"/sdk/sequence-kit/05-custom-connectors#creating-a-custom-connector","html":"\n
To create a custom connector, you can use an existing connector as a basis. For example, the Metamask Connector is a good starting point. Here's an example of how to create a custom connector:
Make sure to provide a unique id for your connector to avoid conflicts with other connectors. You can also customize fields such as name, logoDark, and logoLight to control how the connector appears in Sequence Kit.
\n
The createConnector function should return an initialized connector. Sequence Kit connectors are wrappers of Wagmi connectors, so you can use an official Wagmi connector if available, or create your own if needed.
\n","isPage":false,"text":"\nTo create a custom connector, you can use an existing connector as a basis. For example, the Metamask Connector is a good starting point. Here's an example of how to create a custom connector:\nexport const myCustomConnector = (options: MyCustomConnectorOptions) => ({\n id: 'my-custom-connector',\n name: 'My Custom Connector',\n logoDark: MyCustomLogoDark,\n logoLight: MyCustomLogoLight,\n createConnector: () => {\n const connector = myCustomConnector(options);\n return connector;\n },\n});\nMake sure to provide a unique id for your connector to avoid conflicts with other connectors. You can also customize fields such as name, logoDark, and logoLight to control how the connector appears in Sequence Kit.\nThe createConnector function should return an initialized connector. Sequence Kit connectors are wrappers of Wagmi connectors, so you can use an official Wagmi connector if available, or create your own if needed.\nFor more details on creating custom connectors, refer to Wagmi's guide on Custom Connectors.\n","title":"Creating a Custom Connector","titles":["Custom Connectors in Sequence Kit"]},"124":{"href":"/sdk/sequence-kit/05-custom-connectors#using-custom-connectors","html":"\n
When using custom connectors, you can't rely on the getDefaultConnectors utility function. Instead, you need to pass custom configurations to Sequence Kit.
\n
First, create a list of connectors, including your custom connector, and provide it to the Wagmi configuration:
\n","isPage":false,"text":"\nWhen using custom connectors, you can't rely on the getDefaultConnectors utility function. Instead, you need to pass custom configurations to Sequence Kit.\nFirst, create a list of connectors, including your custom connector, and provide it to the Wagmi configuration:\nimport { getKitConnectWallets } from '@0xsequence/kit';\n \nconst connectors = getKitConnectWallets([\n google({\n defaultNetwork: 137,\n connect: {\n app: 'my-app',\n projectAccessKey: '<access-key>'\n }\n }),\n // ... other connectors\n myCustomConnector({ appName: 'my-app' }),\n]);\n \nconst config = createConfig({\n transports,\n connectors,\n chains\n})\nNext, use your custom connector by specifying its id in either the socialAuthOptions or walletAuthOptions field of the Sequence Kit configuration:\nconst kitConfig = {\n signIn: {\n socialAuthOptions: ['google', 'facebook'],\n walletAuthOptions: ['metamask', 'my-custom-connector'],\n }\n};\n \nreturn (\n <WagmiConfig config={wagmiConfig}>\n <QueryClientProvider client={queryClient}>\n <KitProvider config={kitConfig}>\n <App />\n </KitProvider>\n </QueryClientProvider>\n </WagmiConfig>\n);\n","title":"Using Custom Connectors","titles":[]},"125":{"href":"/sdk/sequence-kit/05-custom-connectors#share-your-custom-connectors","html":"\n
Feel free to contribute your custom connectors by creating a pull request. This way, others can benefit from your work and enjoy seamless integration with Sequence Kit.
\n
Share the love ❤️ by expanding the ecosystem of custom connectors!
","isPage":false,"text":"\nFeel free to contribute your custom connectors by creating a pull request. This way, others can benefit from your work and enjoy seamless integration with Sequence Kit.\nShare the love ❤️ by expanding the ecosystem of custom connectors!","title":"Share Your Custom Connectors","titles":[]},"126":{"href":"/sdk/unity/01-overview#introduction","html":"\n
The Sequence Unity Embedded Wallet SDK provides full Sequence Embedded Wallet and Indexer integration for your Unity Games, integrated with our own purpose-built for Unity SequenceEthereum library. That's right, no Nethereum required!
\n
This SDK follows Semantic Versioning (major.minor.patch). While we're still in 0.x.y builds, API breaking changes can be made at any time. After 1.0.0, breaking changes will always cause a major version increment, non-breaking new features will cause a minor version increment, and bugfixes will cause a patch version increment.
\n","isPage":true,"text":"\nThe Sequence Unity Embedded Wallet SDK provides full Sequence Embedded Wallet and Indexer integration for your Unity Games, integrated with our own purpose-built for Unity SequenceEthereum library. That's right, no Nethereum required!\nThis SDK follows Semantic Versioning (major.minor.patch). While we're still in 0.x.y builds, API breaking changes can be made at any time. After 1.0.0, breaking changes will always cause a major version increment, non-breaking new features will cause a minor version increment, and bugfixes will cause a patch version increment.\n","title":"Introduction","titles":[]},"127":{"href":"/sdk/unity/01-overview#requirements","html":"\n
Unity 2021.3.6f1 or later
\n
\n
Android
\n
iOS
\n
PC standalone
\n
Mac standalone -> (Mono builds only when using Social Sign in -> in our testing MacOS doesn't pick up custom URL schemes automatically unless you run some system commands first; these system commands only work on Mono -> see OpenIdAuthentication.PlatformSpecificSetup)
\n
WebGL (excluding Social Sign in)
\n
","isPage":false,"text":"\nUnity 2021.3.6f1 or later\n\nAndroid\niOS\nPC standalone\nMac standalone -> (Mono builds only when using Social Sign in -> in our testing MacOS doesn't pick up custom URL schemes automatically unless you run some system commands first; these system commands only work on Mono -> see OpenIdAuthentication.PlatformSpecificSetup)\nWebGL (excluding Social Sign in)\n","title":"Requirements","titles":["Introduction"]},"128":{"href":"/sdk/unity/02-installation#installation","html":"\n","isPage":true,"text":"\n","title":"Installation","titles":[]},"129":{"href":"/sdk/unity/02-installation#package-manager---recommended","html":"\n\n
Ensure you have Git 2.14.0 or above installed on your machine
\n
Open Package Manager (Window > Package Manager)
\n
Click the "+" icon in the Package Manager window > "Add package from git URL..."
\n
Paste this url and click Add or press Enter on your keyboard https://github.com/0xsequence/sequence-unity.git?path=/Assets
\n
From Package Manager, click on "Samples"
\n
Import "Setup" from Samples\n
\n\n
a) This will import a Resources folder with the SequenceConfig scriptable object (more on this in Setup).
\n
b) This will also import an Editor folder with a Post Process Build script that will setup social sign in for you automatically on MacOS and iOS.
\n\n
Import TMP Essentials (if you haven't already). Note: Unity should prompt you to do this automatically if you attempt to Play or Build with a TextMeshPro object in your scene.
\n\n
\n","isPage":false,"text":"\n\nEnsure you have Git 2.14.0 or above installed on your machine\nOpen Package Manager (Window > Package Manager)\nClick the "+" icon in the Package Manager window > "Add package from git URL..."\nPaste this url and click Add or press Enter on your keyboard https://github.com/0xsequence/sequence-unity.git?path=/Assets\nFrom Package Manager, click on "Samples"\nImport "Setup" from Samples\n\n\na) This will import a Resources folder with the SequenceConfig scriptable object (more on this in Setup).\nb) This will also import an Editor folder with a Post Process Build script that will setup social sign in for you automatically on MacOS and iOS.\n\nImport TMP Essentials (if you haven't already). Note: Unity should prompt you to do this automatically if you attempt to Play or Build with a TextMeshPro object in your scene.\n\n\n","title":"Package Manager - Recommended","titles":["Installation"]},"130":{"href":"/sdk/unity/02-installation#samples","html":"\n
In addition to this documentation, we've also provided you with a few samples to help with using our SDK.
\n
These can be found by:
\n\n
Opening Package Manager
\n
Finding our SDK "Sequence WaaS SDK"
\n
Click on "Samples"
\n
Click "Import" next to any sample you wish to install. This will create a Samples folder under Assets and import the sample there. The sample will be completely mutable as it lives within your Assets folder.
\n\n
\n
The second sample "Demo Scene" is sample scene that showcases some of the features of our SDK. It serves as a useful supplement to the documentation.
\n
The third sample "Demo Tower Defense Game" is a sample game. We began with Unity's Tower Defense Template project and ripped out the save system to replace it with ERC1155s. When importing this sample game into your project, you may get a message "Script Updating Consent" that asks if you want to update the source files to the a newer API. This is because the template project was made on a much earlier version of Unity and some of the scripting APIs used by Unity have changed since the template project was created. You can simply click "Yes, just for these files". Note that, in order to play the demo game, there is some config you need to setup. However, even without configuring the game, we believe the Scripts within the project can be a useful resource when starting out.
\n
\n","isPage":false,"text":"\nIn addition to this documentation, we've also provided you with a few samples to help with using our SDK.\nThese can be found by:\n\nOpening Package Manager\nFinding our SDK "Sequence WaaS SDK"\nClick on "Samples"\nClick "Import" next to any sample you wish to install. This will create a Samples folder under Assets and import the sample there. The sample will be completely mutable as it lives within your Assets folder.\n\n\nThe second sample "Demo Scene" is sample scene that showcases some of the features of our SDK. It serves as a useful supplement to the documentation.\nThe third sample "Demo Tower Defense Game" is a sample game. We began with Unity's Tower Defense Template project and ripped out the save system to replace it with ERC1155s. When importing this sample game into your project, you may get a message "Script Updating Consent" that asks if you want to update the source files to the a newer API. This is because the template project was made on a much earlier version of Unity and some of the scripting APIs used by Unity have changed since the template project was created. You can simply click "Yes, just for these files". Note that, in order to play the demo game, there is some config you need to setup. However, even without configuring the game, we believe the Scripts within the project can be a useful resource when starting out.\n\n","title":"Samples","titles":["Installation","Package Manager - Recommended"]},"131":{"href":"/sdk/unity/02-installation#manual","html":"\n
Installing via Package Manager will put the SDK in a read-only state - note: you will still be able to modify the UI when using Package Manager.
\n
For most use cases, this is ideal. However, we recognize that some advanced users will want the flexibility to edit the SDK as they see fit.
\n
Please note that if you do chose this route that updating the SDK will become more challenging because any changes you make will be overwritten and these changes can easily go unnoticed in a version control system. In general, we feel it is safer to import the SDK in read-only mode via Package Manager and write wrappers to extend as needed, but we empower you to work with our SDK how you see fit.
\n\n
Add Newtonsoft.json to your project (if it isn't there already) via package manager. Click on the "+" icon in the Package Manager window > "Add package by name..." and add com.unity.nuget.newtonsoft-json.
Drag the .unitypackage file into your project window and import it
\n
Import TMP Essentials (if you haven't already). Note: Unity should prompt you to do this automatically if you attempt to Play or Build with a TextMeshPro object in your scene.
\n","isPage":false,"text":"\nInstalling via Package Manager will put the SDK in a read-only state - note: you will still be able to modify the UI when using Package Manager.\nFor most use cases, this is ideal. However, we recognize that some advanced users will want the flexibility to edit the SDK as they see fit.\nPlease note that if you do chose this route that updating the SDK will become more challenging because any changes you make will be overwritten and these changes can easily go unnoticed in a version control system. In general, we feel it is safer to import the SDK in read-only mode via Package Manager and write wrappers to extend as needed, but we empower you to work with our SDK how you see fit.\n\nAdd Newtonsoft.json to your project (if it isn't there already) via package manager. Click on the "+" icon in the Package Manager window > "Add package by name..." and add com.unity.nuget.newtonsoft-json.\nDownload the latest release of the Sequence Unity SDK UnityPackage\nDrag the .unitypackage file into your project window and import it\nImport TMP Essentials (if you haven't already). Note: Unity should prompt you to do this automatically if you attempt to Play or Build with a TextMeshPro object in your scene.\n","title":"Manual","titles":["Installation"]},"132":{"href":"/sdk/unity/03-setup#setup","html":"\n\n
\n
Navigate to the Resources folder imported via the Setup sample and locate the SequenceConfig ScriptableObject
\n
a) If you imported the SDK manually, you will need to create a Resources folder and SequenceConfig
\n
b) Create a Resources folder located at Assets/Resources. The SDK uses Resources.Load to load the config ScriptableObject we'll create in the next step.
\n
c) On the top bar, click Assets > Create > Sequence > SequenceConfig and place the newly created ScriptableObject at the root of your Resources folder.
\n
\n
\n
Fill in SequenceConfig with the appropriate values for your project.
\n
a) Url Scheme - You must replace this with a string that is unique to your application. This is very important. Failure to do so will cause unexpected behaviour when signing in with social sign in and it will not work.
\n
b) Builder API Keys - These are found in the Builder under Settings > API Access Keys
\n
c) WaaS Config Key - This will be given to you by the Sequence team during WaaS onboarding
\n
\n","isPage":true,"text":"\n\n\nNavigate to the Resources folder imported via the Setup sample and locate the SequenceConfig ScriptableObject\na) If you imported the SDK manually, you will need to create a Resources folder and SequenceConfig\nb) Create a Resources folder located at Assets/Resources. The SDK uses Resources.Load to load the config ScriptableObject we'll create in the next step.\nc) On the top bar, click Assets > Create > Sequence > SequenceConfig and place the newly created ScriptableObject at the root of your Resources folder.\n\n\nFill in SequenceConfig with the appropriate values for your project.\na) Url Scheme - You must replace this with a string that is unique to your application. This is very important. Failure to do so will cause unexpected behaviour when signing in with social sign in and it will not work.\nb) Builder API Keys - These are found in the Builder under Settings > API Access Keys\nc) WaaS Config Key - This will be given to you by the Sequence team during WaaS onboarding\n\n","title":"Setup","titles":[]},"133":{"href":"/sdk/unity/04-authentication#authentication","html":"\n
As a WaaS SDK, authentication is extremely important. Authentication works by establishing a session signing wallet through association with an OIDC idToken. For more on how our Embedded Wallet works, please see Embedded Wallet docs.
\n
To implement authentication, we recommend using our LoginPanel prefab. Locate this prefab under SequenceExamples > Prefabs and drag it under a Canvas in your scene.\nWe recommend having the Canvas Scaler component attached to your Canvas use the "Scale with Screen Size" UI Scale Mode. This will make it so that the LoginPanel (and any other UI elements under this Canvas) are scaled automatically when switching between build targets.
\n
Note: The LoginPanel is hidden by default. You can open it with the Open method and no arguments. To help with this, the LoginPanel GameObject is not disabled, so feel free to use GetComponentInChildren, FindObjectOfType, or similar to obtain a reference to the LoginPanel MonoBehaviour.
\n
This will provide you easy access to two authentication methods:
\n","isPage":true,"text":"\nAs a WaaS SDK, authentication is extremely important. Authentication works by establishing a session signing wallet through association with an OIDC idToken. For more on how our Embedded Wallet works, please see Embedded Wallet docs.\nTo implement authentication, we recommend using our LoginPanel prefab. Locate this prefab under SequenceExamples > Prefabs and drag it under a Canvas in your scene.\nWe recommend having the Canvas Scaler component attached to your Canvas use the "Scale with Screen Size" UI Scale Mode. This will make it so that the LoginPanel (and any other UI elements under this Canvas) are scaled automatically when switching between build targets.\nNote: The LoginPanel is hidden by default. You can open it with the Open method and no arguments. To help with this, the LoginPanel GameObject is not disabled, so feel free to use GetComponentInChildren, FindObjectOfType, or similar to obtain a reference to the LoginPanel MonoBehaviour.\nThis will provide you easy access to two authentication methods:\n","title":"Authentication","titles":[]},"134":{"href":"/sdk/unity/04-authentication#1-email-sign-in","html":"\n
Available on all platforms, email sign in leverages Amazon Cognito and provides the user with a 2FA challenge - a 6 digit code emailed to the entered address for the user to enter on the next page.\nOnce the user successfully completes the 2FA challenge, the SDK will receive an idToken in JWT format from Amazon Cognito and proceed to establish the session with WaaS API.
\n","isPage":false,"text":"\nAvailable on all platforms, email sign in leverages Amazon Cognito and provides the user with a 2FA challenge - a 6 digit code emailed to the entered address for the user to enter on the next page.\nOnce the user successfully completes the 2FA challenge, the SDK will receive an idToken in JWT format from Amazon Cognito and proceed to establish the session with WaaS API.\n","title":"1. Email Sign In","titles":["Authentication"]},"135":{"href":"/sdk/unity/04-authentication#2-social-sign-in","html":"\n
Available on all platforms except WebGL (currently), social sign in uses OIDC with the implicit flow to allow users to login via their existing Google, Discord, Facebook, or Apple accounts.\nOnce the user successfully signs in, an idToken is returned via deep link to the application.\nIn order to enable deep linking, we must register a custom URL scheme for our application. There are some platform specific requirements to set this up.
\nNote: social sign in does not work in the Editor as we cannot register a custom URL scheme.\n","isPage":false,"text":"\nAvailable on all platforms except WebGL (currently), social sign in uses OIDC with the implicit flow to allow users to login via their existing Google, Discord, Facebook, or Apple accounts.\nOnce the user successfully signs in, an idToken is returned via deep link to the application.\nIn order to enable deep linking, we must register a custom URL scheme for our application. There are some platform specific requirements to set this up.\nNote: social sign in does not work in the Editor as we cannot register a custom URL scheme.\n","title":"2. Social Sign in","titles":["Authentication"]},"136":{"href":"/sdk/unity/04-authentication#ios","html":"\n\n
Open the iOS Player Settings window (menu: Edit > Project Settings > Player Settings, then select iOS).
\n
Select Other Settings, then scroll down to Configuration.
\n
Expand the Supported URL schemes section, and add 1 to the size.
\n
In the new Element N field, enter the URL scheme you've configured in SequenceConfig.
\n\n
\n","isPage":false,"text":"\n\nOpen the iOS Player Settings window (menu: Edit > Project Settings > Player Settings, then select iOS).\nSelect Other Settings, then scroll down to Configuration.\nExpand the Supported URL schemes section, and add 1 to the size.\nIn the new Element N field, enter the URL scheme you've configured in SequenceConfig.\n\n\n","title":"iOS","titles":["Authentication","2. Social Sign in"]},"137":{"href":"/sdk/unity/04-authentication#macos","html":"\n\n
Open the Windows/Mac/Linux Player Settings window (menu: Edit > Project Settings > Player Settings, then select Windows/Mac/Linux).
\n
Select Other Settings, then scroll down to Mac Configuration.
\n
Expand the Supported URL schemes section, and add 1 to the size.
\n
In the new Element N field, enter the URL scheme you've configured in SequenceConfig.
\n\n
\n","isPage":false,"text":"\n\nOpen the Windows/Mac/Linux Player Settings window (menu: Edit > Project Settings > Player Settings, then select Windows/Mac/Linux).\nSelect Other Settings, then scroll down to Mac Configuration.\nExpand the Supported URL schemes section, and add 1 to the size.\nIn the new Element N field, enter the URL scheme you've configured in SequenceConfig.\n\n\n","title":"MacOS","titles":["Authentication","2. Social Sign in"]},"138":{"href":"/sdk/unity/04-authentication#pc","html":"\n
No additional steps required.
\n","isPage":false,"text":"\nNo additional steps required.\n","title":"PC","titles":["Authentication","2. Social Sign in"]},"139":{"href":"/sdk/unity/04-authentication#android","html":"\n\n
In the Project window, browse to Assets > Plugins > Android.
\n\n
a) Note: in Unity versions 2021.2 and up this path doesn't exist by default. Please navigate to Edit > Project Settings > Player and under the Android Publishing Settings, enable Custom Main Manifest in the Build section. See https://docs.unity3d.com/Manual/deep-linking-android.html for more info.
\n\n
If it doesn't already exist, create a new file and name it AndroidManifest.xml.
\n
Paste the following XML into the file, or, if you already have one, add the new keys from this XML to it.
\n
Make sure to replace 'sdk-powered-by-sequence' with the Url Scheme you set in SequenceConfig
\n\n
<?xml version="1.0" encoding="utf-8"?>\n <manifest\n xmlns:android="http://schemas.android.com/apk/res/android"\n xmlns:tools="http://schemas.android.com/tools"\n >\n <application>\n <activity\n android:name="com.unity3d.player.UnityPlayerActivity"\n android:theme="@style/UnityThemeSelector"\n >\n <intent-filter>\n <action android:name="android.intent.action.MAIN" />\n <category android:name="android.intent.category.LAUNCHER" />\n </intent-filter>\n <intent-filter>\n <action android:name="android.intent.action.VIEW" />\n <category android:name="android.intent.category.DEFAULT" />\n <category android:name="android.intent.category.BROWSABLE" />\n <data android:scheme="sdk-powered-by-sequence"/> <!-- substitute 'sdk-powered-by-sequence' with the Url Scheme you set in `SequenceConfig` -->\n </intent-filter>\n </activity>\n </application>\n </manifest>
\n
b) Note: Unity 2022 versions prior to 2022.3.7f1 and 2023 versions prior to 2023.1.7f1, 2023.2.0b3, or 2023.3.0a1 contain a bug with Android deep-linking. Please use this XML instead.
\n
<?xml version="1.0" encoding="utf-8"?>\n<manifest\n xmlns:android="http://schemas.android.com/apk/res/android"\n xmlns:tools="http://schemas.android.com/tools"\n>\n <application>\n <activity\n android:name="com.unity3d.player.UnityPlayerActivity"\n android:theme="@style/UnityThemeSelector"\n android:exported="true">\n <intent-filter>\n <action android:name="android.intent.action.MAIN" />\n <category android:name="android.intent.category.LAUNCHER" />\n </intent-filter>\n <meta-data android:name="unityplayer.UnityActivity" android:value="true" />\n <intent-filter>\n <action android:name="android.intent.action.VIEW" />\n <category android:name="android.intent.category.DEFAULT" />\n <category android:name="android.intent.category.BROWSABLE" />\n <data android:scheme="sdk-powered-by-sequence"/> <!-- substitute 'sdk-powered-by-sequence' with the Url Scheme you set in `SequenceConfig` -->\n </intent-filter>\n </activity>\n </application>\n</manifest>
\n","isPage":false,"text":"\n\nIn the Project window, browse to Assets > Plugins > Android.\n\na) Note: in Unity versions 2021.2 and up this path doesn't exist by default. Please navigate to Edit > Project Settings > Player and under the Android Publishing Settings, enable Custom Main Manifest in the Build section. See https://docs.unity3d.com/Manual/deep-linking-android.html for more info.\n\nIf it doesn't already exist, create a new file and name it AndroidManifest.xml.\nPaste the following XML into the file, or, if you already have one, add the new keys from this XML to it.\nMake sure to replace 'sdk-powered-by-sequence' with the Url Scheme you set in SequenceConfig\n\n <?xml version="1.0" encoding="utf-8"?>\n <manifest\n xmlns:android="http://schemas.android.com/apk/res/android"\n xmlns:tools="http://schemas.android.com/tools"\n >\n <application>\n <activity\n android:name="com.unity3d.player.UnityPlayerActivity"\n android:theme="@style/UnityThemeSelector"\n >\n <intent-filter>\n <action android:name="android.intent.action.MAIN" />\n <category android:name="android.intent.category.LAUNCHER" />\n </intent-filter>\n <intent-filter>\n <action android:name="android.intent.action.VIEW" />\n <category android:name="android.intent.category.DEFAULT" />\n <category android:name="android.intent.category.BROWSABLE" />\n <data android:scheme="sdk-powered-by-sequence"/> <!-- substitute 'sdk-powered-by-sequence' with the Url Scheme you set in `SequenceConfig` -->\n </intent-filter>\n </activity>\n </application>\n </manifest>\nb) Note: Unity 2022 versions prior to 2022.3.7f1 and 2023 versions prior to 2023.1.7f1, 2023.2.0b3, or 2023.3.0a1 contain a bug with Android deep-linking. Please use this XML instead.\n<?xml version="1.0" encoding="utf-8"?>\n<manifest\n xmlns:android="http://schemas.android.com/apk/res/android"\n xmlns:tools="http://schemas.android.com/tools"\n>\n <application>\n <activity\n android:name="com.unity3d.player.UnityPlayerActivity"\n android:theme="@style/UnityThemeSelector"\n android:exported="true">\n <intent-filter>\n <action android:name="android.intent.action.MAIN" />\n <category android:name="android.intent.category.LAUNCHER" />\n </intent-filter>\n <meta-data android:name="unityplayer.UnityActivity" android:value="true" />\n <intent-filter>\n <action android:name="android.intent.action.VIEW" />\n <category android:name="android.intent.category.DEFAULT" />\n <category android:name="android.intent.category.BROWSABLE" />\n <data android:scheme="sdk-powered-by-sequence"/> <!-- substitute 'sdk-powered-by-sequence' with the Url Scheme you set in `SequenceConfig` -->\n </intent-filter>\n </activity>\n </application>\n</manifest>\ni.e. add <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> after your first intent-filter. Please see https://forum.unity.com/threads/deep-linking-in-unity-2022-the-app-is-restarted.1447300/ for more info.\n","title":"Android","titles":["Authentication","2. Social Sign in"]},"140":{"href":"/sdk/unity/04-authentication#webgl","html":"\n
Coming soon.
\n","isPage":false,"text":"\nComing soon.\n","title":"WebGL","titles":["Authentication","2. Social Sign in"]},"141":{"href":"/sdk/unity/04-authentication#connecting-with-waas","html":"\n
Once we've received the idToken from either email login or social sign in, the SDK will handle connecting with WaaS servers for you. If you're curious how this is done, please see ConnectToWaaS in WaaSLogin.cs.\nYou'll want to subscribe to the WaaSWallet.OnWaaSWalletCreated event. This can be done with the following code snippet:
\n
WaaSWallet.OnWaaSWalletCreated += OnWaaSWalletCreatedHandler;\n\npublic void OnWaaSWalletCreatedHandler(WaaSWallet wallet) {\n // Do something\n}
\n
where OnWaaSWalletCreatedHandler is a function accepting a WaaSWallet as it's only parameter. If you're unfamiliar with working with events in Unity, check out this great Reddit post!
\n
Congratulations! You've just connected your user with WaaS, creating them a new account and non-custodial smart contract wallet as needed.
","isPage":false,"text":"\nOnce we've received the idToken from either email login or social sign in, the SDK will handle connecting with WaaS servers for you. If you're curious how this is done, please see ConnectToWaaS in WaaSLogin.cs.\nYou'll want to subscribe to the WaaSWallet.OnWaaSWalletCreated event. This can be done with the following code snippet:\nWaaSWallet.OnWaaSWalletCreated += OnWaaSWalletCreatedHandler;\n\npublic void OnWaaSWalletCreatedHandler(WaaSWallet wallet) {\n // Do something\n}\nwhere OnWaaSWalletCreatedHandler is a function accepting a WaaSWallet as it's only parameter. If you're unfamiliar with working with events in Unity, check out this great Reddit post!\nCongratulations! You've just connected your user with WaaS, creating them a new account and non-custodial smart contract wallet as needed.","title":"Connecting with WaaS","titles":["Authentication"]},"142":{"href":"/sdk/unity/05-write-to-blockchain#write-to-blockchain","html":"\n
The blockchain can be thought of as a general-purpose, publically viewable and verified, database. To write to a blockchain, similar to with a typical database, you must make a transaction.
\n
Typically, creating a blockchain transaction is rather complex, but WaaS handles that complexity for you and exposes 5 types of Transactions.
\n
Sending a transaction is an asynchronous Task. You can use await when calling WaaSWallet.SendTransaction from within an async Task if you wish to obtain the TransactionReturn object directly. Or, you can take the recommended approach which is to setup handler functions for the WaaSWallet.OnSendTransactionComplete and WaaSWallet.OnSendTransactionFailed events and call the WaaSWallet.SendTransaction method from anywhere (without await). For example:
\n
public void OnSendTransactionCompleteHandler(SuccessfulTransactionReturn result) {\n // Do something\n}\n\npublic void OnSendTransactionFailedHandler(FailedTransactionReturn result) {\n // Do something\n}\n\npublic void OnWaaSWalletCreatedHander(WaaSWallet wallet) {\n wallet.OnSendTransactionComplete += OnSendTransactionCompleteHandler;\n wallet.OnSendTransactionFailed += OnSendTransactionFailedHandler;\n}
\n
If you're unfamiliar with working with events in Unity, check out this great Reddit post!
\n","isPage":true,"text":"\nThe blockchain can be thought of as a general-purpose, publically viewable and verified, database. To write to a blockchain, similar to with a typical database, you must make a transaction.\nTypically, creating a blockchain transaction is rather complex, but WaaS handles that complexity for you and exposes 5 types of Transactions.\nSending a transaction is an asynchronous Task. You can use await when calling WaaSWallet.SendTransaction from within an async Task if you wish to obtain the TransactionReturn object directly. Or, you can take the recommended approach which is to setup handler functions for the WaaSWallet.OnSendTransactionComplete and WaaSWallet.OnSendTransactionFailed events and call the WaaSWallet.SendTransaction method from anywhere (without await). For example:\npublic void OnSendTransactionCompleteHandler(SuccessfulTransactionReturn result) {\n // Do something\n}\n\npublic void OnSendTransactionFailedHandler(FailedTransactionReturn result) {\n // Do something\n}\n\npublic void OnWaaSWalletCreatedHander(WaaSWallet wallet) {\n wallet.OnSendTransactionComplete += OnSendTransactionCompleteHandler;\n wallet.OnSendTransactionFailed += OnSendTransactionFailedHandler;\n}\nIf you're unfamiliar with working with events in Unity, check out this great Reddit post!\n","title":"Write to Blockchain","titles":[]},"143":{"href":"/sdk/unity/05-write-to-blockchain#rawtransaction","html":"\n
The most basic form of a Transaction, a raw transaction is very useful to send ETH or the gas currency of the network you are interacting with to an Address.
\n
For example, to send one MATIC to 0x9766bf76b2E3e7BCB8c61410A3fC873f1e89b43f you can use this snippet:
\n
_wallet.SendTransaction(\n Chain.Polygon,\n new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction("0x9766bf76b2E3e7BCB8c61410A3fC873f1e89b43f", DecimalNormalizer.Normalize(1))\n });
\n
where _wallet is a WaaSWallet.
\n
Note: the EVM does not support floating point numbers. As a result, token (and gas currency) values are represented by whole numbers and a "decimals" value. 1 ETH (or in the example above 1 MATIC) is represented as 1000000000000000000 (1 * 10^18) as ETH, MATIC, and most gas currencies have a "decimals" value of 18. DecimalNormalizer.Normalize (above) is a basic helper function that will return input value * 10^decimals and optionally accepts a "decimals" value as a second parameter (defaulting to 18 when not provided).
\n
Additionally, you can include data with a raw transaction in hexadecimal format as a string. For more on this, please see the advanced section of this documentation.
\n","isPage":false,"text":"\nThe most basic form of a Transaction, a raw transaction is very useful to send ETH or the gas currency of the network you are interacting with to an Address.\nFor example, to send one MATIC to 0x9766bf76b2E3e7BCB8c61410A3fC873f1e89b43f you can use this snippet:\n_wallet.SendTransaction(\n Chain.Polygon,\n new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction("0x9766bf76b2E3e7BCB8c61410A3fC873f1e89b43f", DecimalNormalizer.Normalize(1))\n });\nwhere _wallet is a WaaSWallet.\nNote: the EVM does not support floating point numbers. As a result, token (and gas currency) values are represented by whole numbers and a "decimals" value. 1 ETH (or in the example above 1 MATIC) is represented as 1000000000000000000 (1 * 10^18) as ETH, MATIC, and most gas currencies have a "decimals" value of 18. DecimalNormalizer.Normalize (above) is a basic helper function that will return input value * 10^decimals and optionally accepts a "decimals" value as a second parameter (defaulting to 18 when not provided).\nAdditionally, you can include data with a raw transaction in hexadecimal format as a string. For more on this, please see the advanced section of this documentation.\n","title":"RawTransaction","titles":["Write to Blockchain"]},"144":{"href":"/sdk/unity/05-write-to-blockchain#senderc20","html":"\n
An ERC20 token is the fungible token standard. You can easily deploy an ERC20 contract and mint tokens using our Builder. Learn how in our Builder documentation.
\n
To send an ERC20 token transaction, you can use this code snippet:
\n
_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new SendERC20(\n erc20TokenAddress,\n ToAddress,\n AmountAsString),\n });
\n
Note: as above, it is recommended to use DecimalNormalizer.Normalize to convert the amount from human readable format to EVM format. Please make sure to include the optional "decimals" int parameter if your ERC20 token has a "decimals" value that is not 18. If you're not sure how many "decimals" your ERC20 has, this can be easily read on the Builder using the "decimals" method under "Read Contract".
\n","isPage":false,"text":"\nAn ERC20 token is the fungible token standard. You can easily deploy an ERC20 contract and mint tokens using our Builder. Learn how in our Builder documentation.\nTo send an ERC20 token transaction, you can use this code snippet:\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new SendERC20(\n erc20TokenAddress,\n ToAddress,\n AmountAsString),\n });\nNote: as above, it is recommended to use DecimalNormalizer.Normalize to convert the amount from human readable format to EVM format. Please make sure to include the optional "decimals" int parameter if your ERC20 token has a "decimals" value that is not 18. If you're not sure how many "decimals" your ERC20 has, this can be easily read on the Builder using the "decimals" method under "Read Contract".\n","title":"sendERC20","titles":["Write to Blockchain"]},"145":{"href":"/sdk/unity/05-write-to-blockchain#complex-erc20-interactions","html":"\n
For interactions with ERC20 tokens outside of basic transfers, you'll want to use our SequenceEthereum library provided with the SDK. We've created ERC20 smart contract wrapper functions for your convenience that allow you to create and send RawTransactions with WaaS.
\n
First, you'll need to create an ERC20 object by providing a contract address and optionally, an ABI string, if you are using a custom variation of the ERC20 standard (not recommended).
\n
ERC20 myToken = new ERC20(myTokenAddress);
\n
with this reference, you'll have access to all of the methods implemented by the ERC20 class. Any method that returns a CallContractFunction, e.g. Mint, can be used when creating a RawTransaction with WaaS. For example:
\n
ERC20 myToken = new ERC20(myTokenAddress);\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction(myToken.Mint(toAddress, DecimalNormalizer.NormalizeAsBigInteger(amount))),\n });
\n","isPage":false,"text":"\nFor interactions with ERC20 tokens outside of basic transfers, you'll want to use our SequenceEthereum library provided with the SDK. We've created ERC20 smart contract wrapper functions for your convenience that allow you to create and send RawTransactions with WaaS.\nFirst, you'll need to create an ERC20 object by providing a contract address and optionally, an ABI string, if you are using a custom variation of the ERC20 standard (not recommended).\nERC20 myToken = new ERC20(myTokenAddress);\nwith this reference, you'll have access to all of the methods implemented by the ERC20 class. Any method that returns a CallContractFunction, e.g. Mint, can be used when creating a RawTransaction with WaaS. For example:\nERC20 myToken = new ERC20(myTokenAddress);\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction(myToken.Mint(toAddress, DecimalNormalizer.NormalizeAsBigInteger(amount))),\n });\n","title":"Complex ERC20 Interactions","titles":["Write to Blockchain","sendERC20"]},"146":{"href":"/sdk/unity/05-write-to-blockchain#senderc721","html":"\n
An ERC721 token is the non-fungible standard, you've probably heard of them as NFTs. You can easily deploy an ERC721 contract and mint tokens using our Builder. Learn how in our Builder documentation.
\n
To send an ERC721 token transaction, you can use this code snippet:
\n
_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new SendERC721(\n erc721TokenAddress,\n ToAddress,\n TokenIdAsString),\n });
\n","isPage":false,"text":"\nAn ERC721 token is the non-fungible standard, you've probably heard of them as NFTs. You can easily deploy an ERC721 contract and mint tokens using our Builder. Learn how in our Builder documentation.\nTo send an ERC721 token transaction, you can use this code snippet:\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new SendERC721(\n erc721TokenAddress,\n ToAddress,\n TokenIdAsString),\n });\n","title":"sendERC721","titles":["Write to Blockchain"]},"147":{"href":"/sdk/unity/05-write-to-blockchain#complex-erc721-interactions","html":"\n
For interactions with ERC721 tokens outside of basic transfers, you'll want to use our SequenceEthereum library provided with the SDK. We've created ERC21 smart contract wrapper functions for your convenience that allow you to create and send RawTransactions with WaaS.
\n
First, you'll need to create an ERC721 object by providing a contract address and optionally, an ABI string, if you are using a custom variation of the ERC721 standard (not recommended).
\n
ERC721 myToken = new ERC721(myTokenAddress);
\n
with this reference, you'll have access to all of the methods implemented by the ERC721 class. Any method that returns a CallContractFunction, e.g. SafeMint, can be used when creating a RawTransaction with WaaS. For example:
\n
ERC721 myToken = new ERC721(myTokenAddress);\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction(myToken.SafeMint(toAddress)),\n });
\n","isPage":false,"text":"\nFor interactions with ERC721 tokens outside of basic transfers, you'll want to use our SequenceEthereum library provided with the SDK. We've created ERC21 smart contract wrapper functions for your convenience that allow you to create and send RawTransactions with WaaS.\nFirst, you'll need to create an ERC721 object by providing a contract address and optionally, an ABI string, if you are using a custom variation of the ERC721 standard (not recommended).\nERC721 myToken = new ERC721(myTokenAddress);\nwith this reference, you'll have access to all of the methods implemented by the ERC721 class. Any method that returns a CallContractFunction, e.g. SafeMint, can be used when creating a RawTransaction with WaaS. For example:\nERC721 myToken = new ERC721(myTokenAddress);\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction(myToken.SafeMint(toAddress)),\n });\n","title":"Complex ERC721 Interactions","titles":["Write to Blockchain","sendERC721"]},"148":{"href":"/sdk/unity/05-write-to-blockchain#senderc1155","html":"\n
An ERC1155 token is the multi token standard, often referred to as SFTs (semi-fungible tokens). As co-creators of the ERC1155 standard we are firm believers in its unparalleled usefulness for games. You can easily deploy an ERC1155 contract and mint tokens using our Builder. Learn how in our Builder documentation.
\n
To send an ERC1155 token transaction, you can use this code snippet:
\n
_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new SendERC1155(\n erc1155TokenAddress,\n ToAddress,\n new SendERC1155Values[]\n {\n new SendERC1155Values(TokenIdAsString, AmountAsString),\n ...\n }),\n });
\n
Note: you can send multiple token ids from the same ERC1155 contract in a single transaction by including multiple SendERC1155Values objects in the transaction
\n","isPage":false,"text":"\nAn ERC1155 token is the multi token standard, often referred to as SFTs (semi-fungible tokens). As co-creators of the ERC1155 standard we are firm believers in its unparalleled usefulness for games. You can easily deploy an ERC1155 contract and mint tokens using our Builder. Learn how in our Builder documentation.\nTo send an ERC1155 token transaction, you can use this code snippet:\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new SendERC1155(\n erc1155TokenAddress,\n ToAddress,\n new SendERC1155Values[]\n {\n new SendERC1155Values(TokenIdAsString, AmountAsString),\n ...\n }),\n });\nNote: you can send multiple token ids from the same ERC1155 contract in a single transaction by including multiple SendERC1155Values objects in the transaction\n","title":"sendERC1155","titles":["Write to Blockchain"]},"149":{"href":"/sdk/unity/05-write-to-blockchain#complex-erc1155-interactions","html":"\n
For interactions with ERC1155 tokens outside of basic transfers, you'll want to use our SequenceEthereum library provided with the SDK. We've created ERC1155 smart contract wrapper functions for your convenience that allow you to create and send RawTransactions with WaaS.
\n
First, you'll need to create an ERC1155 object by providing a contract address and optionally, an ABI string, if you are using a custom variation of the ERC1155 standard (not recommended).
\n
ERC1155 myToken = new ERC1155(myTokenAddress);
\n
with this reference, you'll have access to all of the methods implemented by the ERC1155 class. Any method that returns a CallContractFunction, e.g. Mint, can be used when creating a RawTransaction with WaaS. For example:
\n
ERC1155 myToken = new ERC1155(myTokenAddress);\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction(myToken.Mint(toAddress, tokenId, amount)),\n });
\n","isPage":false,"text":"\nFor interactions with ERC1155 tokens outside of basic transfers, you'll want to use our SequenceEthereum library provided with the SDK. We've created ERC1155 smart contract wrapper functions for your convenience that allow you to create and send RawTransactions with WaaS.\nFirst, you'll need to create an ERC1155 object by providing a contract address and optionally, an ABI string, if you are using a custom variation of the ERC1155 standard (not recommended).\nERC1155 myToken = new ERC1155(myTokenAddress);\nwith this reference, you'll have access to all of the methods implemented by the ERC1155 class. Any method that returns a CallContractFunction, e.g. Mint, can be used when creating a RawTransaction with WaaS. For example:\nERC1155 myToken = new ERC1155(myTokenAddress);\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction(myToken.Mint(toAddress, tokenId, amount)),\n });\n","title":"Complex ERC1155 Interactions","titles":["Write to Blockchain","sendERC1155"]},"150":{"href":"/sdk/unity/05-write-to-blockchain#delayedencode","html":"\n
When calling a smart contract on an EVM-based network, the client goes through a complex process known as "ABI encoding" where the function signature you want to call as well as the parameters you're providing are encoded into a binary format. This process is complicated and error-prone so we've abstracted it all away so that you don't have to deal with it. But, if you're curious to learn how it works, please see this document.
\n
A DelayedEncode transaction allows you to call any method on an arbitrary smart contract, allowing us to handle the complicated ABI encoding process.
\n
To send a DelayedEncode transaction, you can use this code snippet:
\n
_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new DelayedEncode(ContractAddress, ValueAsString, new DelayedEncodeData(\n ContractABIAsString,\n ParametersAsObjectArray,\n FunctionNameAsString)),\n });
\n
Let's examine the above to get a better understanding of some of the variables that may be non-obvious.
\n
ValueAsString: This will usually be "0" unless you are calling a payable method denoted by the payable keyword in the smart contract definition. If you are calling a payable method, it is recommended to use DecimalNormalizer.Normalize to convert the amount from human readable format to EVM format.
\n
ContractABIAsString: This can either be the entire ABI or just the function you plan on interacting with. If you're not familiar with ABIs, we'd recommend copy-pasting the function signature (with parameters) from the contract source code on Etherscan (or the appropriate block explorer for your network) and removing the whitespace and variable names.
\n
ParametersAsObjectArray: The parameters you want to provide to the method you wish to call. No need to provide the parameter names, just their values in the order they appear in the ABI. Provide parameters in string format when in doubt.
\n
FunctionNameAsString: The name of the function you want to call as it appears in the ABI (or source code). Exclude parentheses and parameters.
\n
Putting this together, an example of using delayed encode to call the "mint" function on an ERC20 would look like this:
\n
_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new DelayedEncode(ContractAddress, "0", new DelayedEncodeData(\n "mint(address,uint256)",\n new object[]\n {\n ToAddress, DecimalNormalizer.Normalize(1)\n },\n "mint")),\n });
\n","isPage":false,"text":"\nWhen calling a smart contract on an EVM-based network, the client goes through a complex process known as "ABI encoding" where the function signature you want to call as well as the parameters you're providing are encoded into a binary format. This process is complicated and error-prone so we've abstracted it all away so that you don't have to deal with it. But, if you're curious to learn how it works, please see this document.\nA DelayedEncode transaction allows you to call any method on an arbitrary smart contract, allowing us to handle the complicated ABI encoding process.\nTo send a DelayedEncode transaction, you can use this code snippet:\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new DelayedEncode(ContractAddress, ValueAsString, new DelayedEncodeData(\n ContractABIAsString,\n ParametersAsObjectArray,\n FunctionNameAsString)),\n });\nLet's examine the above to get a better understanding of some of the variables that may be non-obvious.\nValueAsString: This will usually be "0" unless you are calling a payable method denoted by the payable keyword in the smart contract definition. If you are calling a payable method, it is recommended to use DecimalNormalizer.Normalize to convert the amount from human readable format to EVM format.\nContractABIAsString: This can either be the entire ABI or just the function you plan on interacting with. If you're not familiar with ABIs, we'd recommend copy-pasting the function signature (with parameters) from the contract source code on Etherscan (or the appropriate block explorer for your network) and removing the whitespace and variable names.\nParametersAsObjectArray: The parameters you want to provide to the method you wish to call. No need to provide the parameter names, just their values in the order they appear in the ABI. Provide parameters in string format when in doubt.\nFunctionNameAsString: The name of the function you want to call as it appears in the ABI (or source code). Exclude parentheses and parameters.\nPutting this together, an example of using delayed encode to call the "mint" function on an ERC20 would look like this:\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new DelayedEncode(ContractAddress, "0", new DelayedEncodeData(\n "mint(address,uint256)",\n new object[]\n {\n ToAddress, DecimalNormalizer.Normalize(1)\n },\n "mint")),\n });\n","title":"DelayedEncode","titles":["Write to Blockchain"]},"151":{"href":"/sdk/unity/05-write-to-blockchain#batch-transactions","html":"\n
Using the magic of the Sequence Smart Contract wallet, our SDK allows you to seemlessly batch transactions together. Batching transactions together is extremely beneficial as it provides material gas savings and allows you to create complex transactions, that either all pass or all fail, without deploying custom smart contracts for each bespoke use case, opening a whole new realm of design possibilities!
\n
Sending a batch transaction is easy! Simply include multiple transactions, of any type, in your transaction array when making the SendTransaction request.
\n
For example - sending a transaction of each type in a batch:
\n
_wallet.SendTransaction(\n Chain.Polygon,\n new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction(ToAddress, DecimalNormalizer.Normalize(1)),\n new SendERC20(\n erc20TokenAddress,\n ToAddress,\n AmountAsString),\n new RawTransaction(new ERC20(erc20TokenAddress).Burn(DecimalNormalizer.NormalizeAsBigInteger(amount))),\n new SendERC721(\n erc721TokenAddress,\n ToAddress,\n TokenIdAsString),\n new SendERC1155(\n erc1155TokenAddress,\n ToAddress,\n new SendERC1155Values[]\n {\n new SendERC1155Values(TokenIdAsString, AmountAsString),\n ...\n }),\n new DelayedEncode(ContractAddress, ValueAsString, new DelayedEncodeData(\n ContractABIAsString,\n ParametersAsObjectArray,\n FunctionNameAsString)),\n });
\n
Since these transactions are all batched into a single transaction by the Sequence Smart Contract Wallet before being submitted to the network, you will receive only one transaction receipt.
","isPage":false,"text":"\nUsing the magic of the Sequence Smart Contract wallet, our SDK allows you to seemlessly batch transactions together. Batching transactions together is extremely beneficial as it provides material gas savings and allows you to create complex transactions, that either all pass or all fail, without deploying custom smart contracts for each bespoke use case, opening a whole new realm of design possibilities!\nSending a batch transaction is easy! Simply include multiple transactions, of any type, in your transaction array when making the SendTransaction request.\nFor example - sending a transaction of each type in a batch:\n_wallet.SendTransaction(\n Chain.Polygon,\n new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction(ToAddress, DecimalNormalizer.Normalize(1)),\n new SendERC20(\n erc20TokenAddress,\n ToAddress,\n AmountAsString),\n new RawTransaction(new ERC20(erc20TokenAddress).Burn(DecimalNormalizer.NormalizeAsBigInteger(amount))),\n new SendERC721(\n erc721TokenAddress,\n ToAddress,\n TokenIdAsString),\n new SendERC1155(\n erc1155TokenAddress,\n ToAddress,\n new SendERC1155Values[]\n {\n new SendERC1155Values(TokenIdAsString, AmountAsString),\n ...\n }),\n new DelayedEncode(ContractAddress, ValueAsString, new DelayedEncodeData(\n ContractABIAsString,\n ParametersAsObjectArray,\n FunctionNameAsString)),\n });\nSince these transactions are all batched into a single transaction by the Sequence Smart Contract Wallet before being submitted to the network, you will receive only one transaction receipt.","title":"Batch Transactions","titles":["Write to Blockchain"]},"152":{"href":"/sdk/unity/06-read-from-blockchain#read-from-blockchain","html":"\n
Reading from the blockchain is done using Unity-Native implementation of our Sequence Indexer.
","isPage":true,"text":"\nReading from the blockchain is done using Unity-Native implementation of our Sequence Indexer.\nWe recommend creating an instance of the ChainIndexer class. This will expose you to all the functionality offered by the IIndexer interface.\nIIndexer polygonIndexer = new ChainIndexer(Chain.Polygon);\nChainIndexer is essentially a wrapper of the Indexer static class which is fully documented here: https://docs.sequence.xyz/unity-sdk/indexer/guides.","title":"Read from Blockchain","titles":[]},"153":{"href":"/sdk/unity/07-sign-messages#sign-messages","html":"\n
Signing a message is an asynchronous Task. You can use await when calling WaaSWallet.SignMessage from within an async Task if you wish to obtain the SignMessageReturn object directly. Or, you can take the recommended approach which is to setup a handler function for the WaaSWallet.OnSignMessageComplete event and call the WaaSWallet.SignMessage method from anywhere (without await). For example:
\n
public void OnSignMessageCompleteHandler(string signature) {\n // Do something\n}\n\npublic void OnWaaSWalletCreatedHander(WaaSWallet wallet) {\n wallet.OnSignMessageComplete += OnSignMessageCompleteHandler;\n}
\n
_wallet.SignMessage(Chain.Polygon, "Message to sign");
\n
If you're unfamiliar with working with events in Unity, check out this great Reddit post!
","isPage":true,"text":"\nSigning a message is an asynchronous Task. You can use await when calling WaaSWallet.SignMessage from within an async Task if you wish to obtain the SignMessageReturn object directly. Or, you can take the recommended approach which is to setup a handler function for the WaaSWallet.OnSignMessageComplete event and call the WaaSWallet.SignMessage method from anywhere (without await). For example:\npublic void OnSignMessageCompleteHandler(string signature) {\n // Do something\n}\n\npublic void OnWaaSWalletCreatedHander(WaaSWallet wallet) {\n wallet.OnSignMessageComplete += OnSignMessageCompleteHandler;\n}\n_wallet.SignMessage(Chain.Polygon, "Message to sign");\nIf you're unfamiliar with working with events in Unity, check out this great Reddit post!","title":"Sign Messages","titles":[]},"154":{"href":"/sdk/unity/08-deploy-contracts#contract-deployment","html":"\n
While, in general, we would recommend deploying your smart contracts via the Builder, we recognize that there are some use cases where deploying a smart contract from Unity (or a Made-With-Unity application) is useful.
\n
Contract deployment involves sending a transaction, which is done via an asynchronous Task. You can use await when calling WaaSWallet.DeployContract from within an async Task if you wish to obtain the ContractDeploymentReturn object directly. Or, you can take the recommended approach which is to setup handler functions for the WaaSWallet.OnDeployContractComplete and WaaSWallet.OnDeployContractFailed events and call the WaaSWallet.DeployContract method from anywhere (without await).
\n
WaaSWallet.DeployContract is essentially a wrapper for a very special WaaSWallet.SendTransaction call and therefore, you can expect to still receive the WaaSWallet.OnSendTransactionComplete or WaaSWallet.OnSendTransactionFailed events in addition.
\n
public void OnDeployContractCompleteHandler(SuccessfulContractDeploymentReturn result) {\n Address newlyDeployedContractAddress = result.DeployedContractAddress;\n\n // Do something\n}\n\npublic void OnDeployContractFailedHandler(FailedContractDeploymentReturn result) {\n // Do something\n}\n\npublic void OnWaaSWalletCreatedHander(WaaSWallet wallet) {\n wallet.OnDeployContractComplete += OnDeployContractCompleteHandler;\n wallet.OnDeployContractFailed += OnDeployContractFailedHandler;\n}
\n
If you're unfamiliar with working with events in Unity, check out this great Reddit post!
To deploy a smart contract, you can use this code snippet:
\n
string bytecode = "Here you'll paste your compiled bytecode"\n_wallet.DeployContract(Chain.Polygon, bytecode);
","isPage":true,"text":"\nWhile, in general, we would recommend deploying your smart contracts via the Builder, we recognize that there are some use cases where deploying a smart contract from Unity (or a Made-With-Unity application) is useful.\nContract deployment involves sending a transaction, which is done via an asynchronous Task. You can use await when calling WaaSWallet.DeployContract from within an async Task if you wish to obtain the ContractDeploymentReturn object directly. Or, you can take the recommended approach which is to setup handler functions for the WaaSWallet.OnDeployContractComplete and WaaSWallet.OnDeployContractFailed events and call the WaaSWallet.DeployContract method from anywhere (without await).\nWaaSWallet.DeployContract is essentially a wrapper for a very special WaaSWallet.SendTransaction call and therefore, you can expect to still receive the WaaSWallet.OnSendTransactionComplete or WaaSWallet.OnSendTransactionFailed events in addition.\npublic void OnDeployContractCompleteHandler(SuccessfulContractDeploymentReturn result) {\n Address newlyDeployedContractAddress = result.DeployedContractAddress;\n\n // Do something\n}\n\npublic void OnDeployContractFailedHandler(FailedContractDeploymentReturn result) {\n // Do something\n}\n\npublic void OnWaaSWalletCreatedHander(WaaSWallet wallet) {\n wallet.OnDeployContractComplete += OnDeployContractCompleteHandler;\n wallet.OnDeployContractFailed += OnDeployContractFailedHandler;\n}\nIf you're unfamiliar with working with events in Unity, check out this great Reddit post!\nTo deploy a contract you'll need to first compile your smart contract code into bytecode and add the bytecode as a hexadecimal string in one of your C# scripts.\nTo deploy a smart contract, you can use this code snippet:\nstring bytecode = "Here you'll paste your compiled bytecode"\n_wallet.DeployContract(Chain.Polygon, bytecode);","title":"Contract Deployment","titles":[]},"155":{"href":"/sdk/unity/09-wallet-ui#wallet-ui","html":"\n
As a Wallet as a Service product, this SDK requires no UI. However, as we expect some apps will still choose to provide some form of wallet UI to users, we are making efforts to provide a default UI for you to use.
\n
This UI can be found under SequenceExamples.
\n
To add the UI to your scene, you can add the WalletPanel prefab found under SequenceExamples > Prefabs. It is opened using the Open method; you must provide an IWallet (e.g. a WaaSWallet) as an argument.
\n
You'll notice that the UI is still a work in progress and is also using mocks in some places (fetching transaction history and prices). These will be replaced in coming updates of the SDK, but please feel free to replace them on your own (and for bonus points, submit a PR!).
\n","isPage":true,"text":"\nAs a Wallet as a Service product, this SDK requires no UI. However, as we expect some apps will still choose to provide some form of wallet UI to users, we are making efforts to provide a default UI for you to use.\nThis UI can be found under SequenceExamples.\nTo add the UI to your scene, you can add the WalletPanel prefab found under SequenceExamples > Prefabs. It is opened using the Open method; you must provide an IWallet (e.g. a WaaSWallet) as an argument.\nYou'll notice that the UI is still a work in progress and is also using mocks in some places (fetching transaction history and prices). These will be replaced in coming updates of the SDK, but please feel free to replace them on your own (and for bonus points, submit a PR!).\n","title":"Wallet UI","titles":[]},"156":{"href":"/sdk/unity/09-wallet-ui#how-it-works","html":"\n
The sample Sequence UI is comprised of a few important components.
\n","isPage":false,"text":"\nThe sample Sequence UI is comprised of a few important components.\n","title":"How It Works","titles":["Wallet UI"]},"157":{"href":"/sdk/unity/09-wallet-ui#ui-customizability","html":"\n
Built on Unity's UI system, the UI is entirely customizable. We encourage you to make it your own and "beautify" it to suit your app!
\n","isPage":false,"text":"\nBuilt on Unity's UI system, the UI is entirely customizable. We encourage you to make it your own and "beautify" it to suit your app!\n","title":"UI Customizability","titles":["Wallet UI"]},"158":{"href":"/sdk/unity/09-wallet-ui#color-scheme-manager","html":"\n
To use the ColorSchemeManager, please perform the following in edit mode.
\n\n
Create a Color Schemescriptable object by navigating to the top bar Assets > Create > Sequence > Color Scheme and give it an appropriate name.
\n
Set the desired colors in your new scriptable object - don't forget to set the alpha values! Unity defaults these to 0.
\n
Locate the ColorSchemeManager MonoBehaviour in your scene in the inspector. In our demo scene, this is attached to the SequenceCanvas gameObject.
\n
Set your newly created scriptable object as the Color Scheme.
\n
Click "Apply". Note that this may take a few seconds to apply and you may need to click apply multiple times due to the way Unity refreshes after changes in the inspector (version dependant).
\n\n
The ColorSchemeManager isn't meant to give you perfect results and the perfect UI right out of the gate, but we hope it saves you some time on the way there!
\n","isPage":false,"text":"\nTo help you with the process, we've added a basic ColorSchemeManager script which you can experiment with in our Demo scene, which can be imported via Package Manager.\nTo use the ColorSchemeManager, please perform the following in edit mode.\n\nCreate a Color Scheme scriptable object by navigating to the top bar Assets > Create > Sequence > Color Scheme and give it an appropriate name.\nSet the desired colors in your new scriptable object - don't forget to set the alpha values! Unity defaults these to 0.\nLocate the ColorSchemeManager MonoBehaviour in your scene in the inspector. In our demo scene, this is attached to the SequenceCanvas gameObject.\nSet your newly created scriptable object as the Color Scheme.\nClick "Apply". Note that this may take a few seconds to apply and you may need to click apply multiple times due to the way Unity refreshes after changes in the inspector (version dependant).\n\nThe ColorSchemeManager isn't meant to give you perfect results and the perfect UI right out of the gate, but we hope it saves you some time on the way there!\n","title":"Color Scheme Manager","titles":["Wallet UI","UI Customizability"]},"159":{"href":"/sdk/unity/09-wallet-ui#more-customization-tools-coming-soon","html":"\n
We hope to bring you more convenience tools to help you customize the UI quicker and easier! While we have ideas of our own, nobody understands your needs better than you do, so please don't hesitate to reach out to us with any ideas you have! Or better yet, submit a PR!
","isPage":false,"text":"\nWe hope to bring you more convenience tools to help you customize the UI quicker and easier! While we have ideas of our own, nobody understands your needs better than you do, so please don't hesitate to reach out to us with any ideas you have! Or better yet, submit a PR!","title":"More Customization Tools Coming Soon","titles":["Wallet UI","UI Customizability"]},"160":{"href":"/sdk/unreal/01-overview#introduction","html":"\n
The Sequence Unreal In-Game Wallet SDK provides full Sequence In-Game Wallet and Indexer integration for games built on the Unreal Framework.
\n
This SDK follows Semantic Versioning (major.minor.patch). While we're still in 0.x.y builds, API breaking changes can be made at any time. After 1.0.0, breaking changes will always cause a major version increment, non-breaking new features will cause a minor version increment, and bugfixes will cause a patch version increment.
\n
Sequence Unreal SDK is only available as a private beta at the moment. To get access, get in touch with Sequence BD Team.
\n","isPage":true,"text":"\nThe Sequence Unreal In-Game Wallet SDK provides full Sequence In-Game Wallet and Indexer integration for games built on the Unreal Framework.\nThis SDK follows Semantic Versioning (major.minor.patch). While we're still in 0.x.y builds, API breaking changes can be made at any time. After 1.0.0, breaking changes will always cause a major version increment, non-breaking new features will cause a minor version increment, and bugfixes will cause a patch version increment.\nSequence Unreal SDK is only available as a private beta at the moment. To get access, get in touch with Sequence BD Team.\n","title":"Introduction","titles":[]},"161":{"href":"/sdk/unreal/01-overview#requirements","html":"\n
\n
Unreal 5.2 or later
\n
Android
\n
iOS
\n
PC standalone
\n
Mac standalone
\n
","isPage":false,"text":"\n\nUnreal 5.2 or later\nAndroid\niOS\nPC standalone\nMac standalone\n","title":"Requirements","titles":["Introduction"]},"162":{"href":"/sdk/unreal/02-installation#installation","html":"\n","isPage":true,"text":"\n","title":"Installation","titles":[]},"163":{"href":"/sdk/unreal/02-installation#credentials","html":"\n
Before you can use this plugin, you need to acquire the following credentials from Sequence:
\n
\n
WaaSTenantKey: This key will be given to you by the Sequence team during WaaS onboarding
\n
ProjectAccessKey: This key can be found in Sequence Builder under Settings > API Access Keys
\n
\n
You can then add these credentials in the [Config.h] file under SequencePlugin/Source/SequencePlugin/Private/Config/Config.h.
\n","isPage":false,"text":"\nBefore you can use this plugin, you need to acquire the following credentials from Sequence:\n\nWaaSTenantKey: This key will be given to you by the Sequence team during WaaS onboarding\nProjectAccessKey: This key can be found in Sequence Builder under Settings > API Access Keys\n\nYou can then add these credentials in the [Config.h] file under SequencePlugin/Source/SequencePlugin/Private/Config/Config.h.\n","title":"Credentials","titles":["Installation"]},"164":{"href":"/sdk/unreal/02-installation#security","html":"\n
You must provide an encryption key implementation at [SequenceEncryptor.cpp] function [GetStoredKey]. This function must be implemented to provide a securely stored private key that will be used to encrypt and decrypt client information. Failure to do so will result in NO information being stored or in the event you do not use a securely stored key, can result in client information being stored insecurely on their systems.
","isPage":false,"text":"\nYou must provide an encryption key implementation at [SequenceEncryptor.cpp] function [GetStoredKey]. This function must be implemented to provide a securely stored private key that will be used to encrypt and decrypt client information. Failure to do so will result in NO information being stored or in the event you do not use a securely stored key, can result in client information being stored insecurely on their systems.","title":"Security","titles":["Installation"]},"165":{"href":"/sdk/unreal/03-setup#setup","html":"\n\n
\n
Once you have the the SequencePlugin folder, you'll need to go to your project directory and create a Plugins folder in it, then copy over the SequencePlugin folder into the Plugins folder. If a Plugins folder already exists just copy the SequencePlugin folder into it.
\n
\n
\n
Launch your project, then allow it to update the UProject Settings.
\n
\n
\n
To find the SequencePlugin content folder in your content drawer enable view plugin content
\n
\n
\n
If you wish to use the in built sequence UI for login\na) Create an [Actor] you wish to be responsible for the SequenceUI then attach the [Sequence_Pawn_Component_BP] to it\nb) Setup your [Actor] Blueprint similar to how it's setup in [Custom_Spectator_Pawn] being sure to bind to the delegate that gives you Credentials [Auth_Success_Forwarder]
\n
\n
\n
Once you have those credentials you'll need to forward them to your own C++ backend in order to use the Sequence API, an example of this can be found in the [Custom_Spectator_Pawn]. This Pawn inherits from a C++ class [Sqnc_Spec_Pawn], which implements a blueprint Callable function [SetupCredentials(FCredentials_BE CredentialsIn)]. This is callable within the child class [Custom_Spectator_Pawn]. Calling this function will forward the credentials to a C++ backend.
\n
\n","isPage":true,"text":"\n\n\nOnce you have the the SequencePlugin folder, you'll need to go to your project directory and create a Plugins folder in it, then copy over the SequencePlugin folder into the Plugins folder. If a Plugins folder already exists just copy the SequencePlugin folder into it.\n\n\nLaunch your project, then allow it to update the UProject Settings.\n\n\nTo find the SequencePlugin content folder in your content drawer enable view plugin content\n\n\nIf you wish to use the in built sequence UI for login\na) Create an [Actor] you wish to be responsible for the SequenceUI then attach the [Sequence_Pawn_Component_BP] to it\nb) Setup your [Actor] Blueprint similar to how it's setup in [Custom_Spectator_Pawn] being sure to bind to the delegate that gives you Credentials [Auth_Success_Forwarder]\n\n\nOnce you have those credentials you'll need to forward them to your own C++ backend in order to use the Sequence API, an example of this can be found in the [Custom_Spectator_Pawn]. This Pawn inherits from a C++ class [Sqnc_Spec_Pawn], which implements a blueprint Callable function [SetupCredentials(FCredentials_BE CredentialsIn)]. This is callable within the child class [Custom_Spectator_Pawn]. Calling this function will forward the credentials to a C++ backend.\n\n","title":"Setup","titles":[]},"166":{"href":"/sdk/unreal/04-authentication#authentication","html":"\n","isPage":true,"text":"\n","title":"Authentication","titles":[]},"167":{"href":"/sdk/unreal/04-authentication#custom-ui-integration","html":"\n
In a C++ backend with a series of pass through [UFUNCTIONS] setup similarly to [SequenceBackendManager.h/.cpp]. Each of these calls are implemented in [UAuthenticator] you just need to pass through the data with YOUR UAuthenticator UObject
\n
//This call is platform dependent on windows & mac this is required for SSO WIP\nUFUNCTION(BlueprintCallable, CATEGORY = "Login")\nFString GetLoginURL(const ESocialSigninType& Type); \n\n//This Call is made after you've collected the ID_Token (Mac & Windows only) WIP\nUFUNCTION(BlueprintCallable, CATEGORY = "Login")\nvoid SocialLogin(const FString& IDTokenIn);\n\n//This Call is made after you've collected the email address from the Users in the UI\nUFUNCTION(BlueprintCallable, CATEGORY = "Login")\nvoid EmailLogin(const FString& EmailIn);\n\n//This is call is made after the Delegate `[AuthRequiresCode]` is fired\nUFUNCTION(BlueprintCallable, CATEGORY = "Login")\nvoid EmailCode(const FString& CodeIn);\n\n//Optional call used to check if the credentials on disk are valid or not//\nUFUNCTION(BlueprintCallable, Category = "Login")\nbool StoredCredentialsValid();
\n
To start you'll want to create a [UAuthenticator] UObject like so [UAuthenticator + Auth = NewObject<UAuthenticator>()], this UObject manages the authentication side of Sequence.
\n
Be sure to bind to the Delegates for [AuthSuccess], [AuthFailure], [AuthRequiresCode] prior to making any signin calls You can bind to these delegates like so:
\n","isPage":false,"text":"\nIn a C++ backend with a series of pass through [UFUNCTIONS] setup similarly to [SequenceBackendManager.h/.cpp]. Each of these calls are implemented in [UAuthenticator] you just need to pass through the data with YOUR UAuthenticator UObject\n//This call is platform dependent on windows & mac this is required for SSO WIP\nUFUNCTION(BlueprintCallable, CATEGORY = "Login")\nFString GetLoginURL(const ESocialSigninType& Type); \n \n//This Call is made after you've collected the ID_Token (Mac & Windows only) WIP\nUFUNCTION(BlueprintCallable, CATEGORY = "Login")\nvoid SocialLogin(const FString& IDTokenIn);\n \n//This Call is made after you've collected the email address from the Users in the UI\nUFUNCTION(BlueprintCallable, CATEGORY = "Login")\nvoid EmailLogin(const FString& EmailIn);\n \n//This is call is made after the Delegate `[AuthRequiresCode]` is fired\nUFUNCTION(BlueprintCallable, CATEGORY = "Login")\nvoid EmailCode(const FString& CodeIn);\n \n//Optional call used to check if the credentials on disk are valid or not//\nUFUNCTION(BlueprintCallable, Category = "Login")\nbool StoredCredentialsValid();\nTo start you'll want to create a [UAuthenticator] UObject like so [UAuthenticator + Auth = NewObject<UAuthenticator>()], this UObject manages the authentication side of Sequence.\nBe sure to bind to the Delegates for [AuthSuccess], [AuthFailure], [AuthRequiresCode] prior to making any signin calls You can bind to these delegates like so:\nthis->authenticator->AuthRequiresCode.AddDynamic(this, &AYourClass::YourCallReadyToReceiveCode);\nthis->authenticator->AuthFailure.AddDynamic(this, &AYourClass::YourCallShowAuthFailureScreen);\nIn the case of [AuthSuccess] since a parameter is also passed we bind to it like this\nFScriptDelegate del;\ndel.BindUFunction(this, "CallShowAuthSuccessScreen");\nthis->authenticator->AuthSuccess.Add(del);\nWhere [CallShowAuthSuccessScreen] is defined in SequenceBackendManager.h like so:\nUFUNCTION()\nvoid CallShowAuthSuccessScreen(const FCredentials_BE& CredentialsIn);\nAnd in SequenceBackendManager.cpp like so:\nvoid ASequenceBackendManager::CallShowAuthSuccessScreen(const FCredentials_BE& CredentialsIn) \n{\nthis->Credentials = CredentialsIn;\nif (this->ShowAuthSuccessDelegate.IsBound())\n this->ShowAuthSuccessDelegate.Broadcast(Credentials);\nelse\n UE_LOG(LogTemp, Error, TEXT("`[Nothing bound to: ShowAuthSuccessDelegate]`"));\n}\n","title":"Custom UI Integration","titles":["Authentication",null]},"168":{"href":"/sdk/unreal/04-authentication#email-based-authentication","html":"\n\n
\n
To start email based authentication you'll start it with this call [EmailLogin(const FString& EmailIn)], supplying an email you've collected from the User in your GUI.
\n
\n
\n
Next [AuthRequiresCode] will fire when the backend is ready to receive the Code from your UI. Collect this code from your GUI and send it to the authenticator using [EmailCode(CodeIn)].
\n
\n
\n
Finally [AuthSuccess] will fire with a Credentials_BE struct as a parameter. This is your non registered credentials from EmailAuth. You are done Email Based Auth.
\n
\n\n","isPage":false,"text":"\n\n\nTo start email based authentication you'll start it with this call [EmailLogin(const FString& EmailIn)], supplying an email you've collected from the User in your GUI.\n\n\nNext [AuthRequiresCode] will fire when the backend is ready to receive the Code from your UI. Collect this code from your GUI and send it to the authenticator using [EmailCode(CodeIn)].\n\n\nFinally [AuthSuccess] will fire with a Credentials_BE struct as a parameter. This is your non registered credentials from EmailAuth. You are done Email Based Auth.\n\n\n","title":"Email based Authentication","titles":["Authentication",null]},"169":{"href":"/sdk/unreal/04-authentication#social-signin-based-authentication-on-desktop","html":"\n\n
\n
To start SSO based authentication with desktop you can either use your own implementation to get the necessary id_token or you can make use of Unreal's web browser plugin.
\n
\n
\n
With whatever implementation you chose you can forward the colleted id_token to the UAuthenticator object with [SocialLogin(const FString& IDTokenIn)], after which [AuthSuccess] will fire and you're done desktop based SSO.
\n
\n\n","isPage":false,"text":"\n\n\nTo start SSO based authentication with desktop you can either use your own implementation to get the necessary id_token or you can make use of Unreal's web browser plugin.\n\n\nWith whatever implementation you chose you can forward the colleted id_token to the UAuthenticator object with [SocialLogin(const FString& IDTokenIn)], after which [AuthSuccess] will fire and you're done desktop based SSO.\n\n\n","title":"Social Signin based Authentication on Desktop","titles":["Authentication",null]},"170":{"href":"/sdk/unreal/04-authentication#social-signin-based-authentication-on-mobile","html":"\n
WIP
","isPage":false,"text":"\nWIP","title":"Social Signin based Authentication on Mobile","titles":["Authentication",null]},"171":{"href":"/sdk/unreal/05-api-integration#api-integration","html":"\n","isPage":true,"text":"\n","title":"API Integration","titles":[]},"172":{"href":"/sdk/unreal/05-api-integration#sequence-api","html":"\n
After you've completed initial authentication and have intercepted the credentials either through your UI or ours, to use the Sequence API you'll need to create a [USequenceWallet] by using:
\n
`[USequenceWallet * Api = USequenceWallet(CredentialsIn)]` or `[USequenceWallet * Api = USequenceWallet::Make(CredentialsIn, ProviderURL)]`
\n
Once you have your [USequenceWallet] UObject call [Api>RegisterSession(OnSuccess,GenericFailure)] this will register your credentials with the Sequence API. Note not calling Register prior to make any others calls will result in errors as a UserWallet hasn't been supplied until this point.
\n
`*
\n
Assuming you've setup your controlling Actor with the [Sequence_Pawn_Component_BP]\nThe sequence pawn component has functions to do the following:
\n
Setup Sequence (sets up the sequence based systems), requires playerController input
\n
Show GUI Shows the UI
\n
Hide GUI Hides the UI
\n
GUI Visible Simple Visibility test for the UI
\n
Switch Platform (Switches which mode the UI will be in and how it will be displayed)
\n
Note: this doesn't rotate the application into any one view it just make the UI responsive to that type of view.
\n
Modes:
\n
\n
Desktop (default)
\n
Mobile Portrait (Custom built for portrait mode reducing the X width where ever possible)
\n
Mobile Landscape
\n
\n
`*
\n","isPage":false,"text":"\nAfter you've completed initial authentication and have intercepted the credentials either through your UI or ours, to use the Sequence API you'll need to create a [USequenceWallet] by using:\n`[USequenceWallet * Api = USequenceWallet(CredentialsIn)]` or `[USequenceWallet * Api = USequenceWallet::Make(CredentialsIn, ProviderURL)]`\nOnce you have your [USequenceWallet] UObject call [Api>RegisterSession(OnSuccess,GenericFailure)] this will register your credentials with the Sequence API. Note not calling Register prior to make any others calls will result in errors as a UserWallet hasn't been supplied until this point.\n`*\nAssuming you've setup your controlling Actor with the [Sequence_Pawn_Component_BP]\nThe sequence pawn component has functions to do the following:\nSetup Sequence (sets up the sequence based systems), requires playerController input\nShow GUI Shows the UI\nHide GUI Hides the UI\nGUI Visible Simple Visibility test for the UI\nSwitch Platform (Switches which mode the UI will be in and how it will be displayed)\nNote: this doesn't rotate the application into any one view it just make the UI responsive to that type of view.\nModes:\n\nDesktop (default)\nMobile Portrait (Custom built for portrait mode reducing the X width where ever possible)\nMobile Landscape\n\n`*\n","title":"Sequence API","titles":["API Integration",null]},"173":{"href":"/sdk/unreal/05-api-integration#sequence-unreal-api","html":"\n
The Sequence Unreal plugin is broken up into a few different parts in order to manage all of the differing functionality. Here we'll go through each parts purpose then summarize how to use them all together below
\n
The SDK automatically stores credentials on disk in the following cases:
\n\n
On Successful Auth
\n
On Successful Registering of a session
\n
On Successful Closing of a session
\n\n","isPage":false,"text":"\nThe Sequence Unreal plugin is broken up into a few different parts in order to manage all of the differing functionality. Here we'll go through each parts purpose then summarize how to use them all together below\nThe SDK automatically stores credentials on disk in the following cases:\n\nOn Successful Auth\nOn Successful Registering of a session\nOn Successful Closing of a session\n\n","title":"Sequence Unreal API","titles":["API Integration",null]},"174":{"href":"/sdk/unreal/05-api-integration#usequencewallet","html":"\n
Where the Credentials you give are the credentials you received from the UAuthenticator when [AuthSuccess] fires, or you can use the call Auth->[GetStoredCredentials](), where Auth is of the type [UAuthenticator]. If you are using StoredCredentials please ensure they are valid by checking the wrapping Structs FStoredCredentials_BE.GetValid() flag returned from [GetStoredCredentials], the providerURL is the url of the provider you wish to use.
\n
Once you have your [USequenceWallet] UObject please ensure that you've registered the session using [RegisterSession] before attempting to make other calls to the API.
\n","isPage":false,"text":"\nTo get a USequenceWallet call either:\nUSequenceWallet::Make(FCredentials_BE CredentialsIn)\nUSequenceWallet::Make(FCredentials_BE CredentialsIn, FString ProviderURL)\nWhere the Credentials you give are the credentials you received from the UAuthenticator when [AuthSuccess] fires, or you can use the call Auth->[GetStoredCredentials](), where Auth is of the type [UAuthenticator]. If you are using StoredCredentials please ensure they are valid by checking the wrapping Structs FStoredCredentials_BE.GetValid() flag returned from [GetStoredCredentials], the providerURL is the url of the provider you wish to use.\nOnce you have your [USequenceWallet] UObject please ensure that you've registered the session using [RegisterSession] before attempting to make other calls to the API.\n","title":"USequenceWallet","titles":["API Integration",null]},"175":{"href":"/sdk/unreal/05-api-integration#sequence-api-methods","html":"\n
We make use of TFunctions with some callbacks:
\n
TSuccessCallback\nconst TFunction<void(FString)> OnResponse = `[Capturable variables]`(const FString& Response)\n{\n//callback body where we can process Response\n};\n\nFFailureCallback\nconst TFunction<void(FSequenceError)> OnFailureTest = `[Capturable variables]`(const FSequenceError& Error)\n{\n//callback body where we can process Error\n};
\n
One thing to be aware of is keep an eye on capturables if you have lots of nested TFunctions it's very easy to miss something and start over writing memory. If you require lots of nesting swapping to a better approach using UFUNCTION callbacks helps to avoid these problems similar to how things are done in [UAuthenticator.h/cpp]
","isPage":false,"text":"\nWe make use of TFunctions with some callbacks:\nTSuccessCallback\nconst TFunction<void(FString)> OnResponse = `[Capturable variables]`(const FString& Response)\n{\n//callback body where we can process Response\n};\n \nFFailureCallback\nconst TFunction<void(FSequenceError)> OnFailureTest = `[Capturable variables]`(const FSequenceError& Error)\n{\n//callback body where we can process Error\n};\nOne thing to be aware of is keep an eye on capturables if you have lots of nested TFunctions it's very easy to miss something and start over writing memory. If you require lots of nesting swapping to a better approach using UFUNCTION callbacks helps to avoid these problems similar to how things are done in [UAuthenticator.h/cpp]","title":"Sequence API Methods","titles":["API Integration",null]},"176":{"href":"/sdk/unreal/06-packaging#packaging","html":"\n
To set your system up for Packaging please refer to the following links:
\n","isPage":true,"text":"\nTo set your system up for Packaging please refer to the following links:\n\nWindows and macOS\nAndroid\niOS\n\n","title":"Packaging","titles":[]},"177":{"href":"/sdk/unreal/06-packaging#google-sso-setup","html":"\n
In order to be able to properly use Google Auth, create and place the Keystore file by following these instructions.
\n
You will also need to generate an [Android client ID] and a [Web Application client ID] for your application, as well as place the [Web Application client ID] in the Config/Config.hFAuthenticatorConfig.GoogleClientID field.
\n
Refer to these docs to generate [Android client ID] and [Web Application client ID].
\n
This guide helps explain how to collect SHA-1 key fingerprints for the [Android client ID].
\n","isPage":false,"text":"\nIn order to be able to properly use Google Auth, create and place the Keystore file by following these instructions.\nYou will also need to generate an [Android client ID] and a [Web Application client ID] for your application, as well as place the [Web Application client ID] in the Config/Config.h FAuthenticatorConfig.GoogleClientID field.\nRefer to these docs to generate [Android client ID] and [Web Application client ID].\nThis guide helps explain how to collect SHA-1 key fingerprints for the [Android client ID].\n","title":"Google SSO Setup","titles":["Packaging",null]},"178":{"href":"/sdk/unreal/06-packaging#ios","html":"\n
\n","isPage":false,"text":"\nFor iOS apps you also need to setup provisioning, following these docs.\n","title":"iOS","titles":["Packaging",null]},"179":{"href":"/sdk/unreal/06-packaging#unreal-and-xcode-specifics","html":"\n
During the Unreal Package process there is a very high chance that it will fail due to a code signing error, in the event that this happens please take the following steps within XCode to get your packaged .app file
\n\n
After packaging the project in Unreal, open the Xcode project (Sequence-unreal folder -> Intermediate -> ProjectFilesIOS -> SequenceUnreal.xcodeproj)
\n
Click on the project name on the left hand side to open up project settings
\n
Click the Build Phase Tab
\n
Click on the "+" icon at the top left
\n
Select Run Script
\n
Drag the new run script to one below from the last item in the phase list
\n
Expand the run script
\n
In the script box, add the following command: xattr -cr /path-to-your-project/sequence-unreal/Binaries/IOS/Payload/SequenceUnreal.app
\n
Click on the Build Settings tab
\n
Click on each item under the Architectures header that contains macOS and hit the delete key
\n
Click on the General tab
\n
Click on Mac and Applevision Pro under supported destinations and hit the delete key
\n
Now the project can be built (if the build fails at first, wait a few moments then try again. It can sometimes take a bit before the build registers the run script)
\n
Once you have finished running the project, and want to make changes to the code, REMEMBER to delete this xcodeproj file in the sequence-unreal folder to ensure that a new xcodeproj is creating when you packaging the project again.
\n","isPage":false,"text":"\nDuring the Unreal Package process there is a very high chance that it will fail due to a code signing error, in the event that this happens please take the following steps within XCode to get your packaged .app file\n\nAfter packaging the project in Unreal, open the Xcode project (Sequence-unreal folder -> Intermediate -> ProjectFilesIOS -> SequenceUnreal.xcodeproj)\nClick on the project name on the left hand side to open up project settings\nClick the Build Phase Tab\nClick on the "+" icon at the top left\nSelect Run Script\nDrag the new run script to one below from the last item in the phase list\nExpand the run script\nIn the script box, add the following command: xattr -cr /path-to-your-project/sequence-unreal/Binaries/IOS/Payload/SequenceUnreal.app\nClick on the Build Settings tab\nClick on each item under the Architectures header that contains macOS and hit the delete key\nClick on the General tab\nClick on Mac and Applevision Pro under supported destinations and hit the delete key\nNow the project can be built (if the build fails at first, wait a few moments then try again. It can sometimes take a bit before the build registers the run script)\nOnce you have finished running the project, and want to make changes to the code, REMEMBER to delete this xcodeproj file in the sequence-unreal folder to ensure that a new xcodeproj is creating when you packaging the project again.\n","title":"Unreal and Xcode Specifics","titles":["Packaging",null]},"180":{"href":"/solutions/builder/analytics#analytics-in-builder","html":"\n
When you use Sequence, via our SDKs, to build your application, you can see key insights in Sequence Builder.\nYou don't need to do any additional work to see valuable metrics about your project, such as the number\nof connected wallets or daily transaction requests.
\n","isPage":true,"text":"\nWhen you use Sequence, via our SDKs, to build your application, you can see key insights in Sequence Builder.\nYou don't need to do any additional work to see valuable metrics about your project, such as the number\nof connected wallets or daily transaction requests.\n","title":"Analytics in Builder","titles":[]},"181":{"href":"/solutions/builder/analytics#how-it-works","html":"\n
When requests are made with Sequence SDKs/APIs, analytics events are fired and sent to our internal analytics system, Databeat.\nDatabeat anonymizes the data and stores it in a secure database designed for high-volume, real-time applications. The metrics you see in Builder are\nqueried from the database, in real-time, for your project and presented in insightful visualizations.
\n","isPage":false,"text":"\nWhen requests are made with Sequence SDKs/APIs, analytics events are fired and sent to our internal analytics system, Databeat.\nDatabeat anonymizes the data and stores it in a secure database designed for high-volume, real-time applications. The metrics you see in Builder are\nqueried from the database, in real-time, for your project and presented in insightful visualizations.\n","title":"How it works","titles":["Analytics in Builder",null,null]},"182":{"href":"/solutions/builder/analytics#overview","html":"\n
In the Overview tab of Builder, you will see the key, high-level metrics for your project. Metric cards will show the total value for that metric, and\nclicking on one will change the chart to show time-series data for that metric.
\n\n","isPage":false,"text":"\nIn the Overview tab of Builder, you will see the key, high-level metrics for your project. Metric cards will show the total value for that metric, and\nclicking on one will change the chart to show time-series data for that metric.\nYou also have the option to look back at your data beyond the default Last 30 days\nby toggling the filter in the top right corner.\n","title":"Overview","titles":["Analytics in Builder"]},"183":{"href":"/solutions/builder/analytics#wallets-connected","html":"\n
Wallets connected represents the count of distinct wallet addresses connected via Sequence SDKs for the selected time period.
\n
\n","isPage":false,"text":"\nWallets connected represents the count of distinct wallet addresses connected via Sequence SDKs for the selected time period.\n\n","title":"Wallets connected","titles":["Analytics in Builder","Overview",null]},"184":{"href":"/solutions/builder/analytics#marketplace-transactions","html":"\n
Marketplace transactions shows the total number of buy and sell events that occure via the Sequence Marketplace API.
\n
\n","isPage":false,"text":"\nMarketplace transactions shows the total number of buy and sell events that occure via the Sequence Marketplace API.\n\n","title":"Marketplace transactions","titles":["Analytics in Builder","Overview",null]},"185":{"href":"/solutions/builder/analytics#transaction-requests","html":"\n
Transaction requests represents the total number of transactions sent by wallets associated with the project.
\n
","isPage":false,"text":"\nTransaction requests represents the total number of transactions sent by wallets associated with the project.\n","title":"Transaction requests","titles":["Analytics in Builder","Overview",null]},"186":{"href":"/solutions/marketplaces/overview#marketplaces-overview","html":"\n
Sequence provides a variety of options for your marketplace and in-game store to accelerate your development, namely our white-label marketplace as well as our suite of Marketplace APIs.
\n","isPage":true,"text":"\nSequence provides a variety of options for your marketplace and in-game store to accelerate your development, namely our white-label marketplace as well as our suite of Marketplace APIs.\n","title":"Marketplaces Overview","titles":[]},"187":{"href":"/solutions/marketplaces/overview#what-are-the-differences-between-these-options","html":"\n
The white-label marketplace is ideal for getting started with a browser-based marketplace in literally minutes - all with no-coding experience and options to customize the marketplace to fit your branding such as fonts, colors, and logos. Our white-label marketplace is ideal if you want to minimize development time, focus on a web-based experience for your users, and start selling assets.
\n
Conversely, our Marketplace APIs give you complete control & customization so you can build your own UI while leaving the complexity of blockchain & backend orchestration to us. Our APIs can be utilized in game engines such as Unity or Unreal to build an in-game marketplace or store. Alternatively, they can be leveraged via a web-based experience in the browser as well - the choice is yours.
\n
You can even mix and match these options! For example, launching your own white-label marketplace for selling your initial game assets while building out your game. Then once launched, your in-game store uses the marketplace APIs to showcase these assets and offer new ones - while ensuring a seamless user experience as the user never needs to leave the game.
\n","isPage":false,"text":"\nThe white-label marketplace is ideal for getting started with a browser-based marketplace in literally minutes - all with no-coding experience and options to customize the marketplace to fit your branding such as fonts, colors, and logos. Our white-label marketplace is ideal if you want to minimize development time, focus on a web-based experience for your users, and start selling assets.\nConversely, our Marketplace APIs give you complete control & customization so you can build your own UI while leaving the complexity of blockchain & backend orchestration to us. Our APIs can be utilized in game engines such as Unity or Unreal to build an in-game marketplace or store. Alternatively, they can be leveraged via a web-based experience in the browser as well - the choice is yours.\nYou can even mix and match these options! For example, launching your own white-label marketplace for selling your initial game assets while building out your game. Then once launched, your in-game store uses the marketplace APIs to showcase these assets and offer new ones - while ensuring a seamless user experience as the user never needs to leave the game.\n","title":"What are the differences between these options?","titles":["Marketplaces Overview",null]},"188":{"href":"/solutions/marketplaces/overview#getting-started","html":"\n
To get started with the white-label marketplace, check out our page for more information and a helpful video to walk you through the process.
\n
Additionally, our quickstart page for the Marketplace APIs has a variety of templates, demos, and common integration patterns needed to get you started. We also provide a step by step guide of leveraging the APIs for (building a custom marketplace)[/guides/template-marketplace-api]
","isPage":false,"text":"\nTo get started with the white-label marketplace, check out our page for more information and a helpful video to walk you through the process.\nAdditionally, our quickstart page for the Marketplace APIs has a variety of templates, demos, and common integration patterns needed to get you started. We also provide a step by step guide of leveraging the APIs for (building a custom marketplace)[/guides/template-marketplace-api]","title":"Getting Started","titles":["Marketplaces Overview",null]},"189":{"href":"/solutions/wallets/overview#sequence-wallets-overview","html":"\n
Sequence offers multiple wallet options to integrate into your products, chiefly we call these our In-Game Wallet and our Universal Wallet which are both completely non-custodial.
\n","isPage":true,"text":"\nSequence offers multiple wallet options to integrate into your products, chiefly we call these our In-Game Wallet and our Universal Wallet which are both completely non-custodial.\n","title":"Sequence Wallets Overview","titles":[]},"190":{"href":"/solutions/wallets/overview#what-are-the-differences-between-these-options","html":"\n
The In-Game Wallet is primarily focused on delivering a traditional game experience that is headless with no mandatory pop-ups, modals, transaction signing, or other additional distractions take players out of them trying to enjoy the game. Users can login with common social logins or other authentication providers and simply jump into the experience. We provide native support for a variety of popular game engines such as Unreal and Unity as well as Typescript support so you can stay within your preferred framework for building games or experiences.
\n
\n
Conversely, our Universal Wallet is geared more towards native blockchain users with a focus on games and gaming assets. Existing blockchain users will feel right at home where you can leverage our wallet infrastructure for creating great experiences for web3 users, complete with a Typescript SDK for easy integration.
\n","isPage":false,"text":"\nThe In-Game Wallet is primarily focused on delivering a traditional game experience that is headless with no mandatory pop-ups, modals, transaction signing, or other additional distractions take players out of them trying to enjoy the game. Users can login with common social logins or other authentication providers and simply jump into the experience. We provide native support for a variety of popular game engines such as Unreal and Unity as well as Typescript support so you can stay within your preferred framework for building games or experiences.\n\nConversely, our Universal Wallet is geared more towards native blockchain users with a focus on games and gaming assets. Existing blockchain users will feel right at home where you can leverage our wallet infrastructure for creating great experiences for web3 users, complete with a Typescript SDK for easy integration.\n","title":"What are the differences between these options?","titles":["Sequence Wallets Overview",null]},"191":{"href":"/solutions/wallets/overview#what-are-the-benefits-of-each-and-how-can-i-leverage-them","html":"\n
All integrations provide non-custodial smart contract wallets with account abstraction advantages like optionality for gasless transactions. We recommend our In-Game Wallet if you are focused on a seamless, headless web2/2.5-like experience for your players or our Universal Wallet for prioritizing web2.5/web3 native users.
\n
Best of all, our wallet connector called SequenceKit integrates both options in a convenient, customizable UI written in Typescript, which you can leverage to cater to users with an existing wallet such as Metamask and millions of potential new users that want the convenience of social login.
\n","isPage":false,"text":"\nAll integrations provide non-custodial smart contract wallets with account abstraction advantages like optionality for gasless transactions. We recommend our In-Game Wallet if you are focused on a seamless, headless web2/2.5-like experience for your players or our Universal Wallet for prioritizing web2.5/web3 native users.\nBest of all, our wallet connector called SequenceKit integrates both options in a convenient, customizable UI written in Typescript, which you can leverage to cater to users with an existing wallet such as Metamask and millions of potential new users that want the convenience of social login.\n","title":"What are the benefits of each and how can I leverage them?","titles":["Sequence Wallets Overview",null]},"192":{"href":"/solutions/wallets/overview#getting-started","html":"\n
Please check out Sequence Builder to create a project and select Wallets to get started. This will provide the corresponding code snippets with our convenient SDKs to get started.
\n
Alternatively, our quickstart page for In-Game Wallets and Universal Wallets has all the templates, demos, and common integration patterns needed to accelerate your development.
","isPage":false,"text":"\nPlease check out Sequence Builder to create a project and select Wallets to get started. This will provide the corresponding code snippets with our convenient SDKs to get started.\nAlternatively, our quickstart page for In-Game Wallets and Universal Wallets has all the templates, demos, and common integration patterns needed to accelerate your development.","title":"Getting Started","titles":["Sequence Wallets Overview",null]},"193":{"href":"/sdk/typescript/03-guides/01-connect-wallet#connect-wallet","html":"\n
Sequence is a very flexible wallet which allow users multiple ways to connect / access their wallet. This includes:
\n\n
\n
On-demand Ethereum web wallet for new users via 0xsequence npm package + https://sequence.app -- this option allows\ndevelopers to offer users an on-demand web3 wallet. No user install required -- any browser will just work, and users\ncan onboard with a familiar Web2 experience. Think of it like Paypal / Stripe but for web3.
\n
\n
\n
Surf all of web3 via Sequence Wallet Chrome Extension -- users\nwho have the Sequence Wallet Chrome Extension installed are able to access any Ethereum-compatible Dapp on the Web :) Just like how MetaMask works,\nbut of course with a bunch of the benefits of Sequence.
\n
\n
\n
Mobile phone access via WalletConnect support within Sequence Wallet -- users are able to communicate with their wallets remotely\nvia the awesome Wallet Connect protocol. This is an excellent option if using Sequence Wallet from your mobile phone and want to connect\nyour wallet to a desktop dapp.
\n
\n\n
Sequence Wallet is built on Web Browser (W3C) and Ethereum web3 standards -- and is available everywhere that a modern browser is able to run.\nWe've carefully designed the wallet for simple onboarding, while maintaining security for users, and allowing users to progressively\nincrease the level of their security through additional keys and measures.
\n
This means, that if you've developed a dapp to work with MetaMask, then Sequence will work too without any changes. If you're\nusing web3.js or ethers.js, Sequence will just work too. This is the beauty of interoperability on web3 :)
\n","isPage":true,"text":"\nSequence is a very flexible wallet which allow users multiple ways to connect / access their wallet. This includes:\n\n\nOn-demand Ethereum web wallet for new users via 0xsequence npm package + https://sequence.app -- this option allows\ndevelopers to offer users an on-demand web3 wallet. No user install required -- any browser will just work, and users\ncan onboard with a familiar Web2 experience. Think of it like Paypal / Stripe but for web3.\n\n\nSurf all of web3 via Sequence Wallet Chrome Extension -- users\nwho have the Sequence Wallet Chrome Extension installed are able to access any Ethereum-compatible Dapp on the Web :) Just like how MetaMask works,\nbut of course with a bunch of the benefits of Sequence.\n\n\nMobile phone access via WalletConnect support within Sequence Wallet -- users are able to communicate with their wallets remotely\nvia the awesome Wallet Connect protocol. This is an excellent option if using Sequence Wallet from your mobile phone and want to connect\nyour wallet to a desktop dapp.\n\n\nSequence Wallet is built on Web Browser (W3C) and Ethereum web3 standards -- and is available everywhere that a modern browser is able to run.\nWe've carefully designed the wallet for simple onboarding, while maintaining security for users, and allowing users to progressively\nincrease the level of their security through additional keys and measures.\nThis means, that if you've developed a dapp to work with MetaMask, then Sequence will work too without any changes. If you're\nusing web3.js or ethers.js, Sequence will just work too. This is the beauty of interoperability on web3 :)\n","title":"Connect Wallet","titles":[]},"194":{"href":"/sdk/typescript/03-guides/01-connect-wallet#connecting-your-dapp-with-0xsequence","html":"\n
:::info A delightful wallet without requiring your users to install anything
\nBy integrating 0xsequence, users may access your dapp without having to install any special extensions,\nand the wallet also works on mobile browsers!\n:::\n
Your dapp can connect to your user's wallet by first instantiating the Wallet provider:
\n
import { sequence } from "0xsequence";\n\nconst projectAccessKey = '<access_key>'\n\n// This assumes your dapp runs on Ethereum mainnet\nconst wallet = sequence.initWallet(projectAccessKey);\n\n// If your dapp runs on a different EVM-compatible blockchain, you can specify its name\n// const wallet = sequence.initWallet(projectAccessKey, { defaultNetwork: 'polygon' });
\n
Note that is possible to retrieve the above instance by using the getWallet() method:
\n
import { sequence } from "0xsequence";\nconst wallet = sequence.getWallet();
\n
Once you have the instance, you can connect to the wallet:
\n
const connectDetails = await wallet.connect({\n app: "Your Dapp name",\n authorize: true,\n // And pass settings if you would like to customize further\n settings: {\n theme: "light",\n bannerUrl: "https://yoursite.com/banner-image.png", // 3:1 aspect ratio, 1200x400 works best\n includedPaymentProviders: ["moonpay", "ramp"],\n defaultFundingCurrency: "matic",\n lockFundingCurrencyToDefault: false,\n },\n});\n\nconsole.log("user accepted connect?", connectDetails.connected);\nconsole.log(\n "users signed connect proof to valid their account address:",\n connectDetails.proof\n);
\n
You can pick/limit the available sign in options with signInOptions. Will be ignored if user is already signed in.
:::tip Check out some example Dapp source code\nFor a complete examples, see Demo-Dapp and Demo-Dapp-Web3Modal.\n:::
\n
:::caution Avoid Browsers Blocking Sequence Popup\nMost browsers will block popups if they are called outside of user-triggered event handlers like onclick, or when it takes too long to process between the user action and the actual window
\n","isPage":false,"text":"\n:::info A delightful wallet without requiring your users to install anything \nBy integrating 0xsequence, users may access your dapp without having to install any special extensions,\nand the wallet also works on mobile browsers!\n:::\nYour dapp can connect to your user's wallet by first instantiating the Wallet provider:\nimport { sequence } from "0xsequence";\n \nconst projectAccessKey = '<access_key>'\n \n// This assumes your dapp runs on Ethereum mainnet\nconst wallet = sequence.initWallet(projectAccessKey);\n \n// If your dapp runs on a different EVM-compatible blockchain, you can specify its name\n// const wallet = sequence.initWallet(projectAccessKey, { defaultNetwork: 'polygon' });\nNote that is possible to retrieve the above instance by using the getWallet() method:\nimport { sequence } from "0xsequence";\nconst wallet = sequence.getWallet();\nOnce you have the instance, you can connect to the wallet:\nconst connectDetails = await wallet.connect({\n app: "Your Dapp name",\n authorize: true,\n // And pass settings if you would like to customize further\n settings: {\n theme: "light",\n bannerUrl: "https://yoursite.com/banner-image.png", // 3:1 aspect ratio, 1200x400 works best\n includedPaymentProviders: ["moonpay", "ramp"],\n defaultFundingCurrency: "matic",\n lockFundingCurrencyToDefault: false,\n },\n});\n \nconsole.log("user accepted connect?", connectDetails.connected);\nconsole.log(\n "users signed connect proof to valid their account address:",\n connectDetails.proof\n);\nYou can pick/limit the available sign in options with signInOptions. Will be ignored if user is already signed in.\nconst wallet = sequence.getWallet();\n \nawait wallet.connect({\n app: "Your Dapp name",\n settings: { signInOptions: ["google"] },\n});\nAfter you connect, you can use wallet.openWallet() to open the wallet:\nconst wallet = sequence.getWallet();\nwallet.openWallet();\nYou can also optionally pass a path, and use openWithOptions intent to pass settings when you open the wallet:\nconst settings: Settings = {\n theme: "dark",\n bannerUrl: "https://yoursite.com/banner-image.png", // 3:1 aspect ratio, 1200x400 works best\n includedPaymentProviders: ["moonpay", "ramp"],\n defaultFundingCurrency: "eth",\n lockFundingCurrencyToDefault: false,\n};\n \nconst intent: OpenWalletIntent = {\n type: "openWithOptions",\n options: {\n settings: settings,\n },\n};\n \nconst wallet = sequence.getWallet();\n \nconst path = "wallet/add-funds";\nwallet.openWallet(path, intent);\n:::tip Check out some example Dapp source code\nFor a complete examples, see Demo-Dapp and Demo-Dapp-Web3Modal.\n:::\n:::caution Avoid Browsers Blocking Sequence Popup\nMost browsers will block popups if they are called outside of user-triggered event handlers like onclick, or when it takes too long to process between the user action and the actual window\nRead more about browser popup-blocking here.\n:::\n\n\n","title":"Connecting your dapp with 0xsequence","titles":["Connect Wallet"]},"195":{"href":"/sdk/typescript/03-guides/01-connect-wallet#wallet-login-and-connect-options","html":"\n
Dapps with direct sequence integration can specify a ConnectOptions object when running wallet.connect().
\n","isPage":false,"text":"\nDapps with direct sequence integration can specify a ConnectOptions object when running wallet.connect().\nconst connectDetails = await wallet.connect(connectOptions)\nThe option parameters are described below.\n","title":"Wallet Login and Connect Options","titles":["Connect Wallet"]},"196":{"href":"/sdk/typescript/03-guides/01-connect-wallet#app","html":"\n
App name of the dapp which will be announced to user on connect screen.
\n","isPage":false,"text":"\nApp name of the dapp which will be announced to user on connect screen.\nExample: await wallet.connect({ app: 'My defi app' })\n","title":"app","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"197":{"href":"/sdk/typescript/03-guides/01-connect-wallet#appprotocol","html":"\n
Custom protocol for auth redirect (unity/unreal).
\n","isPage":false,"text":"\nCustom protocol for auth redirect (unity/unreal).\n","title":"appProtocol","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"198":{"href":"/sdk/typescript/03-guides/01-connect-wallet#origin","html":"\n
Origin hint of the dapp's host opening the wallet. This value will automatically be determined and verified for integrity, and can be omitted.
\n","isPage":false,"text":"\nOrigin hint of the dapp's host opening the wallet. This value will automatically be determined and verified for integrity, and can be omitted.\n","title":"origin","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"199":{"href":"/sdk/typescript/03-guides/01-connect-wallet#expiry","html":"\n
Expiry number (in seconds) that is used for ETHAuth proof. Default is 1 week in seconds.
\n
Example: await wallet.connect({ expiry: 36000 })
\n","isPage":false,"text":"\nExpiry number (in seconds) that is used for ETHAuth proof. Default is 1 week in seconds.\nExample: await wallet.connect({ expiry: 36000 })\n","title":"expiry","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"200":{"href":"/sdk/typescript/03-guides/01-connect-wallet#authorize","html":"\n
authorize will perform an ETHAuth eip712 signing and return the proof to the dapp.
\n","isPage":false,"text":"\nauthorize will perform an ETHAuth eip712 signing and return the proof to the dapp.\nExample: await wallet.connect({ authorize: true })\n","title":"authorize","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"201":{"href":"/sdk/typescript/03-guides/01-connect-wallet#authorizenonce","html":"\n
authorizeNonce is an optional number to be passed as ETHAuth's nonce claim for replay protection.
\n","isPage":false,"text":"\nauthorizeNonce is an optional number to be passed as ETHAuth's nonce claim for replay protection.\nExample: await wallet.connect({ authorizeNonce: 123 })\n","title":"authorizeNonce","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"202":{"href":"/sdk/typescript/03-guides/01-connect-wallet#refresh","html":"\n
refresh flag will force a full re-connect (ie. disconnect then connect again).
\n
Example: await wallet.connect({ refresh: true })
\n","isPage":false,"text":"\nrefresh flag will force a full re-connect (ie. disconnect then connect again).\nExample: await wallet.connect({ refresh: true })\n","title":"refresh","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"203":{"href":"/sdk/typescript/03-guides/01-connect-wallet#keepwalletopened","html":"\n
keepWalletOpened will keep the wallet window open after connecting. The default is to automatically close the wallet after connecting.
\n","isPage":false,"text":"\nkeepWalletOpened will keep the wallet window open after connecting. The default is to automatically close the wallet after connecting.\nExample: await wallet.connect({ keepWalletOpened: true })\n","title":"keepWalletOpened","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"204":{"href":"/sdk/typescript/03-guides/01-connect-wallet#askforemail","html":"\n
askForEmail will ask user whether they want to share the email they use to sign in to wallet while connecting, and will be returned in connectDetails.
\n","isPage":false,"text":"\naskForEmail will ask user whether they want to share the email they use to sign in to wallet while connecting, and will be returned in connectDetails.\nExample: await wallet.connect({ askForEmail: true })\n","title":"askForEmail","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"205":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingstheme","html":"\n
Name of one of the available theme provided by sequence the sequence wallet will be rendered with.
\n","isPage":false,"text":"\nName of one of the available theme provided by sequence the sequence wallet will be rendered with.\nExample: await wallet.connect({ settings: {theme: "light"}}\n","title":"settings.theme","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"206":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingsbannerurl","html":"\n
URL of a banner image users will see when connecting or logging into your dapp. The banner image should follow a 3:1 aspect ration where 1200x400 works best.
\n","isPage":false,"text":"\nURL of a banner image users will see when connecting or logging into your dapp. The banner image should follow a 3:1 aspect ration where 1200x400 works best.\nExample: await wallet.connect({ settings: {bannerUrl: "https://yoursite.com/banner-image.png"}}\n","title":"settings.bannerUrl","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"207":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingssigninwith","html":"\n
Specify signInWith with a supported auth provider to automatically sign in the user with that provider only. Will be ignored if user is already signed in.
\n","isPage":false,"text":"\nSpecify signInWith with a supported auth provider to automatically sign in the user with that provider only. Will be ignored if user is already signed in.\nExample: await wallet.connect({ settings: {signInWith: "google"}}\nSupported Providers: "google", "discord", "twitch", "apple", "facebook"\n","title":"settings.signInWith","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"208":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingssigninwithemail","html":"\n
Specify signInWithEmail with an email address to allow user automatically sign in with the email option. Will be ignored if user is already signed in.
\n","isPage":false,"text":"\nSpecify signInWithEmail with an email address to allow user automatically sign in with the email option. Will be ignored if user is already signed in.\nExample: await wallet.connect({ settings: {signInWithEmail: "user@email.com"}}\n","title":"settings.signInWithEmail","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"209":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingssigninoptions","html":"\n
Specify signInOptions to pick/limit the available sign in options. Will be ignored if user is already signed in.
\n","isPage":false,"text":"\nSpecify signInOptions to pick/limit the available sign in options. Will be ignored if user is already signed in.\nExample: await wallet.connect({ settings: {signInOptions: ["email", "google", "apple"]}}\n","title":"settings.signInOptions","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"210":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingsincludedpaymentproviders","html":"\n
List of payment providers users will be able to access. By default, users can access all payment providers integrated in Sequence.
\n","isPage":false,"text":"\nList of payment providers users will be able to access. By default, users can access all payment providers integrated in Sequence.\nExample: await wallet.connect({ settings: {includedPaymentProviders: ["moonpay", "ramp"]}}\n","title":"settings.includedPaymentProviders","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"211":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingsdefaultfundingcurrency","html":"\n
The tag of the default currency to show when users open the payment provider page. The currency has to be supported by the payment providers integrated in sequence.
\n","isPage":false,"text":"\nThe tag of the default currency to show when users open the payment provider page. The currency has to be supported by the payment providers integrated in sequence.\nExample: await wallet.connect({ settings: {defaultFundingCurrency: "usdc"}}\n","title":"settings.defaultFundingCurrency","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"212":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingsdefaultpurchaseamount","html":"\n
Use to specify a default purchase amount, as an integer, for prefilling the funding amount. If not specified, the default is 100.
\n","isPage":false,"text":"\nUse to specify a default purchase amount, as an integer, for prefilling the funding amount. If not specified, the default is 100.\nExample: await wallet.connect({ settings: {defaultPurchaseAmount: 200}}\n","title":"settings.defaultPurchaseAmount","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"213":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingslockfundingcurrencytodefault","html":"\n
Whether to only allow users to purchase the default currency specified by the defaultFundingCurrency option. If set to false, users will also be able to purchase other tokens. locking the default funding currency can be useful to prevent users from purchasing the wrong currency or the currency on the wrong chain.
\n","isPage":false,"text":"\nWhether to only allow users to purchase the default currency specified by the defaultFundingCurrency option. If set to false, users will also be able to purchase other tokens. locking the default funding currency can be useful to prevent users from purchasing the wrong currency or the currency on the wrong chain.\nExample: await wallet.connect({ settings: {defaultFundingCurrency: true}}\n","title":"settings.lockFundingCurrencyToDefault","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"214":{"href":"/sdk/typescript/03-guides/01-connect-wallet#connecting-your-dapp-with-web3js-or-ethersjs","html":"\n
For a full example of a dapp which supports Sequence (on-demand + chrome extension), Metamask, and WalletConnect\nplease see the Demo-Dapp-Web3Modal repo.
\n
\n","isPage":false,"text":"\nFor a full example of a dapp which supports Sequence (on-demand + chrome extension), Metamask, and WalletConnect\nplease see the Demo-Dapp-Web3Modal repo.\n\n","title":"Connecting your dapp with web3.js or ethers.js","titles":["Connect Wallet"]},"215":{"href":"/sdk/typescript/03-guides/01-connect-wallet#connecting-to-any-ethereum-dapp-with-the-sequence-wallet-chrome-extension","html":"\n
\n","isPage":false,"text":"\nSequence Chrome Extension: Install\n\n","title":"Connecting to any Ethereum dapp with the Sequence Wallet Chrome Extension","titles":["Connect Wallet"]},"216":{"href":"/sdk/typescript/03-guides/01-connect-wallet#connecting-via-walletconnect","html":"\n
Sequence already supports connecting to dapps via WalletConnect.\nIf your dapp already supports WalletConnect, and you don't need Sequence-specific functionality, nothing more needs to be done.\nFrom the user's perspective, the WalletConnect flow behaves as follows.
\n
Taking Uniswap as an example, the user is prompted to connect their wallet using one of multiple possible protocols.
\n\n
The user selects the WalletConnect option.
\n\n
A QR code is displayed, which can be scanned by Sequence.\nAlternatively, the user can also choose to copy the connection details via their OS clipboard.
\n\n
Back in the Sequence interface, the user chooses "Scan".
\n\n
The QR code from the dapp is scanned.\nAlternatively, the code is pasted from the OS clipboard if the user chose that previously.
\n\n
The user confirms the connection request.
\n\n
The connection succeeded, and the dapp is updated to reflect that.
\n\n
While connected, the dapp is able to make signing requests to Sequence.\nSequence will always prompt for confirmation from the user for any activity initiated by the dapp.
\n\n
Once the user has finished using the dapp, they can disconnect the wallet via the session menu.
\n","isPage":false,"text":"\nSequence already supports connecting to dapps via WalletConnect.\nIf your dapp already supports WalletConnect, and you don't need Sequence-specific functionality, nothing more needs to be done.\nFrom the user's perspective, the WalletConnect flow behaves as follows.\nTaking Uniswap as an example, the user is prompted to connect their wallet using one of multiple possible protocols.\n\nThe user selects the WalletConnect option.\n\nA QR code is displayed, which can be scanned by Sequence.\nAlternatively, the user can also choose to copy the connection details via their OS clipboard.\n\nBack in the Sequence interface, the user chooses "Scan".\n\nThe QR code from the dapp is scanned.\nAlternatively, the code is pasted from the OS clipboard if the user chose that previously.\n\nThe user confirms the connection request.\n\nThe connection succeeded, and the dapp is updated to reflect that.\n\nWhile connected, the dapp is able to make signing requests to Sequence.\nSequence will always prompt for confirmation from the user for any activity initiated by the dapp.\n\nOnce the user has finished using the dapp, they can disconnect the wallet via the session menu.\n","title":"Connecting via WalletConnect","titles":["Connect Wallet"]},"217":{"href":"/sdk/typescript/03-guides/02-auth-address#authenticate-users-with-message-signature","html":"\n","isPage":true,"text":"\n","title":"Authenticate Users with Message Signature","titles":[]},"218":{"href":"/sdk/typescript/03-guides/02-auth-address#ask-for-the-wallet-address","html":"\n
\n","isPage":false,"text":"\nTo get the user's Sequence wallet address:\nconst wallet = sequence.getWallet()\nconst address = wallet.getAddress()\nconsole.log(address)\n","title":"Ask for the wallet address","titles":["Authenticate Users with Message Signature"]},"219":{"href":"/sdk/typescript/03-guides/02-auth-address#authenticate-wallet","html":"\n
In many cases, you'll want your users to connect and then verify they do control this wallet address. Applications typically do this by asking the user\nto sign a message with their wallet, and then verify the signature from the user to ensure its integrity.
\n
As this is such a common workflow, Sequence can automatically authenticate the account address at the same time\nwhile the user is prompt to connect their wallet to your dapp. This allows the user experience to be simpler and\nmore seamless.
\n
import { sequence } from '0xsequence'\n\nconst wallet = sequence.getWallet()\n\nconst connectDetails = await wallet.connect({\n app: 'Your Dapp name',\n authorize: true // <---<<< this will automatically sign+verify a EIP712 message when user clicks "Connect"\n})
\n
It will look like this to your users:
\n\n
In the above example, we pass authorize: true to the connect() function, which will automatically have the user\nsign a EIP712 signed message to prove their identity. This allows you to then easily authenticate the connected\nwallet address with absolute certainty.
\n
You can find the signed message proof returned in connectDetails.proof, which is an EIP712 signed object using\na simple convention from ethauth. NOTE: EIP712 allows you to use an actual object for\nsigning instead of just a plain-text string.
\n","isPage":false,"text":"\nIn many cases, you'll want your users to connect and then verify they do control this wallet address. Applications typically do this by asking the user\nto sign a message with their wallet, and then verify the signature from the user to ensure its integrity.\nAs this is such a common workflow, Sequence can automatically authenticate the account address at the same time\nwhile the user is prompt to connect their wallet to your dapp. This allows the user experience to be simpler and\nmore seamless.\nimport { sequence } from '0xsequence'\n \nconst wallet = sequence.getWallet()\n \nconst connectDetails = await wallet.connect({\n app: 'Your Dapp name',\n authorize: true // <---<<< this will automatically sign+verify a EIP712 message when user clicks "Connect"\n})\nIt will look like this to your users:\n\nIn the above example, we pass authorize: true to the connect() function, which will automatically have the user\nsign a EIP712 signed message to prove their identity. This allows you to then easily authenticate the connected\nwallet address with absolute certainty.\nYou can find the signed message proof returned in connectDetails.proof, which is an EIP712 signed object using\na simple convention from ethauth. NOTE: EIP712 allows you to use an actual object for\nsigning instead of just a plain-text string.\n","title":"Authenticate wallet","titles":["Authenticate Users with Message Signature"]},"220":{"href":"/sdk/typescript/03-guides/02-auth-address#authenticate-wallet-server-side","html":"\n
The above example demonstrates how to connect and verify the user's identity in your dapp on the client-side,\nbut if you'd like to authenticate the Sequence authorization proof on your server, then you can do so with the following snippet:
\n
import { ValidateSequenceWalletProof } from '@0xsequence/auth'\nimport { commons, v2 } from '@0xsequence/core'\nimport { ETHAuth } from '@0xsequence/ethauth'\nimport { trackers } from '@0xsequence/sessions'\nimport * as ethers from 'ethers'\n\n// ...\n\nconst rpcUrl = 'https://polygon-mainnet.infura.io/v3/<your infura key here>'\nconst provider = new ethers.providers.JsonRpcProvider(rpcUrl)\n\n// create an EIP-6492-aware ETHAuth proof validator\nconst validator = ValidateSequenceWalletProof(\n () => new commons.reader.OnChainReader(provider),\n new trackers.remote.RemoteConfigTracker('https://sessions.sequence.app'),\n v2.DeployedWalletContext\n)\nconst ethauth = new ETHAuth(validator)\nawait ethauth.configJsonRpcProvider(rpcUrl)\n\ntry {\n const proof = await ethAuth.decodeProof(connectDetails.proof.proofString)\n console.log(`proof for address ${proof.address} is valid`)\n} catch (err) {\n console.log(`invalid proof -- do not trust address: ${err}`)\n}
\n
See the Go Sequence SDK on using Sequence in your Go applications.
As always, if you have any questions or require help, reach out to us on Discord.
","isPage":false,"text":"\nThe above example demonstrates how to connect and verify the user's identity in your dapp on the client-side,\nbut if you'd like to authenticate the Sequence authorization proof on your server, then you can do so with the following snippet:\nimport { ValidateSequenceWalletProof } from '@0xsequence/auth'\nimport { commons, v2 } from '@0xsequence/core'\nimport { ETHAuth } from '@0xsequence/ethauth'\nimport { trackers } from '@0xsequence/sessions'\nimport * as ethers from 'ethers'\n \n// ...\n \nconst rpcUrl = 'https://polygon-mainnet.infura.io/v3/<your infura key here>'\nconst provider = new ethers.providers.JsonRpcProvider(rpcUrl)\n \n// create an EIP-6492-aware ETHAuth proof validator\nconst validator = ValidateSequenceWalletProof(\n () => new commons.reader.OnChainReader(provider),\n new trackers.remote.RemoteConfigTracker('https://sessions.sequence.app'),\n v2.DeployedWalletContext\n)\nconst ethauth = new ETHAuth(validator)\nawait ethauth.configJsonRpcProvider(rpcUrl)\n \ntry {\n const proof = await ethAuth.decodeProof(connectDetails.proof.proofString)\n console.log(`proof for address ${proof.address} is valid`)\n} catch (err) {\n console.log(`invalid proof -- do not trust address: ${err}`)\n}\nSee the Go Sequence SDK on using Sequence in your Go applications.\nIf your server is written in a language other than Javascript/Typescript or Go, all you have to do is validate\nthe signature with EIP1271, the standard method for validating signed messages for a smart wallet.\nAs always, if you have any questions or require help, reach out to us on Discord.","title":"Authenticate wallet server-side","titles":["Authenticate Users with Message Signature"]},"221":{"href":"/sdk/typescript/03-guides/03-sign-message#todo---replace-with-code-groups-from-vocs","html":"","isPage":true,"text":"","title":"TODO - Replace with Code Groups from Vocs","titles":[]},"222":{"href":"/sdk/typescript/03-guides/04-session-keys#no-wallet-confirmation-signatures","html":"\n
It is possible to build an application where users sign messages without requiring a confirmation in their Sequence wallet every time. This is possible using session keys, or ephemeral keys.
\n","isPage":true,"text":"\nIt is possible to build an application where users sign messages without requiring a confirmation in their Sequence wallet every time. This is possible using session keys, or ephemeral keys.\n","title":"No-Wallet-Confirmation Signatures","titles":[]},"223":{"href":"/sdk/typescript/03-guides/04-session-keys#session-keys","html":"\n
Session keys are ephemeral private keys that can be generated and stored client-side, typically in a user's local storage. They provide a convenient and secure way for users to authorize specific actions in a decentralized application without requiring them to confirm each action through their primary wallet.
\n
By signing a message with their primary wallet (e.g., Sequence Wallet), users can authorize a session key to act on their behalf for a limited time or scope. Applications can then interpret signed messages from the session key as if they were coming directly from the user's wallet, streamlining the user experience.
\n
Session keys are particularly useful for applications that require frequent user interactions, as they help reduce the number of wallet confirmations needed, while still maintaining a secure and verifiable authentication process.
\n","isPage":false,"text":"\nSession keys are ephemeral private keys that can be generated and stored client-side, typically in a user's local storage. They provide a convenient and secure way for users to authorize specific actions in a decentralized application without requiring them to confirm each action through their primary wallet.\nBy signing a message with their primary wallet (e.g., Sequence Wallet), users can authorize a session key to act on their behalf for a limited time or scope. Applications can then interpret signed messages from the session key as if they were coming directly from the user's wallet, streamlining the user experience.\nSession keys are particularly useful for applications that require frequent user interactions, as they help reduce the number of wallet confirmations needed, while still maintaining a secure and verifiable authentication process.\n","title":"Session Keys","titles":[]},"224":{"href":"/sdk/typescript/03-guides/04-session-keys#using-session-keys-with-sequence","html":"\n","isPage":false,"text":"\n","title":"Using Session keys with Sequence","titles":[]},"225":{"href":"/sdk/typescript/03-guides/04-session-keys#1-initialize-sequence-wallet-and-connect","html":"\n
import { Wallet } from '@0xsequence/wallet'\nimport { ethers } from 'ethers'\n\nconst wallet = new Wallet()\nawait wallet.connect()\n\nconst signer = wallet.getSigner()\nconst userAddress = signer.getAddress()
\n","isPage":false,"text":"\nimport { Wallet } from '@0xsequence/wallet'\nimport { ethers } from 'ethers'\n \nconst wallet = new Wallet()\nawait wallet.connect()\n \nconst signer = wallet.getSigner()\nconst userAddress = signer.getAddress()\n","title":"1. Initialize Sequence Wallet and Connect","titles":["Using Session keys with Sequence",null]},"226":{"href":"/sdk/typescript/03-guides/04-session-keys#2-generate-a-session-key","html":"\n
Create a new ephemeral private key, store it in local storage, and derive the associated address:
\n","isPage":false,"text":"\nCreate a new ephemeral private key, store it in local storage, and derive the associated address:\nconst sessionPrivateKey = ethers.utils.randomBytes(32)\nlocalStorage.setItem('sessionPrivateKey', ethers.utils.hexlify(sessionPrivateKey))\nconst sessionWallet = new ethers.Wallet(sessionPrivateKey)\nconst sessionAddress = await sessionWallet.getAddress()\n","title":"2. Generate a Session Key","titles":["Using Session keys with Sequence",null]},"227":{"href":"/sdk/typescript/03-guides/04-session-keys#3-sign-authorization-message","html":"\n
Sign a message with the user's Sequence Wallet to authorize the session key:
\n
const authorizationMessage = `Authorize this device to play this game.`\nconst signature = await signer.signMessage(authorizationMessage)
\n","isPage":false,"text":"\nSign a message with the user's Sequence Wallet to authorize the session key:\nconst authorizationMessage = `Authorize this device to play this game.`\nconst signature = await signer.signMessage(authorizationMessage)\n","title":"3. Sign Authorization Message","titles":["Using Session keys with Sequence",null]},"228":{"href":"/sdk/typescript/03-guides/04-session-keys#4-verify-authorization-signature","html":"\n
Verify the signature on the server or client side using Sequence utility functions:
\n","isPage":false,"text":"\nUse the session key to sign a message client-side without user interaction:\nconst message = 'Perform action without wallet confirmation'\nconst sessionSignature = await sessionWallet.signMessage(message)\n","title":"5. Sign Message with Session Key","titles":["Using Session keys with Sequence",null]},"230":{"href":"/sdk/typescript/03-guides/04-session-keys#6-verify-session-signature","html":"\n
Verify the session signature on the server or client side:
Note: You should retrieve the session key stored in local storage upon loading the application and only create a new session key if none can be found.
","isPage":false,"text":"\nVerify the session signature on the server or client side:\nconst recoveredSessionAddress = ethers.utils.verifyMessage(message, sessionSignature)\nif (recoveredSessionAddress === sessionAddress) {\n console.log('Session signature valid')\n} else {\n console.log('Session signature invalid')\n}\nNote: You should retrieve the session key stored in local storage upon loading the application and only create a new session key if none can be found.","title":"6. Verify Session Signature","titles":["Using Session keys with Sequence",null]},"231":{"href":"/sdk/typescript/03-guides/05-send-transaction#sending-transactions","html":"\n
Signing a transaction will only retrieve the signed payload.\nIf you want the wallet to actually dispatch the transaction to the network as well, that requires only a small modification to the previous example (note the change from signTransactions to sendTransaction):
","isPage":true,"text":"\nSigning a transaction will only retrieve the signed payload.\nIf you want the wallet to actually dispatch the transaction to the network as well, that requires only a small modification to the previous example (note the change from signTransactions to sendTransaction):\nconst transaction = {\n to: recipientAddress,\n value: 1000000000000000000\n}\n \nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n ","title":"Sending Transactions","titles":[]},"232":{"href":"/sdk/typescript/03-guides/06-send-erc20#sending-erc-20-tokens","html":"\n
You can ask the wallet to send a single ERC-20 token transfer:
\n
const erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\n\n// Encode an ERC-20 token transfer to recipient of the specified amount\nconst data = erc20Interface.encodeFunctionData(\n 'transfer', [recipientAddress, amount]\n)\n\nconst transaction = {\n to: daiContractAddress,\n data\n}\n\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n
\n
With batching functionality, you can send multiple token transfers in a single native transaction:
\n
const erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\n\n// Encode two different ERC-20 token transfers\nconst data1 = erc20Interface.encodeFunctionData(\n 'transfer', [recipient1Address, amount1]\n)\nconst data2 = erc20Interface.encodeFunctionData(\n 'transfer', [recipient2Address, amount2]\n)\n\nconst transaction1 = {\n to: daiContractAddress,\n data: data1\n}\n\nconst transaction2 = {\n to: daiContractAddress,\n data: data2\n}\n\n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction([transaction1, transaction2])\nconsole.log(txnResponse)\n
","isPage":true,"text":"\nYou can ask the wallet to send a single ERC-20 token transfer:\nconst erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\n \n// Encode an ERC-20 token transfer to recipient of the specified amount\nconst data = erc20Interface.encodeFunctionData(\n 'transfer', [recipientAddress, amount]\n)\n \nconst transaction = {\n to: daiContractAddress,\n data\n}\n \nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n \nWith batching functionality, you can send multiple token transfers in a single native transaction:\nconst erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\n \n// Encode two different ERC-20 token transfers\nconst data1 = erc20Interface.encodeFunctionData(\n 'transfer', [recipient1Address, amount1]\n)\nconst data2 = erc20Interface.encodeFunctionData(\n 'transfer', [recipient2Address, amount2]\n)\n \nconst transaction1 = {\n to: daiContractAddress,\n data: data1\n}\n \nconst transaction2 = {\n to: daiContractAddress,\n data: data2\n}\n \n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction([transaction1, transaction2])\nconsole.log(txnResponse)\n ","title":"Sending ERC-20 Tokens","titles":[]},"233":{"href":"/sdk/typescript/03-guides/07-send-erc721#sending-erc-721-nft-tokens","html":"\n
Sending an ERC-721 NFT is similar to sending an ERC-20 token.\nThe only notable difference is in the contract standard itself:
\n
const erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\n\n// Encode the transfer of the NFT tokenId to recipient\nconst address = await wallet.getAddress()\nconst data = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipientAddress, tokenId]\n)\n\nconst transaction = {\n to: erc721TokenAddress,\n data\n}\n\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n
\n
With batching functionality, you can send multiple token transfers in a single native transaction:
\n
const erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\n\n// Encode two different ERC-721 token transfers\nconst data1 = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient1Address, amount1]\n)\nconst data2 = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient2Address, amount2]\n)\n\nconst transaction1 = {\n to: erc721ContractAddress,\n data: data1\n}\n\nconst transaction2 = {\n to: erc721ContractAddress,\n data: data2\n}\n\n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransactionBatch([transaction1, transaction2])\nconsole.log(txnResponse)\n
","isPage":true,"text":"\nSending an ERC-721 NFT is similar to sending an ERC-20 token.\nThe only notable difference is in the contract standard itself:\nconst erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\n \n// Encode the transfer of the NFT tokenId to recipient\nconst address = await wallet.getAddress()\nconst data = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipientAddress, tokenId]\n)\n \nconst transaction = {\n to: erc721TokenAddress,\n data\n}\n \nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n \nWith batching functionality, you can send multiple token transfers in a single native transaction:\nconst erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\n \n// Encode two different ERC-721 token transfers\nconst data1 = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient1Address, amount1]\n)\nconst data2 = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient2Address, amount2]\n)\n \nconst transaction1 = {\n to: erc721ContractAddress,\n data: data1\n}\n \nconst transaction2 = {\n to: erc721ContractAddress,\n data: data2\n}\n \n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransactionBatch([transaction1, transaction2])\nconsole.log(txnResponse)\n ","title":"Sending ERC-721 (NFT) Tokens","titles":[]},"234":{"href":"/sdk/typescript/03-guides/08-send-erc1155#sending-erc-1155-collectible-tokens","html":"\n
Sending an ERC-1155 collectible is similar to sending an ERC-20 token.\nThe only notable difference is in the contract standard itself:
\n
const erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n\n// Encode the transfer of the collectible to recipient\nconst address = await wallet.getAddress()\nconst data = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipientAddress, tokenId, amount, '0x']\n)\n\nconst transaction = {\n to: erc1155TokenAddress,\n data\n}\n\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n
\n
With batching functionality, you can send multiple token transfers in a single native transaction:
\n
const erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n\n// Encode two different ERC-1155 token transfers\nconst data1 = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient1Address, token1Id, amount1, '0x']\n)\nconst data2 = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient2Address, token2Id, amount2, '0x']\n)\n\nconst transaction1 = {\n to: erc1155ContractAddress,\n data: data1\n}\nconst transaction2 = {\n to: erc1155ContractAddress,\n data: data2\n}\n\n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransactionBatch([transaction1, transaction2])\nconsole.log(txnResponse)\n
","isPage":true,"text":"\nSending an ERC-1155 collectible is similar to sending an ERC-20 token.\nThe only notable difference is in the contract standard itself:\nconst erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n \n// Encode the transfer of the collectible to recipient\nconst address = await wallet.getAddress()\nconst data = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipientAddress, tokenId, amount, '0x']\n)\n \nconst transaction = {\n to: erc1155TokenAddress,\n data\n}\n \nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n \nWith batching functionality, you can send multiple token transfers in a single native transaction:\nconst erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n \n// Encode two different ERC-1155 token transfers\nconst data1 = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient1Address, token1Id, amount1, '0x']\n)\nconst data2 = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient2Address, token2Id, amount2, '0x']\n)\n \nconst transaction1 = {\n to: erc1155ContractAddress,\n data: data1\n}\nconst transaction2 = {\n to: erc1155ContractAddress,\n data: data2\n}\n \n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransactionBatch([transaction1, transaction2])\nconsole.log(txnResponse)\n ","title":"Sending ERC-1155 (Collectible) Tokens","titles":[]},"235":{"href":"/sdk/typescript/03-guides/09-send-batch-transactions#sending-a-batch-of-transactions","html":"\n
Likewise, bundling multiple transactions to be sent in a single native transaction is equally as easy:
","isPage":true,"text":"\nLikewise, bundling multiple transactions to be sent in a single native transaction is equally as easy:\nconst transaction1 = {\n to: recipient1Address,\n value: 1000000000000000000\n}\n \nconst transaction2 = {\n to: recipient2Address,\n value: 1000000000000000000\n}\n \nconst signer = wallet.getSigner()\nconst response = await signer.sendTransaction([transaction1, transaction2])\nconsole.log(response)\nThe transactions don't have to be the same token or even token standard either.\nYou can mix and match:\nconst erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\nconst erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\nconst erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n \nconst erc20Data = erc20Interface.encodeFunctionData(\n 'transfer', [recipient2Address, amount2]\n)\nconst erc721Data = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient3Address, amount3]\n)\nconst erc1155Data = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient4Address, token4Id, amount4, '0x']\n)\n \nconst transactions = [\n { to: recipient1Address, value: '1000000000000000000' },\n { to: daiContractAddress, data: erc20Data },\n { to: erc721ContractAddress, data: erc721Data },\n { to: erc1155ContractAddress, data: erc1155Data }\n]\n \nconst signer = wallet.getSigner()\nconst response = await signer.sendTransaction(transactions)\nconsole.log(response)","title":"Sending a Batch of Transactions","titles":[]},"236":{"href":"/sdk/typescript/03-guides/10-building-backends#building-backends-with-sequence","html":"\n","isPage":true,"text":"\n","title":"Building Backends with Sequence","titles":[]},"237":{"href":"/sdk/typescript/03-guides/10-building-backends#nodejs","html":"\n
The 0xsequence package which is available for browser / client use, also works perfectly on nodejs backends\nwritten in Javascript or Typescript.
\n","isPage":false,"text":"\nThe 0xsequence package which is available for browser / client use, also works perfectly on nodejs backends\nwritten in Javascript or Typescript.\n","title":"nodejs","titles":["Building Backends with Sequence",null]},"238":{"href":"/sdk/typescript/03-guides/10-building-backends#go","html":"\n
go-sequence is the equivalent of 0xsequence\nbut for Go / Golang backends. In fact, all of Sequence's infrastructure is written in Go and is built with go-sequence.
\n","isPage":false,"text":"\nA complete Sequence SDK is also available in Go: https://github.com/0xsequence/go-sequence.\ngo-sequence is the equivalent of 0xsequence\nbut for Go / Golang backends. In fact, all of Sequence's infrastructure is written in Go and is built with go-sequence.\n","title":"Go","titles":["Building Backends with Sequence",null]},"239":{"href":"/sdk/typescript/03-guides/10-building-backends#ethkit","html":"\n
As part of the Sequence open source tools, our team has also built ethkit, which\nis an Ethereum dev toolkit for Go backends. ethkit supports EOA wallets,\nand you can think of it like ethers.js but for Go.
\n","isPage":false,"text":"\nAs part of the Sequence open source tools, our team has also built ethkit, which\nis an Ethereum dev toolkit for Go backends. ethkit supports EOA wallets,\nand you can think of it like ethers.js but for Go.\n","title":"ethkit","titles":["Building Backends with Sequence",null]},"240":{"href":"/sdk/typescript/03-guides/10-building-backends#support-for-other-backend-languages","html":"\n
If your backend services are written in a language other than JS or Go, you can still easily integrate Sequence,\nas Sequence is really just a standard Ethereum client library with some extra features. In many cases, the extra\nfeatures are best utilized on the client-side / dapp.
\n
If your situation for example is a Python or Java backend where you'd like to verify signatures from a Sequence Wallet,\nwell then, you can call the standard EIP1271 function for the account address\nfrom your backend.
","isPage":false,"text":"\nIf your backend services are written in a language other than JS or Go, you can still easily integrate Sequence,\nas Sequence is really just a standard Ethereum client library with some extra features. In many cases, the extra\nfeatures are best utilized on the client-side / dapp.\nIf your situation for example is a Python or Java backend where you'd like to verify signatures from a Sequence Wallet,\nwell then, you can call the standard EIP1271 function for the account address\nfrom your backend.\nIf you'd like to use the Sequence's Meta-Transaction capabilities, see Building Relaying Server with Sequence.","title":"Support for other backend languages","titles":["Building Backends with Sequence",null]},"241":{"href":"/sdk/typescript/03-guides/overview#install","html":"\n
Sequence.js is a modular web3 stack and smart wallet package for Ethereum chains. You can think of it similar to ethers.js, but tailored to the Sequence stack which streamlines common functions needed for blockchain-enabled game development. The sequence.js SDK is composed of several sub-packages combined into a single meta-package called 0xsequence.\nTo add the SDK to your project, add a dependency on 0xsequence to your package.json:
\n
npm install 0xsequence ethers
\n
or
\n
pnpm install 0xsequence ethers
\n
or
\n
yarn add 0xsequence ethers
\n
If you know that your project only requires specific sub-packages, you can also depend on those directly with\nnpm add @0xsequence/<sub-package name>.
\n
Your package.json should look something like this (actual version may vary):
\n","isPage":true,"text":"\nSequence.js is a modular web3 stack and smart wallet package for Ethereum chains. You can think of it similar to ethers.js, but tailored to the Sequence stack which streamlines common functions needed for blockchain-enabled game development. The sequence.js SDK is composed of several sub-packages combined into a single meta-package called 0xsequence.\nTo add the SDK to your project, add a dependency on 0xsequence to your package.json:\nnpm install 0xsequence ethers\nor\npnpm install 0xsequence ethers\nor\nyarn add 0xsequence ethers\nIf you know that your project only requires specific sub-packages, you can also depend on those directly with\nnpm add @0xsequence/<sub-package name>.\nYour package.json should look something like this (actual version may vary):\n{\n "name": "my-dapp",\n ...\n "dependencies": {\n "0xsequence": "^1.0.0",\n "ethers": ^5.7.0"\n ...\n }\n}\n","title":"Install","titles":[null]},"242":{"href":"/sdk/typescript/03-guides/overview#cdn-distribution-as-native-js","html":"\n
Optionally, 0xsequence can be installed as a JS script source (UMD distribution) via:
","isPage":false,"text":"\nOptionally, 0xsequence can be installed as a JS script source (UMD distribution) via:\n<script src="https://cdn.ethers.io/lib/ethers-5.7.umd.min.js"></script>\n<script src="https://unpkg.com/0xsequence@latest/dist/0xsequence.umd.min.js"></script>","title":"CDN distribution as native JS","titles":[null,"Install",null]},"243":{"href":"/sdk/typescript/connectors/01-overview#wallet-connectors","html":"\n
Sequence is compatible with all standard Ethereum libraries and connectors. If you've\ndeveloped your dapp to with work Metamask, it will also automatically work with Sequence.
\n
Our SDKs offer all the functionality you'd need to build a web3 dapp, but you can also\ncombine other libraries, tools, and wallet connectors :) Please see our open sourced Demo Dapp\nproject for an example use of Sequence, or see below on usage with additional connectors.
\n
For your dapps, you may also want to support many different kinds of wallets in addition\nto the Sequence Wallet. You may do this by using sequence.js or using one of the connectors below:
Additionally, if you are building a mobile app or video game, please see the docs for\nthe respective SDK. Feel free to reach out to our team for help/questions too.
","isPage":true,"text":"\nSequence is compatible with all standard Ethereum libraries and connectors. If you've\ndeveloped your dapp to with work Metamask, it will also automatically work with Sequence.\nOur SDKs offer all the functionality you'd need to build a web3 dapp, but you can also\ncombine other libraries, tools, and wallet connectors :) Please see our open sourced Demo Dapp\nproject for an example use of Sequence, or see below on usage with additional connectors.\nFor your dapps, you may also want to support many different kinds of wallets in addition\nto the Sequence Wallet. You may do this by using sequence.js or using one of the connectors below:\n\nSequence Kit\nWagmi\nWeb3Modal\nRainbowKit\nweb3-onboard\nweb3-react\n\nAdditionally, if you are building a mobile app or video game, please see the docs for\nthe respective SDK. Feel free to reach out to our team for help/questions too.","title":"Wallet Connectors","titles":[]},"244":{"href":"/sdk/typescript/connectors/02-sequence-kit#sequence-kit-seamlessly-integrate-web3-wallets-into-your-applications","html":"\n
Sequence Kit 🧰 is the ultimate toolkit for effortlessly integrating web3 wallets into your applications, providing your users with a smooth and secure onboarding experience. With our robust tools built on the popular wagmi library, unlock a realm of possibilities in the world of web3.
\n","isPage":true,"text":"\nSequence Kit 🧰 is the ultimate toolkit for effortlessly integrating web3 wallets into your applications, providing your users with a smooth and secure onboarding experience. With our robust tools built on the popular wagmi library, unlock a realm of possibilities in the world of web3.\n","title":"Sequence Kit: Seamlessly Integrate Web3 Wallets into Your Applications","titles":[]},"245":{"href":"/sdk/typescript/connectors/02-sequence-kit#key-features","html":"\n
\n
\n
Universal Connections: Seamlessly connect via popular social logins such as Facebook, Google, Discord, and more! Your users will enjoy a smooth, secure onboarding process. 🔐🪪
\n
\n
\n
Web3 Wallet Integration: Effortlessly integrate with leading web3 wallets like WalletConnect and MetaMask. Unleash the power of blockchain with just a few clicks! 🦊 ⛓️
\n
\n
\n
Embedded Wallet Experience: Provide your users with a comprehensive embedded wallet, enabling them to manage their coins and collectibles all within your own application. 👛 🖼️ 🪙
\n
\n
\n
Explore the potential of Sequence Kit by trying out our demo!
\n","isPage":false,"text":"\n\n\nUniversal Connections: Seamlessly connect via popular social logins such as Facebook, Google, Discord, and more! Your users will enjoy a smooth, secure onboarding process. 🔐🪪\n\n\nWeb3 Wallet Integration: Effortlessly integrate with leading web3 wallets like WalletConnect and MetaMask. Unleash the power of blockchain with just a few clicks! 🦊 ⛓️\n\n\nEmbedded Wallet Experience: Provide your users with a comprehensive embedded wallet, enabling them to manage their coins and collectibles all within your own application. 👛 🖼️ 🪙\n\n\nExplore the potential of Sequence Kit by trying out our demo!\n","title":"Key Features","titles":["Sequence Kit: Seamlessly Integrate Web3 Wallets into Your Applications"]},"246":{"href":"/sdk/typescript/connectors/02-sequence-kit#next-steps","html":"\n
Ready to integrate Sequence Kit into your application? Check out our Getting Started guide. If you're already familiar with Sequence Kit dive into the available configuration options or take a look at the checkout.
","isPage":false,"text":"\nReady to integrate Sequence Kit into your application? Check out our Getting Started guide. If you're already familiar with Sequence Kit dive into the available configuration options or take a look at the checkout.","title":"Next Steps","titles":[]},"247":{"href":"/sdk/typescript/connectors/03-wagmi#using-wagmi","html":"\n
The Sequence wallet used with Wagmi through the connector.
\n
:::tip Try it live :)\nTry a live Dapp example using Sequence + Metamask + Wallet Connect with wagmi.
\n","isPage":true,"text":"\nThe Sequence wallet used with Wagmi through the connector.\n:::tip Try it live :)\nTry a live Dapp example using Sequence + Metamask + Wallet Connect with wagmi.\nSource code is available too: https://github.com/0xsequence/demo-dapp-wagmi\n:::\n","title":"Using Wagmi","titles":[]},"248":{"href":"/sdk/typescript/connectors/03-wagmi#installation","html":"\n
The connector is installed via the npm package @0xsequence/wagmi-connector. If you are using the latest version of wagmi (>= 1.0.0) the latest version of the wagmi-connector package can be installed with the following command:
\n","isPage":false,"text":"\nThe connector is installed via the npm package @0xsequence/wagmi-connector. If you are using the latest version of wagmi (>= 1.0.0) the latest version of the wagmi-connector package can be installed with the following command:\nnpm install @0xsequence/wagmi-connector 0xsequence ethers\nor\nyarn add @0xsequence/wagmi-connector 0xsequence ethers\n","title":"Installation","titles":["Using Wagmi"]},"249":{"href":"/sdk/typescript/connectors/03-wagmi#usage","html":"\n
The connector is then imported and added to the list of connectors alongside the other wagmi connectors.
\n","isPage":false,"text":"\nThe connector is then imported and added to the list of connectors alongside the other wagmi connectors.\nimport { SequenceConnector } from "@0xsequence/wagmi-connector";\n \nconst connectors = [\n new SequenceConnector({\n chains,\n options: {\n defaultNetwork: "polygon",\n connect: {\n app: "Demo-app",\n },\n },\n }),\n ...otherConnectors,\n];\n \nconst wagmiConfig = createConfig({\n autoConnect: true,\n connectors,\n publicClient,\n webSocketPublicClient,\n});\n","title":"Usage","titles":["Using Wagmi"]},"250":{"href":"/sdk/typescript/connectors/03-wagmi#parameters","html":"\n","isPage":false,"text":"\n","title":"Parameters","titles":["Using Wagmi"]},"251":{"href":"/sdk/typescript/connectors/03-wagmi#chains","html":"\n
Chains supported by app. This is the same parameter as would be passed to other RainbowKit wallets.
\n","isPage":false,"text":"\nChains supported by app. This is the same parameter as would be passed to other RainbowKit wallets.\n","title":"chains","titles":["Using Wagmi","Parameters"]},"252":{"href":"/sdk/typescript/connectors/03-wagmi#optionsconnect-optional","html":"\n
Connection details that will be passed to Sequence upon connection, including app name, network id, etc...\nA more in depth description of the connect options is available here.
\n","isPage":false,"text":"\nConnection details that will be passed to Sequence upon connection, including app name, network id, etc...\nA more in depth description of the connect options is available here.\n","title":"options.connect (optional)","titles":["Using Wagmi","Parameters"]},"253":{"href":"/sdk/typescript/connectors/03-wagmi#optionsdefaultnetwork-optional","html":"\n
The default network to connect to. Sequence will default all operations to this network. It can also be defined using a number (e.g. 1 for Mainnet, 5 for Goerli, etc...).
\n","isPage":false,"text":"\nThe default network to connect to. Sequence will default all operations to this network. It can also be defined using a number (e.g. 1 for Mainnet, 5 for Goerli, etc...).\n","title":"options.defaultNetwork (optional)","titles":["Using Wagmi","Parameters"]},"254":{"href":"/sdk/typescript/connectors/03-wagmi#using-older-versions-of-wagmi--012x","html":"\n
If you are using an older version of Wagmi (<= 0.12.x), which is based on ethers instead of viem, use the following command to install the appropriate version of the wagmi connector:
\n","isPage":false,"text":"\nIf you are using an older version of Wagmi (<= 0.12.x), which is based on ethers instead of viem, use the following command to install the appropriate version of the wagmi connector:\nnpm install @0xsequence/wagmi-connector@1.0 0xsequence ethers\nor\nyarn add @0xsequence/wagmi-connector@1.0 0xsequence ethers\n","title":"Using older versions of Wagmi (<= 0.12.x)","titles":["Using Wagmi"]},"255":{"href":"/sdk/typescript/connectors/03-wagmi#using-nextjs","html":"\n
There are special considerations to take into account when using Wagmi with NextJs such that it functions harmoniously with the server-side rendering of NextJs.\nThe correct technique to use differs depending on whether the application uses the older pages router or the more recent app router.
\n
See this section for an explanation on using the Wagmi connector with app router. \nSee the example app which uses the app router structure.
\n
See this section for an explanation on using the Wagmi connector with pages router. \nSee the example app which uses the pages router structure.
\n","isPage":false,"text":"\nThere are special considerations to take into account when using Wagmi with NextJs such that it functions harmoniously with the server-side rendering of NextJs.\nThe correct technique to use differs depending on whether the application uses the older pages router or the more recent app router.\nSee this section for an explanation on using the Wagmi connector with app router.\nSee the example app which uses the app router structure.\nSee this section for an explanation on using the Wagmi connector with pages router.\nSee the example app which uses the pages router structure.\n","title":"Using NextJs","titles":["Using Wagmi"]},"256":{"href":"/sdk/typescript/connectors/03-wagmi#examples","html":"\n
Below are example dapps using various versions of wagmi and libraries.
\n
A demo app for the lastest version of Wagmi is available here. \nA demo app is available for older version of Wagmi(<=0.12.x) is available here.
\n
A demo app for Wagmi + NextJs with the app router structure here. \nA demo app for Wagmi + NextJs with the older pages router structure here.
","isPage":false,"text":"\nBelow are example dapps using various versions of wagmi and libraries.\nA demo app for the lastest version of Wagmi is available here.\nA demo app is available for older version of Wagmi(<=0.12.x) is available here.\nA demo app for Wagmi + NextJs with the app router structure here.\nA demo app for Wagmi + NextJs with the older pages router structure here.","title":"Examples","titles":["Using Wagmi"]},"257":{"href":"/sdk/typescript/connectors/04-rainbow-kit#using-rainbowkit","html":"\n
The Sequence wallet can be added to RainbowKit through the connector.
\n
:::tip Try it live :)\nTry a live Dapp example using Sequence + Metamask + Rainbow + Wallet Connect with RainbowKit.
\n","isPage":true,"text":"\nThe Sequence wallet can be added to RainbowKit through the connector.\n:::tip Try it live :)\nTry a live Dapp example using Sequence + Metamask + Rainbow + Wallet Connect with RainbowKit.\nSource code is available too: https://github.com/0xsequence/demo-dapp-rainbowkit\n:::\n","title":"Using RainbowKit","titles":[]},"258":{"href":"/sdk/typescript/connectors/04-rainbow-kit#installation","html":"\n
The connector is installed via the npm package @0xsequence/rainbowkit-plugin.
\n","isPage":false,"text":"\nThe connector is then imported and added to the list of connectors alongside the other RainbowKit wallets.\nimport { sequenceWallet } from '@0xsequence/rainbowkit-plugin'\nimport { connectorsForWallets } from '@rainbow-me/rainbowkit';\n \nconst connectors = connectorsForWallets([\n {\n groupName: 'Recommended',\n wallets: [\n sequenceWallet({\n chains,\n defaultNetwork: 'polygon',\n connect: {\n app: 'Demo-app'\n }\n }),\n ...otherRainbowKitWallets\n ]\n }\n \n","title":"Usage","titles":["Using RainbowKit"]},"260":{"href":"/sdk/typescript/connectors/04-rainbow-kit#parameters","html":"\n","isPage":false,"text":"\n","title":"Parameters","titles":["Using RainbowKit"]},"261":{"href":"/sdk/typescript/connectors/04-rainbow-kit#chains","html":"\n
Chains supported by app. This is the same parameter as would be passed to other RainbowKit wallets.
\n","isPage":false,"text":"\nChains supported by app. This is the same parameter as would be passed to other RainbowKit wallets.\n","title":"chains","titles":["Using RainbowKit","Parameters"]},"262":{"href":"/sdk/typescript/connectors/04-rainbow-kit#connect-optional","html":"\n
Connect options for Sequence, including the name of the app and the default network id the wallet will attempt connection to.\nA more in depth description of the connect options is available here.
\n","isPage":false,"text":"\nConnect options for Sequence, including the name of the app and the default network id the wallet will attempt connection to.\nA more in depth description of the connect options is available here.\n","title":"connect (optional)","titles":["Using RainbowKit","Parameters"]},"263":{"href":"/sdk/typescript/connectors/04-rainbow-kit#defaultnetwork-optional","html":"\n
The default network to connect to. Sequence will default all operations to this network. It can also be defined using a number (e.g. 1 for Mainnet, 5 for Goerli, etc...).
\n","isPage":false,"text":"\nThe default network to connect to. Sequence will default all operations to this network. It can also be defined using a number (e.g. 1 for Mainnet, 5 for Goerli, etc...).\n","title":"defaultNetwork (optional)","titles":["Using RainbowKit","Parameters"]},"264":{"href":"/sdk/typescript/connectors/04-rainbow-kit#using-nextjs","html":"\n
There are special considerations to take into account when using NextJs with Wagmi-based libraries like RainbowKit, such that it functions harmoniously with the server-side rendering of NextJs.\nThe correct technique to use differs depending on whether the application uses the older pages router or the more recent app router.
\n
See this section for an explanation on using Wagmi or Wagmi-based libraries with app router. \nSee the example app which uses the app router structure.
\n
See this section for an explanation on using Wagmi or Wagmi-based libraries with pages router. \nSee the example app which uses the pages router structure.
\n","isPage":false,"text":"\nThere are special considerations to take into account when using NextJs with Wagmi-based libraries like RainbowKit, such that it functions harmoniously with the server-side rendering of NextJs.\nThe correct technique to use differs depending on whether the application uses the older pages router or the more recent app router.\nSee this section for an explanation on using Wagmi or Wagmi-based libraries with app router.\nSee the example app which uses the app router structure.\nSee this section for an explanation on using Wagmi or Wagmi-based libraries with pages router.\nSee the example app which uses the pages router structure.\n","title":"Using NextJs","titles":["Using RainbowKit"]},"265":{"href":"/sdk/typescript/connectors/04-rainbow-kit#using-older-versions-of-wagmi--012x","html":"\n
If you are using an older version of Wagmi (<= 0.12.x), which is based on ethers instead of viem, use the following command to install the appropriate version of the wagmi connector:
\n","isPage":false,"text":"\nIf you are using an older version of Wagmi (<= 0.12.x), which is based on ethers instead of viem, use the following command to install the appropriate version of the wagmi connector:\nnpm install @0xsequence/wagmi-connector@1.0 0xsequence ethers\nor\nyarn add @0xsequence/wagmi-connector@1.0 0xsequence ethers\n","title":"Using older versions of Wagmi (<= 0.12.x)","titles":["Using RainbowKit"]},"266":{"href":"/sdk/typescript/connectors/04-rainbow-kit#examples","html":"\n
A demo app for NextJs + Wagmi (which is applicable for wagmi-based libraries) with the app router structure here. \nA demo app for NextJs + Wagmi (which is applicable for wagmi-based libraries) with the older pages router structure here.
","isPage":false,"text":"\nA demo app for RainbowKit is available here\nA demo app for NextJs + Wagmi (which is applicable for wagmi-based libraries) with the app router structure here.\nA demo app for NextJs + Wagmi (which is applicable for wagmi-based libraries) with the older pages router structure here.","title":"Examples","titles":["Using RainbowKit"]},"267":{"href":"/sdk/typescript/connectors/05-web3-onboard#using-web3-onboard","html":"\n
The Sequence wallet can be added through the Blocknative web3-onboard package.
\n
:::tip Try it live :)\nTry a live Dapp example using Sequence + Metamask + Wallet Connect with Web3-Onboard.
\n","isPage":true,"text":"\nThe Sequence wallet can be added through the Blocknative web3-onboard package.\n:::tip Try it live :)\nTry a live Dapp example using Sequence + Metamask + Wallet Connect with Web3-Onboard.\nSource code is available too: https://github.com/0xsequence/demo-dapp-web3-onboard\n:::\n","title":"Using Web3-Onboard","titles":[]},"268":{"href":"/sdk/typescript/connectors/05-web3-onboard#installation","html":"\n
The default network that the Sequence wallet will attempt to connect to.
\n","isPage":false,"text":"\nThe default network that the Sequence wallet will attempt to connect to.\n","title":"network (optional)","titles":["Using Web3-Onboard","Parameters"]},"272":{"href":"/sdk/typescript/connectors/05-web3-onboard#appname-optional","html":"\n
The name of the app which will show up in Sequence's prompt upon an attempt to connect.
\n","isPage":false,"text":"\nThe name of the app which will show up in Sequence's prompt upon an attempt to connect.\n","title":"appName (optional)","titles":["Using Web3-Onboard","Parameters"]},"273":{"href":"/sdk/typescript/connectors/05-web3-onboard#example","html":"\n
An example demo of an integration of Sequence + Web3 Onboard is available here
","isPage":false,"text":"\nAn example demo of an integration of Sequence + Web3 Onboard is available here","title":"Example","titles":["Using Web3-Onboard"]},"274":{"href":"/sdk/typescript/connectors/06-web3-react-v6#using-web3-react-v6","html":"\n
The connector is available for web3-react V6. Please note that later versions of web3-react cannot be used with the Web3-React V6 connector due to breaking changes.
\n","isPage":true,"text":"\nThe connector is available for web3-react V6. Please note that later versions of web3-react cannot be used with the Web3-React V6 connector due to breaking changes.\n","title":"Using Web3-React V6","titles":[]},"275":{"href":"/sdk/typescript/connectors/06-web3-react-v6#installation","html":"\n
The connector may be installed via the npm package:
\n","isPage":false,"text":"\nThe connector may be installed via the npm package:\n npm install @0xsequence/web3-react-v6-connector 0xsequence ethers\n","title":"Installation","titles":["Using Web3-React V6"]},"276":{"href":"/sdk/typescript/connectors/06-web3-react-v6#usage","html":"\n","isPage":false,"text":"\n","title":"Usage","titles":["Using Web3-React V6"]},"277":{"href":"/sdk/typescript/connectors/06-web3-react-v6#initialization","html":"\n
The connector must be initialized similarly to other connectors.
\n","isPage":false,"text":"\nThe connection can be activated and deactivated from the initialized connector similarly to other connectors.\nimport { useWeb3React } from '@web3-react/core'\nimport { sequence as sequenceConnector } from './connectors/sequence'\n \nconst { activate } = useWeb3React()\n \nconst connectWeb3React = async () => {\n activate(sequenceConnector);\n}\n \nconst disconnectWeb3React = async () => {\n sequenceConnector.deactivate();\n}\n","title":"Activation/Deactivation","titles":["Using Web3-React V6","Usage"]},"279":{"href":"/sdk/typescript/connectors/06-web3-react-v6#options","html":"\n","isPage":false,"text":"\n","title":"Options","titles":["Using Web3-React V6"]},"280":{"href":"/sdk/typescript/connectors/06-web3-react-v6#chainid","html":"\n
The default chain id as number that the Sequence wallet will attempt to connect to.
\n","isPage":false,"text":"\nThe default chain id as number that the Sequence wallet will attempt to connect to.\n","title":"chainId","titles":["Using Web3-React V6","Options"]},"281":{"href":"/sdk/typescript/connectors/06-web3-react-v6#appname-optional","html":"\n
The value of appName will be displayed by the Sequence wallet when initiating a connection.
\n","isPage":false,"text":"\nThe value of appName will be displayed by the Sequence wallet when initiating a connection.\n","title":"appName (optional)","titles":["Using Web3-React V6","Options"]},"282":{"href":"/sdk/typescript/connectors/06-web3-react-v6#example","html":"\n
","isPage":false,"text":"\nA demo app for Web3-React v6 is available here","title":"Example","titles":["Using Web3-React V6"]},"283":{"href":"/sdk/typescript/connectors/07-web3modal#using-web3modal","html":"\n
The Sequence wallet can easily be used with Web3Modal.
\n
:::tip Try it live :)\nTry a live Dapp example using Sequence + Wallet Connect with Web3Modal.
\n","isPage":true,"text":"\nThe Sequence wallet can easily be used with Web3Modal.\n:::tip Try it live :)\nTry a live Dapp example using Sequence + Wallet Connect with Web3Modal.\nSource code is available too: https://github.com/0xsequence/demo-dapp-web3modal\n:::\n","title":"Using Web3Modal","titles":[]},"284":{"href":"/sdk/typescript/connectors/07-web3modal#usage","html":"\n
The sequence wallet is compatible with wallet connect V2 and is therefore fully compatible with web3modal by default.\nUsers can use the Scan button in the sequence wallet to connect.
\n\n","isPage":false,"text":"\nThe sequence wallet is compatible with wallet connect V2 and is therefore fully compatible with web3modal by default.\nUsers can use the Scan button in the sequence wallet to connect.\n\n","title":"Usage","titles":["Using Web3Modal"]},"285":{"href":"/sdk/typescript/connectors/07-web3modal#example","html":"\n
","isPage":false,"text":"\nAn example demo for the sequence Wallet + web3modal is available [here] (https://github.com/0xsequence/demo-dapp-web3modal)","title":"Example","titles":["Using Web3Modal"]},"286":{"href":"/sdk/typescript/connectors/08-FAQ#nextjs","html":"\n","isPage":true,"text":"\n","title":"NextJs","titles":[null]},"287":{"href":"/sdk/typescript/connectors/08-FAQ#why-does-my-wallet-integration-produce-an-error-when-used-with-nextjs","html":"\n
Wallet libraries and connectors must be rendered in the browser. This is particularly true for Wagmi and Wagmi-based libraries. Attempts to render the page elsewhere, such as on backend server, can produce errors in some situations. Rendering on the server is therefore highly discouraged.
\n
The method for fixing this issue will depend on the folder structure. The pages folder structure is available for all versions of NextJs, while the app folder structure is only available for NextJs version 13 and above and may require being turned on through an experimental setting.
\n","isPage":false,"text":"\nWallet libraries and connectors must be rendered in the browser. This is particularly true for Wagmi and Wagmi-based libraries. Attempts to render the page elsewhere, such as on backend server, can produce errors in some situations. Rendering on the server is therefore highly discouraged.\nThe method for fixing this issue will depend on the folder structure. The pages folder structure is available for all versions of NextJs, while the app folder structure is only available for NextJs version 13 and above and may require being turned on through an experimental setting.\nSee using wallet libraries with next.js pages directory\nSee using wallet libraries with next.js app directory(NextJs 13+ feature)\n","title":"Why does my wallet integration produce an error when used with next.js?","titles":[null,"NextJs"]},"288":{"href":"/sdk/typescript/connectors/08-FAQ#how-do-i-use-a-wallet-library-and-connector-with-nextjs-using-the-pages-directory-all-versions-of-nextjs","html":"\n
The content of the application which depends on Wagmi hooks must be mounted only once the application is rendered in the client. This is a limitation due to wagmi when used with NextJs, and all wagmi-based libraries will inherit this limitation. To do so we can use a useEffect hook to wait before rendering the application.
\n
In the example below, we wait until the app is mounted in the client before rendering the rest of the application:
\n
import { useIsMounted } from '../hooks'\nimport Home from '../components/Home'\n\nconst Page = () => {\n const isMounted = useIsMounted()\n\n if (!isMounted) return null\n return (\n <>\n <Home />\n </>\n )\n}\n\nexport default Page
\n
A full code example of this setup working with the Wagmi library can be found on github.\nThe method described above is the one recommended by Wagmi and is demonstrated in their official example.
\n","isPage":false,"text":"\nThe content of the application which depends on Wagmi hooks must be mounted only once the application is rendered in the client. This is a limitation due to wagmi when used with NextJs, and all wagmi-based libraries will inherit this limitation. To do so we can use a useEffect hook to wait before rendering the application.\nIn the example below, we wait until the app is mounted in the client before rendering the rest of the application:\nimport { useIsMounted } from '../hooks'\nimport Home from '../components/Home'\n \nconst Page = () => {\n const isMounted = useIsMounted()\n \n if (!isMounted) return null\n return (\n <>\n <Home />\n </>\n )\n}\n \nexport default Page\nA full code example of this setup working with the Wagmi library can be found on github.\nThe method described above is the one recommended by Wagmi and is demonstrated in their official example.\n","title":"How do I use a wallet library and connector with next.js using the pages directory (all versions of NextJs)?","titles":[null,"NextJs"]},"289":{"href":"/sdk/typescript/connectors/08-FAQ#how-do-i-use-a-wallet-library-and-connector-with-nextjs-using-the-app-directory-version-13-and-above-only","html":"\n
NextJs 13 and above allows using a new folder structure in which the content is placed in an app directory. Enabling this feature may require explicitly indicating it with an experimental setting.\nWhen using such a folder structure, NextJs allows the declaration of Client Components which are components that will be rendered in the browser.\nA wrapper component containing the wallet library initialized with all the connectors must be declared with the "use client" directive. The "use client" directive is what will turn the wrapper component into a Client Component to be rendered in the browser.
\n
In addition, there is a bug with wagmi and nextJs when using the autoConnect feature which causes
\n
In the example below, we declare a wrapper component with the "use client" directive:
\n
"use client" // this directive informs next.js that the component is a Client Component to be rendered in the browser\n\nconst WagmiWrapper = ({ children }) => {\n const wagmiClient = createClient({\n autoConnect: true,\n connectors,\n provider,\n webSocketProvider,\n });\n\n\n return (\n <WagmiConfig client={wagmiClient}>\n {children}\n </WagmiConfig>\n );\n}\n\nexport default WagmiWrapper
\n
This wrapper component can then be imported normally and wrap the rest of the application. The child components can be a combination of Client and Server components.
\n
// We import a custom wrapper component that initializes the wallet library and all its connectors\n// An example of the content of this wrapper component can be found here: https://github.com/0xsequence/demo-dapp-wagmi-next/blob/master/components/WagmiProvider.tsx\nimport WagmiWrapper from './WagmiWrapper'\n\n// We can then wrap our entire app with this browser's rendered component\nfunction MyApp({ Component, pageProps }: AppProps) {\n return (\n <WagmiWrapper>\n <Component {...pageProps} />\n </WagmiWrapper>\n );\n}
\n
A full code example using Nextjs and the app directory can be found on github.\nThe method described above is the one recommended by Wagmi through their NextJs example which can be consulted by running the command npx create-wagmi and selecting the nextJs option.
\n
Click here for more information about Client Components.
","isPage":false,"text":"\nNextJs 13 and above allows using a new folder structure in which the content is placed in an app directory. Enabling this feature may require explicitly indicating it with an experimental setting.\nWhen using such a folder structure, NextJs allows the declaration of Client Components which are components that will be rendered in the browser.\nA wrapper component containing the wallet library initialized with all the connectors must be declared with the "use client" directive. The "use client" directive is what will turn the wrapper component into a Client Component to be rendered in the browser.\nIn addition, there is a bug with wagmi and nextJs when using the autoConnect feature which causes\nIn the example below, we declare a wrapper component with the "use client" directive:\n"use client" // this directive informs next.js that the component is a Client Component to be rendered in the browser\n \nconst WagmiWrapper = ({ children }) => {\n const wagmiClient = createClient({\n autoConnect: true,\n connectors,\n provider,\n webSocketProvider,\n });\n \n \n return (\n <WagmiConfig client={wagmiClient}>\n {children}\n </WagmiConfig>\n );\n}\n \nexport default WagmiWrapper\nThis wrapper component can then be imported normally and wrap the rest of the application. The child components can be a combination of Client and Server components.\n// We import a custom wrapper component that initializes the wallet library and all its connectors\n// An example of the content of this wrapper component can be found here: https://github.com/0xsequence/demo-dapp-wagmi-next/blob/master/components/WagmiProvider.tsx\nimport WagmiWrapper from './WagmiWrapper'\n \n// We can then wrap our entire app with this browser's rendered component\nfunction MyApp({ Component, pageProps }: AppProps) {\n return (\n <WagmiWrapper>\n <Component {...pageProps} />\n </WagmiWrapper>\n );\n}\nA full code example using Nextjs and the app directory can be found on github.\nThe method described above is the one recommended by Wagmi through their NextJs example which can be consulted by running the command npx create-wagmi and selecting the nextJs option.\nClick here for more information about Client Components.","title":"How do I use a wallet library and connector with next.js using the app directory (version 13 and above only)?","titles":[null,"NextJs"]},"290":{"href":"/sdk/unity/Advanced/01-introduction#advanced---introduction","html":"\n
For advanced users with experience developing applications on EVM-based blockchains, we've provided our own lightweight, custom-made for Unity, Ethereum library: SequenceEthereum.\nSequenceEthereum should provide everything you need to build your Unity app on the EVM, without all the extra bells and whistles that the popular Nethereum library provides.
\n
While SequenceEthereum is heavily tested, in general, when working with asynchronous methods in the library, you should consider them to be "unsafe", in that they may throw Exceptions when used improperly.\nIn general, wrapping async calls that can potentially throw Exceptions in try catch blocks is a best practice; particularly in Unity, where Tasks can fail silently when throwing exceptions - making debugging difficult when not wrapping calls in try catch blocks.
\n","isPage":true,"text":"\nFor advanced users with experience developing applications on EVM-based blockchains, we've provided our own lightweight, custom-made for Unity, Ethereum library: SequenceEthereum.\nSequenceEthereum should provide everything you need to build your Unity app on the EVM, without all the extra bells and whistles that the popular Nethereum library provides.\nWhile SequenceEthereum is heavily tested, in general, when working with asynchronous methods in the library, you should consider them to be "unsafe", in that they may throw Exceptions when used improperly.\nIn general, wrapping async calls that can potentially throw Exceptions in try catch blocks is a best practice; particularly in Unity, where Tasks can fail silently when throwing exceptions - making debugging difficult when not wrapping calls in try catch blocks.\n","title":"Advanced - Introduction","titles":[]},"291":{"href":"/sdk/unity/Advanced/01-introduction#important-components","html":"\n
When working with the SequenceEthereum library it can be helpful to understand some of the main "components" and how they logically fit together.
\n","isPage":false,"text":"\nWhen working with the SequenceEthereum library it can be helpful to understand some of the main "components" and how they logically fit together.\n","title":"Important Components","titles":["Advanced - Introduction"]},"292":{"href":"/sdk/unity/Advanced/02-wallets#wallets","html":"\n
In the context of SequenceEthereum, a Wallet is defined by the IWallet interface. There are currently 2 implementations of the IWallet interface in this SDK.
\n","isPage":true,"text":"\nIn the context of SequenceEthereum, a Wallet is defined by the IWallet interface. There are currently 2 implementations of the IWallet interface in this SDK.\n","title":"Wallets","titles":[]},"293":{"href":"/sdk/unity/Advanced/02-wallets#1-ethwallet","html":"\n
EthWallet is a standard EOA wallet for EVM chains.
\n
An EthWallet is easily created:
\n
IWallet eoaWallet = new EthWallet(); // This will generate a cryptographically random private key\nIWallet eoaWallet = new EthWallet(privateKeyString); // Create a wallet using a previously generated private key
\n","isPage":false,"text":"\nEthWallet is a standard EOA wallet for EVM chains.\nAn EthWallet is easily created:\nIWallet eoaWallet = new EthWallet(); // This will generate a cryptographically random private key\nIWallet eoaWallet = new EthWallet(privateKeyString); // Create a wallet using a previously generated private key\n","title":"1.","titles":["Wallets"]},"294":{"href":"/sdk/unity/Advanced/02-wallets#2-waastowalletadapter","html":"\n
WaaSToWalletAdapter is an adapter that allows you to use a WaaSWallet with the same IWallet interface as an EthWallet so that it may be used interchangeably with EOA wallets throughout the rest of the SequenceEthereum library.
\n
A WaaSToWalletAdapter is easily created once you have a WaaSWallet:
\n
IWallet waasAdapter = new WaaSToWalletAdapter(waasWallet);
\n","isPage":false,"text":"\nWaaSToWalletAdapter is an adapter that allows you to use a WaaSWallet with the same IWallet interface as an EthWallet so that it may be used interchangeably with EOA wallets throughout the rest of the SequenceEthereum library.\nA WaaSToWalletAdapter is easily created once you have a WaaSWallet:\nIWallet waasAdapter = new WaaSToWalletAdapter(waasWallet);\n","title":"2.","titles":["Wallets"]},"295":{"href":"/sdk/unity/Advanced/02-wallets#methods","html":"\n
The IWallet interface provides a number of methods for you. The most important of which are:
\n","isPage":false,"text":"\nThe IWallet interface provides a number of methods for you. The most important of which are:\n","title":"Methods","titles":["Wallets"]},"296":{"href":"/sdk/unity/Advanced/02-wallets#getaddress","html":"\n
Returns the Address for the wallet
\n
Address address = wallet.GetAddress();
\n","isPage":false,"text":"\nReturns the Address for the wallet\nAddress address = wallet.GetAddress();\n","title":"GetAddress","titles":["Wallets","Methods"]},"297":{"href":"/sdk/unity/Advanced/02-wallets#sendtransaction","html":"\n
Signs the given EthTransaction and submits it via the given client
\n","isPage":false,"text":"\nSigns the given EthTransaction and submits it via the given client\nstring transactionHash = await wallet.SendTransaction(client, transaction);\n","title":"SendTransaction","titles":["Wallets","Methods"]},"298":{"href":"/sdk/unity/Advanced/02-wallets#sendtransactionandwaitforreceipt","html":"\n
Signs the given EthTransaction and submits it via the given client then waits for the TransactionReceipt
\n","isPage":false,"text":"\nSigns the given EthTransaction and submits it via the given client then waits for the TransactionReceipt\nTransactionReceipt receipt = await wallet.SendTransactionAndWaitForReceipt(client, transaction);\n","title":"SendTransactionAndWaitForReceipt","titles":["Wallets","Methods"]},"299":{"href":"/sdk/unity/Advanced/02-wallets#sendtransactionbatch","html":"\n
Signs the given EthTransaction[] and submits them via the given client.\nIf wallet is an EthWallet, the transactions will be submitted sequentially, each of which may pass or fail. If the wallet is a WaaSToWalletAdapter, the transactions will be batched together into a single transaction that is submitted all at once and either passes or fails as a whole.\nSimilarly, if a wallet is an EthWallet the string[] (transaction hashes) you receive will be equal in length to the EthTransaction[] you submitted. While, if the wallet is a WaaSToWalletAdapter, you will only receive one transaction hash (string[] of length 1)
\n","isPage":false,"text":"\nSigns the given EthTransaction[] and submits them via the given client.\nIf wallet is an EthWallet, the transactions will be submitted sequentially, each of which may pass or fail. If the wallet is a WaaSToWalletAdapter, the transactions will be batched together into a single transaction that is submitted all at once and either passes or fails as a whole.\nSimilarly, if a wallet is an EthWallet the string[] (transaction hashes) you receive will be equal in length to the EthTransaction[] you submitted. While, if the wallet is a WaaSToWalletAdapter, you will only receive one transaction hash (string[] of length 1)\nstring[] transactionHashes = await wallet.SendTransactionBatch(client, transactions);\n","title":"SendTransactionBatch","titles":["Wallets","Methods"]},"300":{"href":"/sdk/unity/Advanced/02-wallets#sendtransactionbatchandwaitforreceipts","html":"\n
Signs the given EthTransaction[] and submits them via the given client then waits for the TransactionReceipt[].\nIf wallet is an EthWallet, the transactions will be submitted sequentially, each of which may pass or fail. If the wallet is a WaaSToWalletAdapter, the transactions will be batched together into a single transaction that is submitted all at once and either passes or fails as a whole.\nSimilarly, if a wallet is an EthWallet the TransactionReceipt[] you receive will be equal in length to the EthTransaction[] you submitted. While, if the wallet is a WaaSToWalletAdapter, you will only receive one transaction receipt (TransactionReceipt[] of length 1)
\n","isPage":false,"text":"\nSigns the given EthTransaction[] and submits them via the given client then waits for the TransactionReceipt[].\nIf wallet is an EthWallet, the transactions will be submitted sequentially, each of which may pass or fail. If the wallet is a WaaSToWalletAdapter, the transactions will be batched together into a single transaction that is submitted all at once and either passes or fails as a whole.\nSimilarly, if a wallet is an EthWallet the TransactionReceipt[] you receive will be equal in length to the EthTransaction[] you submitted. While, if the wallet is a WaaSToWalletAdapter, you will only receive one transaction receipt (TransactionReceipt[] of length 1)\nTransactionReceipt[] receipts = await wallet.SendTransactionAndWaitForReceipt(client, transactions);\n","title":"SendTransactionBatchAndWaitForReceipts","titles":["Wallets","Methods"]},"301":{"href":"/sdk/unity/Advanced/02-wallets#signmessage","html":"\n
Given a message and an optional chain id, sign the message using the wallet. Omit the chain id from the signature if not provided
Note: the chainId is expected to be in hexadecimal format. If you are working with a Chain object (recommended), you can use the AsString method to get the hexadecimal format of the chain id
","isPage":false,"text":"\nGiven a message and an optional chain id, sign the message using the wallet. Omit the chain id from the signature if not provided\nstring signedMessage = await wallet.SignMessage(message, chainId)\nNote: the chainId is expected to be in hexadecimal format. If you are working with a Chain object (recommended), you can use the AsString method to get the hexadecimal format of the chain id\nstring signedMessage = await wallet.SignMessage(message, Chain.Polygon.AsString());","title":"SignMessage","titles":["Wallets","Methods"]},"302":{"href":"/sdk/unity/Advanced/03-clients#clients","html":"\n
In the context of SequenceEthereum, a Client is defined by the IEthClient interface.
\n
Creating a client requires a Chain. This will use our highly available and responsive Node Gateway service for your RPC requests; accessed using the API key from the Builder you've provided in your SequenceConfig scriptable object. If you prefer to use your own RPC URL, you can create a SequenceEthClient using a URL string as a parameter instead.
\n
You can create a client using this snippet:
\n
IEthClient client = new SequenceEthClient(Chain.Polygon);
\n","isPage":true,"text":"\nIn the context of SequenceEthereum, a Client is defined by the IEthClient interface.\nCreating a client requires a Chain. This will use our highly available and responsive Node Gateway service for your RPC requests; accessed using the API key from the Builder you've provided in your SequenceConfig scriptable object. If you prefer to use your own RPC URL, you can create a SequenceEthClient using a URL string as a parameter instead.\nYou can create a client using this snippet:\nIEthClient client = new SequenceEthClient(Chain.Polygon);\n","title":"Clients","titles":[]},"303":{"href":"/sdk/unity/Advanced/03-clients#methods","html":"\n
As your connection point to Ethereum nodes, there are a number of methods that can be performed by a client, these can be found in the IEthClient interface and are implemented by SequenceEthClient.
\n
Note: with the exception of BalanceAt (potentially), most users will not need to make use of these methods, but we have included them in our documentation for completeness.
\n","isPage":false,"text":"\nAs your connection point to Ethereum nodes, there are a number of methods that can be performed by a client, these can be found in the IEthClient interface and are implemented by SequenceEthClient.\nNote: with the exception of BalanceAt (potentially), most users will not need to make use of these methods, but we have included them in our documentation for completeness.\n","title":"Methods","titles":["Clients"]},"304":{"href":"/sdk/unity/Advanced/03-clients#balanceat","html":"\n
Used to get the gas currency balance of a given wallet at a given blockNumber (in hexadecimal format provided as a string)
\n
BigIntegar balance = await client.BalanceAt(wallet.GetAddress()); // By default, if no blockNumber string is provided, check the latest block\nBigIntegar balance = await client.BalanceAt(wallet.GetAddress(), blockNumber);
\n
Note: there are two special values for blockNumber. "earliest" will get the balance at the earliest block on the chain. "latest" will get the balance at the latest block on the chain and is the default parameter when none is provided. Otherwise, you'll want to provide the blockNumber string in hexadecimal format.
\nUnless you really want to get into the weeds with how things work, it is HIGHLY recommended to move on to the next page of the documentation at this point\n","isPage":false,"text":"\nUsed to get the gas currency balance of a given wallet at a given blockNumber (in hexadecimal format provided as a string)\nBigIntegar balance = await client.BalanceAt(wallet.GetAddress()); // By default, if no blockNumber string is provided, check the latest block\nBigIntegar balance = await client.BalanceAt(wallet.GetAddress(), blockNumber);\nNote: there are two special values for blockNumber. "earliest" will get the balance at the earliest block on the chain. "latest" will get the balance at the latest block on the chain and is the default parameter when none is provided. Otherwise, you'll want to provide the blockNumber string in hexadecimal format.\nUnless you really want to get into the weeds with how things work, it is HIGHLY recommended to move on to the next page of the documentation at this point\n","title":"BalanceAt","titles":["Clients","Methods"]},"305":{"href":"/sdk/unity/Advanced/03-clients#blockbynumber","html":"\n
Used to get the Block with a specific block number.
Note: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"
\n","isPage":false,"text":"\nUsed to get the Block with a specific block number.\nBlock block = await client.BlockByNumber(blockNumber);\nNote: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"\n","title":"BlockByNumber","titles":["Clients","Methods"]},"306":{"href":"/sdk/unity/Advanced/03-clients#blockbyhash","html":"\n
Used to get the Block by a specified block hash (string)
\n","isPage":false,"text":"\nUsed to get the Block by a specified block hash (string)\nBlock block = await client.BlockByHash(blockHash);\n","title":"BlockByHash","titles":["Clients","Methods"]},"307":{"href":"/sdk/unity/Advanced/03-clients#blocknumber","html":"\n
Used to get the most recent block number in hexadecimal format
\n
string blockNumber = await client.BlockNumber();
\n","isPage":false,"text":"\nUsed to get the most recent block number in hexadecimal format\nstring blockNumber = await client.BlockNumber();\n","title":"BlockNumber","titles":["Clients","Methods"]},"308":{"href":"/sdk/unity/Advanced/03-clients#blockrange","html":"\n
Used to get a List<Block> from the blocks in a range specified by blockNumbers
Note: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"
\n","isPage":false,"text":"\nUsed to get a List<Block> from the blocks in a range specified by blockNumbers\nList<Block> blockRange = await client.BlockRange(startingBlockNumber, endingBlockNumber);\nNote: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"\n","title":"BlockRange","titles":["Clients","Methods"]},"309":{"href":"/sdk/unity/Advanced/03-clients#chainid","html":"\n
Used to get the chain id in hexadecimal format for the chain the client is connected to
\n
string chainId = await client.ChainID();
\n","isPage":false,"text":"\nUsed to get the chain id in hexadecimal format for the chain the client is connected to\nstring chainId = await client.ChainID();\n","title":"ChainID","titles":["Clients","Methods"]},"310":{"href":"/sdk/unity/Advanced/03-clients#codeat","html":"\n
Used to get the bytecode for a smart contract at a given address in hexadecimal format at a specified blockNumber
Note: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"
\n","isPage":false,"text":"\nUsed to get the bytecode for a smart contract at a given address in hexadecimal format at a specified blockNumber\nstring code = await client.CodeAt(contractAddress, blockNumber);\nNote: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"\n","title":"CodeAt","titles":["Clients","Methods"]},"311":{"href":"/sdk/unity/Advanced/03-clients#estimategas","html":"\n
Given a TransactionCall estimate the amount of gas required for the transaction
\n
BigIntegar gas = await client.EstimateGas(transactionCall);
\n","isPage":false,"text":"\nGiven a TransactionCall estimate the amount of gas required for the transaction\nBigIntegar gas = await client.EstimateGas(transactionCall);\n","title":"EstimateGas","titles":["Clients","Methods"]},"312":{"href":"/sdk/unity/Advanced/03-clients#feehistory","html":"\n
Get a FeeHistoryResult for gas fees paid blockCount blocks since newestBlock (blockNumber)
\n
FeeHistoryResult feeHistory = await client.FeeHistory(blockCount, newestBlock, new int[] { });
\n
Note: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"
\n","isPage":false,"text":"\nGet a FeeHistoryResult for gas fees paid blockCount blocks since newestBlock (blockNumber)\nFeeHistoryResult feeHistory = await client.FeeHistory(blockCount, newestBlock, new int[] { });\nNote: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"\n","title":"FeeHistory","titles":["Clients","Methods"]},"313":{"href":"/sdk/unity/Advanced/03-clients#networkid","html":"\n
Used to get the chain id in integer format (as string) for the chain the client is connected to
\n
string networkId = await client.NetworkId();
\n","isPage":false,"text":"\nUsed to get the chain id in integer format (as string) for the chain the client is connected to\nstring networkId = await client.NetworkId();\n","title":"NetworkId","titles":["Clients","Methods"]},"314":{"href":"/sdk/unity/Advanced/03-clients#nonceat","html":"\n
Used to get the recommended nonce for a given Address at a given blockNumber (defaults to "latest")
Note: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"
\n","isPage":false,"text":"\nUsed to get the recommended nonce for a given Address at a given blockNumber (defaults to "latest")\nBigInteger nonce = await client.NonceAt(wallet.GetAddress()); // Nonce at latest\nBigIntegar nonce = await client.NonceAt(wallet.GetAddress(), blockNumber);\nNote: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"\n","title":"NonceAt","titles":["Clients","Methods"]},"315":{"href":"/sdk/unity/Advanced/03-clients#sendrawtransaction","html":"\n
Given a signed transaction string, submit the transaction to the network and return a transaction hash
\n","isPage":false,"text":"\nGiven a signed transaction string, submit the transaction to the network and return a transaction hash\nstring transactionHash = await client.SendRawTransaction(signedTransactionString);\n","title":"SendRawTransaction","titles":["Clients","Methods"]},"316":{"href":"/sdk/unity/Advanced/03-clients#suggestgasprice","html":"\n
\n","isPage":false,"text":"\nUsed to get a suggested gas price\nBigIntegar gasPrice = await client.SuggestGasPrice();\n","title":"SuggestGasPrice","titles":["Clients","Methods"]},"317":{"href":"/sdk/unity/Advanced/03-clients#suggestgastipcap","html":"\n
Used to get the max suggested priority fee for gas
\n","isPage":false,"text":"\nUsed to get the max suggested priority fee for gas\nBigIntegar gasTipCap = await client.SuggestGasTipCap();\n","title":"SuggestGasTipCap","titles":["Clients","Methods"]},"318":{"href":"/sdk/unity/Advanced/03-clients#transactionbyhash","html":"\n
\n","isPage":false,"text":"\nUsed to get a Transaction by transaction hash\nTransaction transaction = await client.TransactionByHash(transactionHash);\n","title":"TransactionByHash","titles":["Clients","Methods"]},"319":{"href":"/sdk/unity/Advanced/03-clients#transactioncount","html":"\n
Used to get the number of transactions in a block by block hash
\n","isPage":false,"text":"\nUsed to get the number of transactions in a block by block hash\nBigIntegar transactionCount = await client.TransactionCount(blockHash);\n","title":"TransactionCount","titles":["Clients","Methods"]},"320":{"href":"/sdk/unity/Advanced/03-clients#waitfortransactionreceipt","html":"\n
Provide a transaction hash in order to wait for and return the TransactionReceipt
","isPage":false,"text":"\nProvide a transaction hash in order to wait for and return the TransactionReceipt\nTransactionReceipt receipt = await client.WaitForTransactionReceipt(transactionHash);","title":"WaitForTransactionReceipt","titles":["Clients","Methods"]},"321":{"href":"/sdk/unity/Advanced/04-transfers#transfers","html":"\n
In order to transfer ETH (or the gas currency for your network), it is recommended to use TranferEth.CreateTransaction
Behind the scenes, this will create a GasLimitEstimator which will construct the transaction for you - including determining the appropriate gasPrice, gasLimit, and nonce.
","isPage":true,"text":"\nIn order to transfer ETH (or the gas currency for your network), it is recommended to use TranferEth.CreateTransaction\nEthTransaction transferTransaction = await TransferEth.CreateTransaction(client, wallet, recipientAddress, DecimalNormalizer.Normalize(1));\nTransactionReceipt receipt = await wallet.SendTransactionAndWaitForReceipt(client, transferTransaction);\nBehind the scenes, this will create a GasLimitEstimator which will construct the transaction for you - including determining the appropriate gasPrice, gasLimit, and nonce.","title":"Transfers","titles":[]},"322":{"href":"/sdk/unity/Advanced/05-contracts#contracts","html":"\n
Creating a Contract object for an already deployed contract is rather straightforward.
\n
Contract contract = new Contract(contractAddress, abi);
\n
While it is not strictly required, it is highly recommended to provide the contract ABI as a string when creating a contract object. Failure to do so will make it so that you cannot fully take advantage of our ABI encoding and decoding.\nIf you do chose to go down this route, you will need to provide the entire function signature (function name + parameter types in brackets - e.g. transfer(address,uint256) for the ERC20 transfer method) when calling a function or querying the contract and you will only ever receive a string as a response to queries.
\n","isPage":true,"text":"\nCreating a Contract object for an already deployed contract is rather straightforward.\nContract contract = new Contract(contractAddress, abi);\nWhile it is not strictly required, it is highly recommended to provide the contract ABI as a string when creating a contract object. Failure to do so will make it so that you cannot fully take advantage of our ABI encoding and decoding.\nIf you do chose to go down this route, you will need to provide the entire function signature (function name + parameter types in brackets - e.g. transfer(address,uint256) for the ERC20 transfer method) when calling a function or querying the contract and you will only ever receive a string as a response to queries.\n","title":"Contracts","titles":[]},"323":{"href":"/sdk/unity/Advanced/05-contracts#calling-smart-contract-functions","html":"\n
To call a smart contract, you'll use the CallFunction method to create a CallContractFunction object which will determine the appropriate gasPrice, gasLimit, nonce, and data to include in a newly assembled EthTransaction when provided with a client and a ContractCall object to the Create async Task
\n
An example of calling a smart contract would look like:
\n
Contract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case\nTransactionReceipt receipt = await erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger).SendTransactionMethodAndWaitForReceipt(wallet, client);
\n
Note: if you don't want to wait for the receipt, you can use SendTransactionMethod instead.
\n
Alternatively, if you want to simply create the EthTransaction and send it at a later time, you can use the CallContractFunction object from CallFunction directly.
\n
Contract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case\nEthTransaction transaction = await erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger).Create(client, new ContractCall(wallet.GetAddress()));\nTransactionReceipt receipt = await wallet.SendTransactionAndWaitForReceipt(client, transaction);\n\n// or \nCallContractFunction transactionCreator = erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger);\nEthTransaction transaction = await transactionCreator.Create(client, new ContractCall(wallet.GetAddress()));\nTransactionReceipt receipt = await wallet.SendTransactionAndWaitForReceipt(client, transaction);\n\n// or \nCallContractFunction transactionCreator = erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger);\nTransactionReceipt receipt = await transactionCreator.SendTransactionMethodAndWaitForReceipt(wallet, client);
\n
You'll notice that the CallFunction method accepts an arbitrary number of arguments. You'll want to provide the arguments in the order they are provided in the ABI/function signature.
\n","isPage":false,"text":"\nTo call a smart contract, you'll use the CallFunction method to create a CallContractFunction object which will determine the appropriate gasPrice, gasLimit, nonce, and data to include in a newly assembled EthTransaction when provided with a client and a ContractCall object to the Create async Task\nAn example of calling a smart contract would look like:\nContract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case\nTransactionReceipt receipt = await erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger).SendTransactionMethodAndWaitForReceipt(wallet, client);\nNote: if you don't want to wait for the receipt, you can use SendTransactionMethod instead.\nAlternatively, if you want to simply create the EthTransaction and send it at a later time, you can use the CallContractFunction object from CallFunction directly.\nContract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case\nEthTransaction transaction = await erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger).Create(client, new ContractCall(wallet.GetAddress()));\nTransactionReceipt receipt = await wallet.SendTransactionAndWaitForReceipt(client, transaction);\n\n// or \nCallContractFunction transactionCreator = erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger);\nEthTransaction transaction = await transactionCreator.Create(client, new ContractCall(wallet.GetAddress()));\nTransactionReceipt receipt = await wallet.SendTransactionAndWaitForReceipt(client, transaction);\n\n// or \nCallContractFunction transactionCreator = erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger);\nTransactionReceipt receipt = await transactionCreator.SendTransactionMethodAndWaitForReceipt(wallet, client);\nYou'll notice that the CallFunction method accepts an arbitrary number of arguments. You'll want to provide the arguments in the order they are provided in the ABI/function signature.\n","title":"Calling Smart Contract Functions","titles":["Contracts"]},"324":{"href":"/sdk/unity/Advanced/05-contracts#understanding-data-type-mappings","html":"\n
When interacting with smart contracts, it is important to understand how EVM datatypes are mapped to C# datatypes in the SequenceEthereum library.
If you were to, for example, provide a string where the ABI expects an Integer, you will receive an exception, even if that string could be converted into an integer.
\n","isPage":false,"text":"\nWhen interacting with smart contracts, it is important to understand how EVM datatypes are mapped to C# datatypes in the SequenceEthereum library.\nbool -> bool\nIntegers (int, uint, int256, uint8, ...) -> BigInteger\naddress -> Address or string\nstring -> string\nFixed bytes (bytesN for any N value) -> FixedByte\nbytes -> byte[]\nIf you were to, for example, provide a string where the ABI expects an Integer, you will receive an exception, even if that string could be converted into an integer.\n","title":"Understanding data type mappings","titles":["Contracts"]},"325":{"href":"/sdk/unity/Advanced/05-contracts#querying-contracts","html":"\n
To query a smart contract (read data from it), you'll use the SendQuery<T> method to query the contract and return the result as type T (if possible).\nAn example of querying a smart contract would look like:
\n
Contract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case\nBigIntegar balance = await erc20Contract.SendQuery<BigIntegar>(client, "balanceOf", address);
\n
Alternatively, if you wish to simply construct the query and send it at a later time, you can use QueryContract<T> to create a delegate.
\n
Contract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case\nQueryContractMessageSender<BigIntegar> balanceQuery = erc20Contract.QueryContract<BigIntegar>("balanceOf", address);\nBigIntegar balance = await balanceQuery(client);\n// or\nBigIntegar balance = await balanceQuery.SendQuery(client);
\n","isPage":false,"text":"\nTo query a smart contract (read data from it), you'll use the SendQuery<T> method to query the contract and return the result as type T (if possible).\nAn example of querying a smart contract would look like:\nContract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case\nBigIntegar balance = await erc20Contract.SendQuery<BigIntegar>(client, "balanceOf", address);\nAlternatively, if you wish to simply construct the query and send it at a later time, you can use QueryContract<T> to create a delegate.\nContract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case\nQueryContractMessageSender<BigIntegar> balanceQuery = erc20Contract.QueryContract<BigIntegar>("balanceOf", address);\nBigIntegar balance = await balanceQuery(client);\n// or\nBigIntegar balance = await balanceQuery.SendQuery(client);\n","title":"Querying Contracts","titles":["Contracts"]},"326":{"href":"/sdk/unity/Advanced/05-contracts#deploying-contracts","html":"\n
If you want to deploy a contract, you can use the ContractDeployer
","isPage":false,"text":"\nIf you want to deploy a contract, you can use the ContractDeployer\nContractDeploymentResult deploymentResult = await ContractDeployer.Deploy(client, wallet, contractBytecodeAsString);\nstring newlyDeployedContractAddress = deploymentResult.Receipt.contractAddress;","title":"Deploying Contracts","titles":["Contracts"]},"327":{"href":"/sdk/unity/Advanced/06-tokens#tokens","html":"\n
Since their use is so ubiquitous, we've provided ERC20, ERC721, and ERC1155 wrappers of the Contract class with pre-defined ABIs for your convenience. When interacting with tokens, it is recommended to use these.
\n
Any of these contract wrappers can be created via a standard constructor requiring only the contract address. For example:
\n
ERC20 erc20 = new ERC20(contractAddress);
\n
You may also provide your own ABI should you need to rewrite our default; however, doing so may require you to modify or rewrite the contract wrappers.
\n
An example of querying:
\n
string symbol = await erc20.Symbol(client);\nBigIntegar balance = await erc20.BalanceOf(client, address);
\n","isPage":true,"text":"\nSince their use is so ubiquitous, we've provided ERC20, ERC721, and ERC1155 wrappers of the Contract class with pre-defined ABIs for your convenience. When interacting with tokens, it is recommended to use these.\nAny of these contract wrappers can be created via a standard constructor requiring only the contract address. For example:\nERC20 erc20 = new ERC20(contractAddress);\nYou may also provide your own ABI should you need to rewrite our default; however, doing so may require you to modify or rewrite the contract wrappers.\nAn example of querying:\nstring symbol = await erc20.Symbol(client);\nBigIntegar balance = await erc20.BalanceOf(client, address);\nAn example of sending a transaction:\nTransactionReceipt receipt = await erc20.Mint(toAddress, DecimalNormalizer.NormalizeAsBigInteger(1)).SendTransactionMethodAndWaitForReceipt(wallet, client);\nAs a wrapper of Contract, you also have the option to not create the EthTransaction and send later on.\nCallContractFunction transactionCreator = erc20.Transfer(toAddress, DecimalNormalizer.NormalizeAsBigInteger(1));\nEthTransaction transaction = await transactionCreator.Create(client, new ContractCall(wallet.GetAddress()));\nTransactionReceipt receipt = await wallet.SendTransactionAndWaitForReceipt(client, transaction);\n","title":"Tokens","titles":[]},"328":{"href":"/sdk/unity/Advanced/06-tokens#bonus-ownable","html":"\n
Similar to with tokens, we have also provided an Ownable wrapper for your convenience as well which has a pre-defined ABI for methods implementing the Ownable interface.\nERC20, ERC721, and ERC1155 all inherit from this, but we encourage you to use Ownable whenever you wish to interact with the Ownable methods on any arbitrary contract for convenience and safety.
","isPage":false,"text":"\nSimilar to with tokens, we have also provided an Ownable wrapper for your convenience as well which has a pre-defined ABI for methods implementing the Ownable interface.\nERC20, ERC721, and ERC1155 all inherit from this, but we encourage you to use Ownable whenever you wish to interact with the Ownable methods on any arbitrary contract for convenience and safety.","title":"Bonus: Ownable","titles":[]},"329":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#how-to-manage-item-metadata-in-sequence-builder","html":"\n","isPage":true,"text":"\n","title":"How to Manage Item Metadata in Sequence Builder","titles":[]},"330":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#introduction","html":"\n
Following this guide, you can easily manage token metadata for your contract items in Sequence Builder, with a little help from Pinata for IPFS hosting.
\n","isPage":false,"text":"\nFollowing this guide, you can easily manage token metadata for your contract items in Sequence Builder, with a little help from Pinata for IPFS hosting.\n","title":"Introduction","titles":["How to Manage Item Metadata in Sequence Builder"]},"331":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-1-prepare-your-token-images-and-metadata","html":"\n
First things first, gather all your token images. For each token, you'll need a metadata file named id.json (like 1.json, 2.json, etc.). These files should look something like this at a minimum:
As you can guess, you can build from these basics. You could have your unique item attributes embedded in this token and generated on the fly.
\n","isPage":false,"text":"\nFirst things first, gather all your token images. For each token, you'll need a metadata file named id.json (like 1.json, 2.json, etc.). These files should look something like this at a minimum:\n{\n "name": "Token Name",\n "description": "Token Description",\n "image": "ipfs://"\n}\nAs you can guess, you can build from these basics. You could have your unique item attributes embedded in this token and generated on the fly.\n","title":"Step 1: Prepare Your Token Images and Metadata","titles":["How to Manage Item Metadata in Sequence Builder"]},"332":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-2-set-up-on-pinatacloud","html":"\n
Head over to Pinata.cloud and create an account. Upload each of your token images as separate files. Next, update the metadata JSON files with the ipfs address for each token. To do this, simply copy the CID (Content Identifier) for each file from Pinata and paste it after ipfs:// in your JSON files. It should look like this:
\n","isPage":false,"text":"\nHead over to Pinata.cloud and create an account. Upload each of your token images as separate files. Next, update the metadata JSON files with the ipfs address for each token. To do this, simply copy the CID (Content Identifier) for each file from Pinata and paste it after ipfs:// in your JSON files. It should look like this:\n{\n "name": "Token Name",\n "description": "Token Description",\n "image": "ipfs://QmdJzQExj2wnNY7pNNn4KauzckjH4vA5xhoxmmis919Ev3"\n}\n\n","title":"Step 2: Set Up on Pinata.cloud","titles":["How to Manage Item Metadata in Sequence Builder"]},"333":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-3-upload-your-metadata-files","html":"\n
Now, gather all your JSON metadata files into a single folder on your computer. Use Pinata's 'Upload > Folder' feature to upload this folder. Then, copy the CID for the entire folder.
\n
\n","isPage":false,"text":"\nNow, gather all your JSON metadata files into a single folder on your computer. Use Pinata's 'Upload > Folder' feature to upload this folder. Then, copy the CID for the entire folder.\n\n","title":"Step 3: Upload Your Metadata Files","titles":["How to Manage Item Metadata in Sequence Builder"]},"334":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-4-get-the-folder-url","html":"\n
Click on name of the folder you created on Pinata. This will open a new tab showing all your uploaded JSON files. Copy the URL of this folder.
\n
\n","isPage":false,"text":"\nClick on name of the folder you created on Pinata. This will open a new tab showing all your uploaded JSON files. Copy the URL of this folder.\n\n","title":"Step 4: Get the Folder URL","titles":["How to Manage Item Metadata in Sequence Builder"]},"335":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-5-set-up-on-sequence-builder","html":"\n
Navigate to Sequence Builder, set up your account, and create your project on the network of your choice. In the Contracts section, click on "Deploy New Contract".
\n
\n","isPage":false,"text":"\nNavigate to Sequence Builder, set up your account, and create your project on the network of your choice. In the Contracts section, click on "Deploy New Contract".\n\n","title":"Step 5: Set Up on Sequence Builder","titles":["How to Manage Item Metadata in Sequence Builder"]},"336":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-6-deploy-your-contract","html":"\n
Select "Web3 Game Item Collection (ERC-1155)" and name your contract. Sequence Builder will automatically deploy your contract on-chain.
\n
\n","isPage":false,"text":"\nSelect "Web3 Game Item Collection (ERC-1155)" and name your contract. Sequence Builder will automatically deploy your contract on-chain.\n\n","title":"Step 6: Deploy Your Contract","titles":["How to Manage Item Metadata in Sequence Builder"]},"337":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-7-move-to-contract-details","html":"\n
Once you sign the transaction, your contract is ready! Click on it to view the details screen.
\n
\n","isPage":false,"text":"\nOnce you sign the transaction, your contract is ready! Click on it to view the details screen.\n\n","title":"Step 7: Move to Contract Details","titles":["How to Manage Item Metadata in Sequence Builder"]},"338":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-8-update-contract-attributes","html":"\n
Navigate to the “Write Contract” section. This is where you can modify attributes of your freshly deployed ERC-1155 contract. Two methods are what you should focus on for now:
\n
\n
setBaseMetadataURI allows the creator to set the base metadata URL for this contract. You want this to point to the JSON files you’ve created, depending on NFT ID.
\n
mint mints one of your tokens and sends it to an address of your choosing.
\n
\n","isPage":false,"text":"\nNavigate to the “Write Contract” section. This is where you can modify attributes of your freshly deployed ERC-1155 contract. Two methods are what you should focus on for now:\n\nsetBaseMetadataURI allows the creator to set the base metadata URL for this contract. You want this to point to the JSON files you’ve created, depending on NFT ID.\nmint mints one of your tokens and sends it to an address of your choosing.\n\n","title":"Step 8: Update Contract Attributes","titles":["How to Manage Item Metadata in Sequence Builder"]},"339":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-9-set-the-base-metadata-uri","html":"\n
Scroll to setBaseMetadataURI, expand it, and under tokenBaseURI paste the URL for the JSON folder preview you got from Pinata earlier. It should look something like this:
Click “Write” and you will be prompted to sign again. This will modify the contract on chain to set the metadata base. Essentially any token ID you provide will be appended to this URL, along with the .json suffix. So if you mint token ID 123, it will look for tokenBaseURI + 123.json.
\n
\n","isPage":false,"text":"\nScroll to setBaseMetadataURI, expand it, and under tokenBaseURI paste the URL for the JSON folder preview you got from Pinata earlier. It should look something like this:\nhttps://azure-wooden-lemur-911.mypinata.cloud/ipfs/QmW5gvYGWb98GsN8VjTRWu4pLn6jryEXNxZKNWpPhVwtDm/\nClick “Write” and you will be prompted to sign again. This will modify the contract on chain to set the metadata base. Essentially any token ID you provide will be appended to this URL, along with the .json suffix. So if you mint token ID 123, it will look for tokenBaseURI + 123.json.\n\n","title":"Step 9: Set the Base Metadata URI","titles":["How to Manage Item Metadata in Sequence Builder"]},"340":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-10-minting-time","html":"\n
Finally, it's time to mint! Scroll up to mint, expand it, and fill in the details:
\n
\n
to (address): This is the address that the token will be sent to. Use your Sequence wallet address or any other valid address.
\n
tokenId (uint256): This is your token ID. As long as you have a tokenId.json file already uploaded to pinata.cloud under the folder, it will work.
\n
amount (uint256): The number of tokens to mint (usually 1).
\n
data (bytes): Enter 0x00 for this simple process.
\n
\n
\n","isPage":false,"text":"\nFinally, it's time to mint! Scroll up to mint, expand it, and fill in the details:\n\nto (address): This is the address that the token will be sent to. Use your Sequence wallet address or any other valid address.\ntokenId (uint256): This is your token ID. As long as you have a tokenId.json file already uploaded to pinata.cloud under the folder, it will work.\namount (uint256): The number of tokens to mint (usually 1).\ndata (bytes): Enter 0x00 for this simple process.\n\n\n","title":"Step 10: Minting Time","titles":["How to Manage Item Metadata in Sequence Builder"]},"341":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-11-finalize-and-admire","html":"\n
Click "Write" and sign the transaction. Congratulations, you've just minted a token! Head over to the "Tokens" section to see your minted tokens with their names and images.
\n
\n","isPage":false,"text":"\nClick "Write" and sign the transaction. Congratulations, you've just minted a token! Head over to the "Tokens" section to see your minted tokens with their names and images.\n\n","title":"Step 11: Finalize and Admire","titles":["How to Manage Item Metadata in Sequence Builder"]},"342":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-12-updating-metadata","html":"\n
If you make mistakes with the token metadata, you can always update it and then call the Sequence Metadata refresh endpoint to reload the specific tokens:
\n
curl -X GET "https://metadata.sequence.app/tokens/mumbai/0xb392c99d9f8e3e0b248e5c283818be5bf5cecca7/1/refresh"
\n
This is in the format: https://metadata.sequence.app/tokens/<chain-name>/<contract-address>/<token-id>/refresh
","isPage":false,"text":"\nIf you make mistakes with the token metadata, you can always update it and then call the Sequence Metadata refresh endpoint to reload the specific tokens:\ncurl -X GET "https://metadata.sequence.app/tokens/mumbai/0xb392c99d9f8e3e0b248e5c283818be5bf5cecca7/1/refresh"\nThis is in the format: https://metadata.sequence.app/tokens/<chain-name>/<contract-address>/<token-id>/refresh\nNow that you are ready to mint, you might want to read about how you can launch your own serverless endpoint for securely minting tokens.","title":"Step 12: Updating Metadata","titles":["How to Manage Item Metadata in Sequence Builder"]},"343":{"href":"/solutions/marketplaces/orderbook/02-quickstart#quickstart","html":"\n","isPage":true,"text":"\n","title":"Quickstart","titles":[]},"344":{"href":"/solutions/marketplaces/orderbook/02-quickstart#try-a-demo","html":"\n\n","isPage":false,"text":"\nCheck out our demo to see a custom marketplace in action.\n","title":"Try a Demo","titles":["Quickstart"]},"345":{"href":"/solutions/marketplaces/orderbook/02-quickstart#template","html":"\n\n","isPage":false,"text":"\nGet started quickly with a template leveraging our Marketplace API.\n","title":"Template","titles":["Quickstart"]},"346":{"href":"/solutions/marketplaces/orderbook/02-quickstart#try-an-api-call","html":"\n
Sequence Wallet allows users to purchase cryptocurrencies directly with their credit card and debit card via on-ramp providers. Currently Sequence supports 6 on-ramp providers;
Only providers that support the region the users are in will be displayed.
\n
\n
As a developer integrating the Sequence Wallet, you can choose which payment provider can be visible to users. You can also specify which token will be available to purchase via the on-ramp providers.
","isPage":true,"text":"\nSequence Wallet allows users to purchase cryptocurrencies directly with their credit card and debit card via on-ramp providers. Currently Sequence supports 6 on-ramp providers;\n\nMoonpay\nRamp\nUPI via Onmeta\nSardine\nPayTrie\n\nOnly providers that support the region the users are in will be displayed.\n\nAs a developer integrating the Sequence Wallet, you can choose which payment provider can be visible to users. You can also specify which token will be available to purchase via the on-ramp providers.\nTo learn more on how to configure the on-ramp options, see Sequence Connect Options.","title":"Fiat On-Ramps","titles":[]},"348":{"href":"/solutions/technical-references/wallet-contracts/01-why#why-smart-contracts-wallets","html":"\n
Ethereum wallets may take two different forms, Externally owned accounts (EOAs) or Smart Contract Wallets.\nThe Sequence wallet is implemented as a smart contract, which allows the system to provide additional security and functionality.
\n","isPage":true,"text":"\nEthereum wallets may take two different forms, Externally owned accounts (EOAs) or Smart Contract Wallets.\nThe Sequence wallet is implemented as a smart contract, which allows the system to provide additional security and functionality.\n","title":"Why smart contracts wallets?","titles":[]},"349":{"href":"/solutions/technical-references/wallet-contracts/01-why#externally-owned-accounts","html":"\n
Externally owned accounts are the most primitive form of wallet on Ethereum; EOAs are accounts composed of a single ECDSA key pair.
\n","isPage":false,"text":"\nExternally owned accounts are the most primitive form of wallet on Ethereum; EOAs are accounts composed of a single ECDSA key pair.\n","title":"Externally owned accounts","titles":["Why smart contracts wallets?"]},"350":{"href":"/solutions/technical-references/wallet-contracts/01-why#pros","html":"\n
\n
Simple to implement
\n
Cheap to use (in some scenarios)
\n
Easy to backup
\n
\n","isPage":false,"text":"\n\nSimple to implement\nCheap to use (in some scenarios)\nEasy to backup\n\n","title":"Pros","titles":["Why smart contracts wallets?","Externally owned accounts"]},"351":{"href":"/solutions/technical-references/wallet-contracts/01-why#popular-examples","html":"\n
Smart contract wallets are wallets that are implemented as smart contracts; it allows the wallets to implement arbitrary logic within the bounds of what's supported by the underlying virtual machine.\nBecause of this, these contracts can implement functionality that's not available for EOAs, and can also be upgraded if they are prepared to do so.
\n","isPage":false,"text":"\nSmart contract wallets are wallets that are implemented as smart contracts; it allows the wallets to implement arbitrary logic within the bounds of what's supported by the underlying virtual machine.\nBecause of this, these contracts can implement functionality that's not available for EOAs, and can also be upgraded if they are prepared to do so.\n","title":"Smart contract wallets","titles":["Why smart contracts wallets?"]},"353":{"href":"/solutions/technical-references/wallet-contracts/01-why#pros-1","html":"\n
Sequence Embedded Wallet (or Wallet-as-a-Service) enables the creation, management and usage of fully functional EVM compatible wallets. These wallets can be created on-demand for each user and allow you to integrate an application with an Ethereum compatible blockchain, while using familiar constructions like RPC APIs.
\n
Sequence Embedded Wallet offers real non-custodial wallets and the system guarantees that each created wallet can only be accessed with the consent of the owner of the wallet.
\n","isPage":true,"text":"\nSequence Embedded Wallet (or Wallet-as-a-Service) enables the creation, management and usage of fully functional EVM compatible wallets. These wallets can be created on-demand for each user and allow you to integrate an application with an Ethereum compatible blockchain, while using familiar constructions like RPC APIs.\nSequence Embedded Wallet offers real non-custodial wallets and the system guarantees that each created wallet can only be accessed with the consent of the owner of the wallet.\n","title":"Sequence Embedded Wallet","titles":[]},"356":{"href":"/solutions/wallets/embedded-wallet/01-overview#architecture-overview","html":"\n
Sequence Embedded Wallets are native smart contract multisigs, the configuration of the multisig can be seen as a 2/2, both of which are required to sign in order to operate them; each one of the signers protects the wallet from a different facet of possible threats.
\n","isPage":false,"text":"\nSequence Embedded Wallets are native smart contract multisigs, the configuration of the multisig can be seen as a 2/2, both of which are required to sign in order to operate them; each one of the signers protects the wallet from a different facet of possible threats.\n","title":"Architecture overview","titles":["Sequence Embedded Wallet"]},"357":{"href":"/solutions/wallets/embedded-wallet/01-overview#signer-1-sequence-auth","html":"\n
Sequence Auth provides a simple way to add account creation, login, session management, and wallet support to your app, enabling applications to provide traditional web experiences (e.g. social login, email login, etc.) while providing access to crypto wallets to interact with smart contracts.
\n
All user and session data is encrypted by a Hardware Security Module operated by a third party. This makes it protected from both external attackers and internal access by Sequence Team or anyone else. Nobody can access a user's wallet but the user themselves.
\n
You won't need to trust us, this is a guarantee you can verify yourself: this service is hosted in a cryptographically attested secure enclave on Amazon Nitro platform. And we offer publicly available independently audited source code, so you can rest assured that it hasn't been tampered with.
\n","isPage":false,"text":"\nSequence Auth provides a simple way to add account creation, login, session management, and wallet support to your app, enabling applications to provide traditional web experiences (e.g. social login, email login, etc.) while providing access to crypto wallets to interact with smart contracts.\nAll user and session data is encrypted by a Hardware Security Module operated by a third party. This makes it protected from both external attackers and internal access by Sequence Team or anyone else. Nobody can access a user's wallet but the user themselves.\nYou won't need to trust us, this is a guarantee you can verify yourself: this service is hosted in a cryptographically attested secure enclave on Amazon Nitro platform. And we offer publicly available independently audited source code, so you can rest assured that it hasn't been tampered with.\n","title":"Signer 1: Sequence Auth","titles":["Sequence Embedded Wallet","Architecture overview"]},"358":{"href":"/solutions/wallets/embedded-wallet/01-overview#signer-2-sequence-guard","html":"\n
Sequence Guard is a service hosted by Sequence and contains the other key of the wallets. It's meant to be another line of defense, verifying not only user's identity but also their intent. It achieves this in two different ways:
\n
1 - Limits and allowlists: you can (from the development dashboard) configure what kind of actions are allowed, this means that the guard will only sign transactions within these constraints. For example, you can define that only NFT contract X can be called, and the guard will enforce that no other transactions can take place.
\n
2 - Authenticating the user: the Sequence Guard will authenticate the user independently of the Sequence Auth, it performs this action either by using a 3rd party OAuth 2.0 id token (from Meta, Google, X, etc.) or by directly communicating with the user via email/phone number with an OTP code. The direct communication is not always required and, when it does happen, it's seamless and branded with your project details.
\n","isPage":false,"text":"\nSequence Guard is a service hosted by Sequence and contains the other key of the wallets. It's meant to be another line of defense, verifying not only user's identity but also their intent. It achieves this in two different ways:\n1 - Limits and allowlists: you can (from the development dashboard) configure what kind of actions are allowed, this means that the guard will only sign transactions within these constraints. For example, you can define that only NFT contract X can be called, and the guard will enforce that no other transactions can take place.\n2 - Authenticating the user: the Sequence Guard will authenticate the user independently of the Sequence Auth, it performs this action either by using a 3rd party OAuth 2.0 id token (from Meta, Google, X, etc.) or by directly communicating with the user via email/phone number with an OTP code. The direct communication is not always required and, when it does happen, it's seamless and branded with your project details.\n","title":"Signer 2: Sequence Guard","titles":["Sequence Embedded Wallet","Architecture overview"]},"359":{"href":"/solutions/wallets/embedded-wallet/01-overview#threat-model","html":"\n
With these safeguards in place wallets are safe against the following scenarios:
\n\n
\n
Sequence.app backend is compromised, or guard keys are leaked: in this scenario, the user's identity must still be verified by Sequence Auth.
\n
\n
\n
Sequence Auth is compromised: in this scenario the Sequence Guard protects the wallets, because it independently authenticates the user, an attacker in this scenario wouldn't be able to access any wallets.
\n
\n\n
The model also provides partial protection against the scenario:
\n\n
Partner frontend is compromised, or MITM on the partner side: If an attacker were to be able to vulnerate the frontend of the partner, it could gain access to wallets at the time of login, but it cannot gain access to wallets of users who are currently inactive. This means that recovery from such a scenario is possible, with limited damage.
\n","isPage":false,"text":"\nWith these safeguards in place wallets are safe against the following scenarios:\n\n\nSequence.app backend is compromised, or guard keys are leaked: in this scenario, the user's identity must still be verified by Sequence Auth.\n\n\nSequence Auth is compromised: in this scenario the Sequence Guard protects the wallets, because it independently authenticates the user, an attacker in this scenario wouldn't be able to access any wallets.\n\n\nThe model also provides partial protection against the scenario:\n\nPartner frontend is compromised, or MITM on the partner side: If an attacker were to be able to vulnerate the frontend of the partner, it could gain access to wallets at the time of login, but it cannot gain access to wallets of users who are currently inactive. This means that recovery from such a scenario is possible, with limited damage.\n","title":"Threat model","titles":["Sequence Embedded Wallet"]},"360":{"href":"/solutions/wallets/embedded-wallet/02-quickstart#quickstart","html":"\n","isPage":true,"text":"\n","title":"Quickstart","titles":[]},"361":{"href":"/solutions/wallets/embedded-wallet/02-quickstart#try-a-demo","html":"\n\n","isPage":false,"text":"\nTry out seamless UX of our embedded wallet at our demo\n","title":"Try a Demo","titles":["Quickstart"]},"362":{"href":"/solutions/wallets/embedded-wallet/02-quickstart#template","html":"\n\n","isPage":false,"text":"\nGet started quickly with a template leveraging our embedded wallet.\n","title":"Template","titles":["Quickstart"]},"363":{"href":"/solutions/wallets/embedded-wallet/02-quickstart#getting-started","html":"\n","isPage":false,"text":"\n","title":"Getting Started","titles":["Quickstart"]},"364":{"href":"/solutions/wallets/embedded-wallet/02-quickstart#sdk-installation","html":"\n
We provide TypeScript and Unity SDKs for the Embedded Wallet authentication system. You can install the TypeScript SDK with:
\n
pnpm install @0xsequence/waas
\n
For more information on the Unity Embedded Wallet SDK, please refer to the TODO add link Unity SDK documentation
\n","isPage":false,"text":"\nWe provide TypeScript and Unity SDKs for the Embedded Wallet authentication system. You can install the TypeScript SDK with:\npnpm install @0xsequence/waas\nFor more information on the Unity Embedded Wallet SDK, please refer to the TODO add link Unity SDK documentation\n","title":"SDK Installation","titles":["Quickstart","Getting Started"]},"365":{"href":"/solutions/wallets/embedded-wallet/02-quickstart#project-setup","html":"\n
Sequence Embedded Wallet is currently only available as a closed beta. To start using the Embedded Wallet SDKs, you'll need to contact the Sequence team and acquire API credentials. Once this is done, you will be provided with two keys:
\n
\n
Project access key
\n
Embedded Wallet configuration key
\n
\n","isPage":false,"text":"\nSequence Embedded Wallet is currently only available as a closed beta. To start using the Embedded Wallet SDKs, you'll need to contact the Sequence team and acquire API credentials. Once this is done, you will be provided with two keys:\n\nProject access key\nEmbedded Wallet configuration key\n\n","title":"Project Setup","titles":["Quickstart","Getting Started"]},"366":{"href":"/solutions/wallets/embedded-wallet/02-quickstart#library-setup","html":"\n
To start using Sequence Embedded Wallet SDK, you'll need to create a new instance of the waas class:
\n
import { SequenceWaaS } from "@0xsequence/waas";\n\nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);
\n
Note that the library is operational, but it can't be used to interact with any wallet until you have authenticated as a user.
","isPage":false,"text":"\nTo start using Sequence Embedded Wallet SDK, you'll need to create a new instance of the waas class:\nimport { SequenceWaaS } from "@0xsequence/waas";\n \nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\nNote that the library is operational, but it can't be used to interact with any wallet until you have authenticated as a user.","title":"Library Setup","titles":["Quickstart","Getting Started"]},"367":{"href":"/solutions/wallets/universal-wallet/02-quickstart#quickstart","html":"\n","isPage":true,"text":"\n","title":"Quickstart","titles":[]},"368":{"href":"/solutions/wallets/universal-wallet/02-quickstart#try-a-demo","html":"\n\n","isPage":false,"text":"\nTry out the Universal Wallet leveraging SequenceKit at our demo\n","title":"Try a Demo","titles":["Quickstart"]},"369":{"href":"/solutions/wallets/universal-wallet/02-quickstart#template","html":"\n\n","isPage":false,"text":"\nGet started quickly with a template using SequenceKit\n","title":"Template","titles":["Quickstart"]},"370":{"href":"/solutions/wallets/universal-wallet/02-quickstart#install","html":"\n
The sequence.js SDK is composed of several sub-packages combined into a single meta-package called 0xsequence.\nTo add the SDK to your project, add a dependency on 0xsequence to your package.json:
\n
npm install 0xsequence ethers
\n
or
\n
pnpm install 0xsequence ethers
\n
or
\n
yarn add 0xsequence ethers
\n
If you know that your project only requires specific sub-packages, you can also depend on those directly with\nnpm add @0xsequence/<sub-package name>.
\n
Your package.json should look something like this (actual version may vary):
\n","isPage":false,"text":"\nThe sequence.js SDK is composed of several sub-packages combined into a single meta-package called 0xsequence.\nTo add the SDK to your project, add a dependency on 0xsequence to your package.json:\nnpm install 0xsequence ethers\nor\npnpm install 0xsequence ethers\nor\nyarn add 0xsequence ethers\nIf you know that your project only requires specific sub-packages, you can also depend on those directly with\nnpm add @0xsequence/<sub-package name>.\nYour package.json should look something like this (actual version may vary):\n{\n "name": "my-dapp",\n ...\n "dependencies": {\n "0xsequence": "^1.0.0",\n "ethers": ^5.7.0"\n ...\n }\n}\n","title":"Install","titles":["Quickstart"]},"371":{"href":"/solutions/wallets/universal-wallet/02-quickstart#cdn-distribution-as-native-js","html":"\n
Optionally, 0xsequence can be installed as a JS script source (UMD distribution) via:
","isPage":false,"text":"\nOptionally, 0xsequence can be installed as a JS script source (UMD distribution) via:\n<script src="https://cdn.ethers.io/lib/ethers-5.7.umd.min.js"></script>\n<script src="https://unpkg.com/0xsequence@latest/dist/0xsequence.umd.min.js"></script>","title":"CDN distribution as native JS","titles":["Quickstart","Install",null]},"372":{"href":"/solutions/wallets/universal-wallet/04-sequence-kit#sequence-kit-seamlessly-integrate-web3-wallets-into-your-applications","html":"\n
Sequence Kit 🧰 is the ultimate toolkit for effortlessly integrating web3 wallets into your applications, providing your users with a smooth and secure onboarding experience. With our robust tools built on the popular wagmi library, unlock a realm of possibilities in the world of web3.
\n","isPage":true,"text":"\nSequence Kit 🧰 is the ultimate toolkit for effortlessly integrating web3 wallets into your applications, providing your users with a smooth and secure onboarding experience. With our robust tools built on the popular wagmi library, unlock a realm of possibilities in the world of web3.\n","title":"Sequence Kit: Seamlessly Integrate Web3 Wallets into Your Applications","titles":[]},"373":{"href":"/solutions/wallets/universal-wallet/04-sequence-kit#key-features","html":"\n
\n
\n
Universal Connections: Seamlessly connect via popular social logins such as Facebook, Google, Discord, and more! Your users will enjoy a smooth, secure onboarding process. 🔐🪪
\n
\n
\n
Web3 Wallet Integration: Effortlessly integrate with leading web3 wallets like WalletConnect and MetaMask. Unleash the power of blockchain with just a few clicks! 🦊 ⛓️
\n
\n
\n
Embedded Wallet Experience: Provide your users with a comprehensive embedded wallet, enabling them to manage their coins and collectibles all within your own application. 👛 🖼️ 🪙
\n
\n
\n
Explore the potential of Sequence Kit by trying out our demo!
\n","isPage":false,"text":"\n\n\nUniversal Connections: Seamlessly connect via popular social logins such as Facebook, Google, Discord, and more! Your users will enjoy a smooth, secure onboarding process. 🔐🪪\n\n\nWeb3 Wallet Integration: Effortlessly integrate with leading web3 wallets like WalletConnect and MetaMask. Unleash the power of blockchain with just a few clicks! 🦊 ⛓️\n\n\nEmbedded Wallet Experience: Provide your users with a comprehensive embedded wallet, enabling them to manage their coins and collectibles all within your own application. 👛 🖼️ 🪙\n\n\nExplore the potential of Sequence Kit by trying out our demo!\n","title":"Key Features","titles":["Sequence Kit: Seamlessly Integrate Web3 Wallets into Your Applications"]},"374":{"href":"/solutions/wallets/universal-wallet/04-sequence-kit#next-steps","html":"\n
Ready to integrate Sequence Kit into your application? Check out our Getting Started guide. If you're already familiar with Sequence Kit dive into the available configuration options or take a look at the checkout.
","isPage":false,"text":"\nReady to integrate Sequence Kit into your application? Check out our Getting Started guide. If you're already familiar with Sequence Kit dive into the available configuration options or take a look at the checkout.","title":"Next Steps","titles":[]},"375":{"href":"/solutions/wallets/universal-wallet/05-platforms#platforms","html":"\n","isPage":true,"text":"\n","title":"Platforms","titles":[]},"376":{"href":"/solutions/wallets/universal-wallet/05-platforms#web-wallet","html":"\n
Sequence works beautifully on all modern Web Browsers! Try it at https://sequence.app from any computer, phone or tablet.
\n","isPage":false,"text":"\nSequence works beautifully on all modern Web Browsers! Try it at https://sequence.app from any computer, phone or tablet.\nSee Build With Sequence to get started.\n","title":"Web Wallet","titles":["Platforms"]},"377":{"href":"/solutions/wallets/universal-wallet/05-platforms#mobile-wallet","html":"\n
Sequence works beautifully on your Mobile Web Browser! Try it at https://sequence.app from any phone or tablet.
\n
This means dapps which integrate the Sequence Wallet will automatically support users on all mobile devices,\nwhile using standard Ethereum web3 dapp-to-wallet communication. See Build With Sequence to get started.
\n","isPage":false,"text":"\nSequence works beautifully on your Mobile Web Browser! Try it at https://sequence.app from any phone or tablet.\nThis means dapps which integrate the Sequence Wallet will automatically support users on all mobile devices,\nwhile using standard Ethereum web3 dapp-to-wallet communication. See Build With Sequence to get started.\n","title":"Mobile Wallet","titles":["Platforms"]},"378":{"href":"/solutions/wallets/universal-wallet/05-platforms#browser-extension-wallet","html":"\n
Sequence Wallet allows users to purchase cryptocurrencies directly with their credit card and debit card via on-ramp providers. Currently Sequence supports 6 on-ramp providers;
Only providers that support the region the users are in will be displayed.
\n
\n
As a developer integrating the Sequence Wallet, you can choose which payment provider can be visible to users. You can also specify which token will be available to purchase via the on-ramp providers.
","isPage":true,"text":"\nSequence Wallet allows users to purchase cryptocurrencies directly with their credit card and debit card via on-ramp providers. Currently Sequence supports 6 on-ramp providers;\n\nMoonpay\nRamp\nUPI via Onmeta\nSardine\nPayTrie\nWyre (deprecated)\n\nOnly providers that support the region the users are in will be displayed.\n\nAs a developer integrating the Sequence Wallet, you can choose which payment provider can be visible to users. You can also specify which token will be available to purchase via the on-ramp providers.\nTo learn more on how to configure the on-ramp options, see Sequence Connect Options.","title":"Fiat On-Ramps","titles":[]},"380":{"href":"/solutions/wallets/universal-wallet/07-key-management#key-management","html":"\n
Each Sequence wallet can be controlled by multiple private keys, acting like a multisignature wallet. Users can either create a Sequence wallet using one of the supported social login options or create a wallet with a private key stored only on that device.
\n
The improved security compared to traditional blockchain wallet comes from the fact that multiple independent keys need to be compromised for a malicious actor to take control of a user’s wallet, instead of a single key. The philosophy is that the more independent private-keys the user adds to their wallet, the more secure their wallet becomes, even if each individual key is only moderately secure on their own.
\n","isPage":true,"text":"\nEach Sequence wallet can be controlled by multiple private keys, acting like a multisignature wallet. Users can either create a Sequence wallet using one of the supported social login options or create a wallet with a private key stored only on that device.\nThe improved security compared to traditional blockchain wallet comes from the fact that multiple independent keys need to be compromised for a malicious actor to take control of a user’s wallet, instead of a single key. The philosophy is that the more independent private-keys the user adds to their wallet, the more secure their wallet becomes, even if each individual key is only moderately secure on their own.\n","title":"Key Management","titles":[]},"381":{"href":"/solutions/wallets/universal-wallet/07-key-management#social-login-wallets","html":"\n
Sequence Wallet created with social logins are currently secured using three private keys: Session keys, a Guard key and a Torus key. The Session key and Torus key are both generated for the first time when a user creates their Sequence Wallet via social login or email authentication.\nAt least two of the three keys are needed to unlock an account. This means that if one of the three keys is lost or compromised, a user can use the two remaining keys to replace the lost/compromised key. For example, if a user lost their device containing their Session Key, they can unlock their Sequence Wallet account by email or social login for the Torus key combined with the Guard key. Once done, another session key is auto-generated and the user is back in their account with all 3 keys accessible again.
\n","isPage":false,"text":"\nSequence Wallet created with social logins are currently secured using three private keys: Session keys, a Guard key and a Torus key. The Session key and Torus key are both generated for the first time when a user creates their Sequence Wallet via social login or email authentication.\nAt least two of the three keys are needed to unlock an account. This means that if one of the three keys is lost or compromised, a user can use the two remaining keys to replace the lost/compromised key. For example, if a user lost their device containing their Session Key, they can unlock their Sequence Wallet account by email or social login for the Torus key combined with the Guard key. Once done, another session key is auto-generated and the user is back in their account with all 3 keys accessible again.\n","title":"Social Login Wallets","titles":["Key Management"]},"382":{"href":"/solutions/wallets/universal-wallet/07-key-management#session-keys","html":"\n
Session keys are stored in the browser's IndexedDB.\nUsers should be prudent in safeguarding their devices from unauthorized access since an attacker with access to their IndexedDB effectively has control of their session key.
\n","isPage":false,"text":"\nSession keys are stored in the browser's IndexedDB.\nUsers should be prudent in safeguarding their devices from unauthorized access since an attacker with access to their IndexedDB effectively has control of their session key.\n","title":"Session Keys","titles":["Key Management","Social Login Wallets"]},"383":{"href":"/solutions/wallets/universal-wallet/07-key-management#guard-key","html":"\n
A Guard key is a key owned by Horizon. This key allows Horizon to help users that lost their Session key and can require additional information from the user in case of suspicious activity, if the user wants this additional protection. This key would be compromised if a malicious actor took control over Horizon servers hosting the Guard key.
\n","isPage":false,"text":"\nA Guard key is a key owned by Horizon. This key allows Horizon to help users that lost their Session key and can require additional information from the user in case of suspicious activity, if the user wants this additional protection. This key would be compromised if a malicious actor took control over Horizon servers hosting the Guard key.\n","title":"Guard Key","titles":["Key Management","Social Login Wallets"]},"384":{"href":"/solutions/wallets/universal-wallet/07-key-management#torus-key","html":"\n
A Torus key is a key generated by the Torus network, and is generated using a user’s email or social login credentials such as Google or AppleID. Torus uses threshold cryptography to ensure that only the user can access their private key, making these keys non-custodial. A Torus key would be compromised if a malicious actor had control over the social account or email a user used to generate their Torus key. All Torus keys could be compromised if the Torus network itself was compromised.
\n
:::info DEFAULTS + CUSTOMIZATION
\n
While this is the default setup for new Sequence Wallets, we intend to add the ability for users to add, remove and replace the keys controlling their wallet such that users can choose their preference in terms of security and user experience tradeoff. Even the Guard key will be able to be removed. Security tips and recommendations will be added to ensure users are well informed of the risks and how to protect themselves against them.
\n
:::
","isPage":false,"text":"\nA Torus key is a key generated by the Torus network, and is generated using a user’s email or social login credentials such as Google or AppleID. Torus uses threshold cryptography to ensure that only the user can access their private key, making these keys non-custodial. A Torus key would be compromised if a malicious actor had control over the social account or email a user used to generate their Torus key. All Torus keys could be compromised if the Torus network itself was compromised.\n:::info DEFAULTS + CUSTOMIZATION\nWhile this is the default setup for new Sequence Wallets, we intend to add the ability for users to add, remove and replace the keys controlling their wallet such that users can choose their preference in terms of security and user experience tradeoff. Even the Guard key will be able to be removed. Security tips and recommendations will be added to ensure users are well informed of the risks and how to protect themselves against them.\n:::","title":"Torus Key","titles":["Key Management","Social Login Wallets"]},"385":{"href":"/solutions/marketplaces/orderbook/examples/05-get-user-activities#getuseractivities","html":"\n
Retrieve activity data for a specific user, including orders and trades.
\n
\n
Request: POST /api/Marketplace/GetUserActivities
\n
Content-Type: application/json
\n
Body (in JSON):\n
\n
orderbookContractAddress (string) -- the address of the protocol contract.
\n
collectionAddress (string) -- the address of the NFT collection.
\n
currencyAddresses (string[]) -- an array of currency contract addresses.
\n
userAddress (string) -- the address of the user whose activities are being queried.
\n
tokenIDs (string[]) -- an array of token IDs to filter the activities by.
\n
\n
\n
Response (in JSON):\n
\n
page\n
\n
page (i32) -- number of the page
\n
pageSize (i32) -- number of orders on the page
\n
more (bool) -- if there are more orders
\n
\n
\n
orders (OrderbookOrder[])\n[\n
\n
orderId (string) -- order id
\n
tokenContract (string) -- the collection contract
\n
tokenId (string) -- the tokenId of the collection in the order
\n
isListing (bool) -- is true if it's a listing for sale, or false if it's an offer
\n
quantity (string) -- the number of tokens the order is for
\n
quantityRemaining (string) -- the number of tokens after the order
\n
currencyAddress (string) -- the currency the token is trading in
\n
pricePerToken (string) -- the price per token
\n
expiry (string) -- the expiry of when the order is no longer valid
\n
orderStatus (OrderStatus) -- the status of the order as an enum fom "OPEN", "CLOSED", "CANCELLED"
\n
createdBy (string) -- the address the order was created by
\n
createdAt (uint64) -- the time the order was created
\n
orderbookContractAddress (string) -- the orderbook contract address\n]
\n
\n
\n
\n
\n
\nExample: GetUserActivities for a user with specific token IDs\n
// Works in both a Webapp (browser) or Node.js:\nimport fetch from "cross-fetch";\n\n(async () => {\n const res = await fetch(\n "https://dev-marketplace-api.sequence.app/arbitrum-sepolia/rpc/Marketplace/GetUserActivities",\n {\n method: "POST",\n headers: {\n "Content-Type": "application/json",\n },\n body: JSON.stringify({\n "orderbookContractAddress": "0xB537a160472183f2150d42EB1c3DD6684A55f74c",\n "collectionAddress": "0x1693ffc74edbb50d6138517fe5cd64fd1c917709",\n "currencyAddresses": [\n "0xa9c88358862211870db6f18bc9b3f6e4f8b3eae7"\n ],\n "userAddress": "0xC2Be9CF6D9ee4fd211f88620760e829792659b16",\n "tokenIDs": ["1"]\n }),\n }\n );\n\n console.log("res", await res.json());\n})();
Please contact our team for assistance with integrations to another target.
","isPage":true,"text":"\nRetrieve activity data for a specific user, including orders and trades.\n\nRequest: POST /api/Marketplace/GetUserActivities\nContent-Type: application/json\nBody (in JSON):\n\norderbookContractAddress (string) -- the address of the protocol contract.\ncollectionAddress (string) -- the address of the NFT collection.\ncurrencyAddresses (string[]) -- an array of currency contract addresses.\nuserAddress (string) -- the address of the user whose activities are being queried.\ntokenIDs (string[]) -- an array of token IDs to filter the activities by.\n\n\nResponse (in JSON):\n\npage\n\npage (i32) -- number of the page\npageSize (i32) -- number of orders on the page\nmore (bool) -- if there are more orders\n\n\norders (OrderbookOrder[])\n[\n\norderId (string) -- order id\ntokenContract (string) -- the collection contract\ntokenId (string) -- the tokenId of the collection in the order\nisListing (bool) -- is true if it's a listing for sale, or false if it's an offer\nquantity (string) -- the number of tokens the order is for\nquantityRemaining (string) -- the number of tokens after the order\ncurrencyAddress (string) -- the currency the token is trading in\npricePerToken (string) -- the price per token\nexpiry (string) -- the expiry of when the order is no longer valid\norderStatus (OrderStatus) -- the status of the order as an enum fom "OPEN", "CLOSED", "CANCELLED"\ncreatedBy (string) -- the address the order was created by\ncreatedAt (uint64) -- the time the order was created\norderbookContractAddress (string) -- the orderbook contract address\n]\n\n\n\n\n\nExample: GetUserActivities for a user with specific token IDs\ncurl -X POST -H "Content-Type: application/json" https://dev-marketplace-api.sequence.app/arbitrum-sepolia/rpc/Marketplace/GetUserActivities -d '{\n "orderbookContractAddress": "0xB537a160472183f2150d42EB1c3DD6684A55f74c",\n "collectionAddress": "0x1693ffc74edbb50d6138517fe5cd64fd1c917709",\n "currencyAddresses": [\n "0xa9c88358862211870db6f18bc9b3f6e4f8b3eae7"\n ],\n "userAddress": "0xC2Be9CF6D9ee4fd211f88620760e829792659b16",\n "tokenIDs": ["1"]\n}'// Works in both a Webapp (browser) or Node.js:\nimport fetch from "cross-fetch";\n \n(async () => {\n const res = await fetch(\n "https://dev-marketplace-api.sequence.app/arbitrum-sepolia/rpc/Marketplace/GetUserActivities",\n {\n method: "POST",\n headers: {\n "Content-Type": "application/json",\n },\n body: JSON.stringify({\n "orderbookContractAddress": "0xB537a160472183f2150d42EB1c3DD6684A55f74c",\n "collectionAddress": "0x1693ffc74edbb50d6138517fe5cd64fd1c917709",\n "currencyAddresses": [\n "0xa9c88358862211870db6f18bc9b3f6e4f8b3eae7"\n ],\n "userAddress": "0xC2Be9CF6D9ee4fd211f88620760e829792659b16",\n "tokenIDs": ["1"]\n }),\n }\n );\n \n console.log("res", await res.json());\n})(); Please contact our team for assistance with integrations to another target.","title":"GetUserActivities","titles":[null]},"386":{"href":"/solutions/marketplaces/orderbook/examples/05-get-user-activities#example-implementation","html":"
With the use of the GetUserActivities api developers can build custom and personalized social or tracking experiences to follow certain users in various interfaces.
","isPage":false,"text":"With the use of the GetUserActivities api developers can build custom and personalized social or tracking experiences to follow certain users in various interfaces.","title":"Example implementation","titles":[null,"GetUserActivities"]},"387":{"href":"/solutions/technical-references/internals/v1/04-wallet-configuration#wallet-configuration","html":"\n
Every Sequence wallet has a configuration defined by a threshold and a list of signers with their corresponding weights.
\n","isPage":true,"text":"\nEvery Sequence wallet has a configuration defined by a threshold and a list of signers with their corresponding weights.\n","title":"Wallet Configuration","titles":[]},"388":{"href":"/solutions/technical-references/internals/v1/04-wallet-configuration#configuration-layout","html":"\n
Name
Type
Range
Description
Threshold
uint16
1 - 65535
Required combined total "weight" of signers for a signature to be considered valid.
Signers
signer[]
unlimited - bounded by gas
List of signers that with their corresponding "weight"s.
\n","isPage":false,"text":"\nNameTypeRangeDescriptionThresholduint161 - 65535Required combined total "weight" of signers for a signature to be considered valid.Signerssigner[]unlimited - bounded by gasList of signers that with their corresponding "weight"s.\n","title":"Configuration layout","titles":["Wallet Configuration"]},"389":{"href":"/solutions/technical-references/internals/v1/04-wallet-configuration#signer-layout","html":"\n
Name
Type
Range
Description
"weight"
uint8
0 - 255
"weight" of every signature of the signer.
"address"
"address"
--
"address" of the signer, it may be an EOA or another smart contract wallet with EIP-1271 support.
\n","isPage":false,"text":"\nNameTypeRangeDescription"weight"uint80 - 255"weight" of every signature of the signer."address""address"--"address" of the signer, it may be an EOA or another smart contract wallet with EIP-1271 support.\n","title":"Signer layout","titles":["Wallet Configuration","Configuration layout"]},"390":{"href":"/solutions/technical-references/internals/v1/04-wallet-configuration#example","html":"\n
Any combination of signers with a combined weight under the threshold is considered invalid; any additional signers above the threshold are ignored.
\n","isPage":false,"text":"\n- 0x4fbf69aa2a75f9942a768dc8da7804ec965f7bea & 0x596af90cecdbf9a768886e771178fd5561dd27ab - combined weight of 2 + 3 = 5\n- 0x6192e0fdcd868b3de01c7fbc0ad98baebd7330c1 & 0x596af90cecdbf9a768886e771178fd5561dd27ab - combined weight of 2 + 3 = 5\n- 0x4fbf69aa2a75f9942a768dc8da7804ec965f7bea, 0x6192e0fdcd868b3de01c7fbc0ad98baebd7330c1 & 0xec9a7204a43d3f4a82c84fde92d25bfc9110981e - combined weight of 2 + 2 + 1 = 5\nAny combination of signers with a combined weight under the threshold is considered invalid; any additional signers above the threshold are ignored.\n","title":"The valid combinations of signers are:","titles":["Wallet Configuration","Configuration layout","Signer layout"]},"392":{"href":"/solutions/technical-references/internals/v1/04-wallet-configuration#configuration-hash---imagehash","html":"\n
The configuration is never stored directly on the contract, but instead is hashed and checked against every time a signature is validated. This allows the wallet contracts to reduce the usage of storage and therefore the gas cost.
\n
Wallets that never have been updated don't store the imageHash directly, instead the imageHash is used as the salt during the contract creation, and signatures are validated against the address of the wallet.
\n","isPage":false,"text":"\nThe configuration is never stored directly on the contract, but instead is hashed and checked against every time a signature is validated. This allows the wallet contracts to reduce the usage of storage and therefore the gas cost.\nWallets that never have been updated don't store the imageHash directly, instead the imageHash is used as the salt during the contract creation, and signatures are validated against the address of the wallet.\n","title":"Configuration hash - ImageHash","titles":["Wallet Configuration","Configuration layout"]},"393":{"href":"/solutions/technical-references/internals/v1/04-wallet-configuration#compute-image-hash","html":"\n
The initial wallet configuration determines the address of the wallet, subsequent updates don't change the address.
\n
The wallet address can be computed using the imageHash, the factory and mainModule of the wallet.
\n","isPage":false,"text":"\nThe initial wallet configuration determines the address of the wallet, subsequent updates don't change the address.\nThe wallet address can be computed using the imageHash, the factory and mainModule of the wallet.\n","title":"Initial wallet configuration","titles":["Wallet Configuration"]},"395":{"href":"/solutions/technical-references/internals/v1/04-wallet-configuration#compute-wallet-address","html":"\n
// The code of the wallet proxy contract\nconst WalletProxyBytecode =\n"0x603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3";\n\n// These values are defined by the wallet context\n// they must be known in order to validate the counter-factual wallet imageHash\nconst factory = "0xf9D09D634Fb818b05149329C1dcCFAeA53639d96";\nconst mainModule = "0xd01F11855bCcb95f88D7A48492F66410d4637313";\n\n// Append the `mainModule` to the `WalletProxyBytecode`\n// this completed the creation code of the proxy contract\n// used for computing the wallet address as defined by the CREATE2 opcode\nconst codeHash = ethers.utils.keccak256(\nethers.utils.solidityPack(\n["bytes", "bytes32"],\n[WalletContractBytecode, ethers.utils.hexZeroPad(mainModule, 32)]\n)\n);\n\n// Compute the wallet address\nconst hash = ethers.utils.keccak256(\nethers.utils.solidityPack(\n["bytes1", "address", "bytes32", "bytes32"],\n["0xff", factory, salt, codeHash]\n)\n);\n\nconst address = ethers.utils.getAddress(ethers.utils.hexDataSlice(hash, 12));
","isPage":false,"text":"\n// The code of the wallet proxy contract\nconst WalletProxyBytecode =\n"0x603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3";\n \n// These values are defined by the wallet context\n// they must be known in order to validate the counter-factual wallet imageHash\nconst factory = "0xf9D09D634Fb818b05149329C1dcCFAeA53639d96";\nconst mainModule = "0xd01F11855bCcb95f88D7A48492F66410d4637313";\n \n// Append the `mainModule` to the `WalletProxyBytecode`\n// this completed the creation code of the proxy contract\n// used for computing the wallet address as defined by the CREATE2 opcode\nconst codeHash = ethers.utils.keccak256(\nethers.utils.solidityPack(\n["bytes", "bytes32"],\n[WalletContractBytecode, ethers.utils.hexZeroPad(mainModule, 32)]\n)\n);\n \n// Compute the wallet address\nconst hash = ethers.utils.keccak256(\nethers.utils.solidityPack(\n["bytes1", "address", "bytes32", "bytes32"],\n["0xff", factory, salt, codeHash]\n)\n);\n \nconst address = ethers.utils.getAddress(ethers.utils.hexDataSlice(hash, 12));","title":"Compute wallet address","titles":["Wallet Configuration","Initial wallet configuration","Configuration hash - ImageHash"]},"396":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#modules--wallet-update","html":"\n
Sequence modules are the underlying program implementation of the wallets; wallets can change modules at runtime.
\n
The MainModule is the initial module of every Sequence wallet; it differs from the other modules because it doesn't store the set of signers on contract storage; it uses the salt provided to the Factory contract.
\n","isPage":true,"text":"\nSequence modules are the underlying program implementation of the wallets; wallets can change modules at runtime.\nThe MainModule is the initial module of every Sequence wallet; it differs from the other modules because it doesn't store the set of signers on contract storage; it uses the salt provided to the Factory contract.\n","title":"Modules & wallet update","titles":[]},"397":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#wallet-implementation","html":"\n
Sequence modules can be assigned to wallets either by the factory or by updating it after the initial deployment. Only one module can be assigned to a wallet at a time.
\n","isPage":false,"text":"\nSequence modules can be assigned to wallets either by the factory or by updating it after the initial deployment. Only one module can be assigned to a wallet at a time.\n","title":"Wallet implementation","titles":["Modules & wallet update"]},"398":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#_updateconfiguration","html":"\n
The updateImplementation allows to update the underlying implementation of the wallet proxy. This implementation contains all the core code that defines the wallet's behaviour.
\n
:::warning Dangerous operation\nCalling updateImplementation with an invalid implementation will result in the corruption of the wallet.
\n
Corrupt wallets may lead to the loss of funds.\n:::
\n
function updateImplementation(\n address _implementation\n) external override onlySelf {
\n","isPage":false,"text":"\nThe updateImplementation allows to update the underlying implementation of the wallet proxy. This implementation contains all the core code that defines the wallet's behaviour.\n:::warning Dangerous operation\nCalling updateImplementation with an invalid implementation will result in the corruption of the wallet.\nCorrupt wallets may lead to the loss of funds.\n:::\nfunction updateImplementation(\n address _implementation\n) external override onlySelf {\n","title":"_updateConfiguration","titles":["Modules & wallet update","Wallet implementation"]},"399":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#parameters","html":"\n
Name
Type
Description
_implementation
address
Address of the new wallet implementation.
\n
This method has the onlySelf modifier, which means that it can only be called by the wallet itself using a self-referencing transaction. Calls to this method coming from other addresses, even if these addresses are signers of the wallet, will be rejected.
\n","isPage":false,"text":"\nNameTypeDescription_implementationaddressAddress of the new wallet implementation.\nThis method has the onlySelf modifier, which means that it can only be called by the wallet itself using a self-referencing transaction. Calls to this method coming from other addresses, even if these addresses are signers of the wallet, will be rejected.\n","title":"Parameters:","titles":["Modules & wallet update","Wallet implementation","_updateConfiguration"]},"400":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#reading-current-implementation","html":"\n
The wallet implementation is stored on the contract storage slot defined by the address of the wallet itself. Given that every wallet has a unique address, the implementation slot varies from wallet to wallet.
\n","isPage":false,"text":"\nThe wallet implementation is stored on the contract storage slot defined by the address of the wallet itself. Given that every wallet has a unique address, the implementation slot varies from wallet to wallet.\nimport "ethers"\n \nconst address = "0x596af90cecdbf9a768886e771178fd5561dd27ab"\nconst provider = new ethers.providers.JsonRpcProvider("http://localhost:8545")\n \n// Read storage slot address(address)\nconst slot = await provider.getStorageAt(address, ethers.utils.defaultAbiCoder.encode(['address'], [address]))\n \n// Decode bytes32 as address value\nconst implementation = ethers.utils.defaultAbiCoder.decode(['address'], slot)[0]\n \nconsole.log(implementation)\n","title":"Reading current implementation","titles":["Modules & wallet update","Wallet implementation"]},"401":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#wallet-configuration-validation","html":"\n
:::info Fixed configuration\nSigner's configuration on wallets using MainModule can't be changed. The only way to change the set of signers or threshold is by updating the module of the wallet.\n:::
\n
All sequence modules must implement the ModuleAuth interface, this interface allows the rest of the module to validate signatures for the wallet. In the case of MainModule this interface is implemented as a counter-factual validation of hash passed to the factory during the contract wallet creation.
\n","isPage":false,"text":"\n:::info Fixed configuration\nSigner's configuration on wallets using MainModule can't be changed. The only way to change the set of signers or threshold is by updating the module of the wallet.\n:::\nAll sequence modules must implement the ModuleAuth interface, this interface allows the rest of the module to validate signatures for the wallet. In the case of MainModule this interface is implemented as a counter-factual validation of hash passed to the factory during the contract wallet creation.\n","title":"Wallet configuration validation","titles":["Modules & wallet update"]},"402":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#_isvalidimage","html":"\n
Validates if the provided imageHash corresponds to the one configured in the wallet. This function is called internally to validate transaction and message signatures.
\n
The imageHash is a hash of the wallet configuration, which contains the wallet's threshold, signers and weights.
\n","isPage":false,"text":"\n function _isValidImage(\n bytes32 _imageHash\n ) internal override view returns (bool _isValid)\nValidates if the provided imageHash corresponds to the one configured in the wallet. This function is called internally to validate transaction and message signatures.\nThe imageHash is a hash of the wallet configuration, which contains the wallet's threshold, signers and weights.\n","title":"_isValidImage","titles":["Modules & wallet update","Wallet configuration validation"]},"403":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#parameters-1","html":"\n
Name
Type
Description
_imageHash
bytes32
Hash of wallet configuration to be validated.
\n","isPage":false,"text":"\nNameTypeDescription_imageHashbytes32Hash of wallet configuration to be validated.\n","title":"Parameters:","titles":["Modules & wallet update","Wallet configuration validation","_isValidImage"]},"404":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#return-values","html":"\n
Name
Type
Description
_isValid
bool
True if the given imageHash corresponds to the current wallet configuration.
\n","isPage":false,"text":"\nNameTypeDescription_isValidboolTrue if the given imageHash corresponds to the current wallet configuration.\n","title":"Return Values:","titles":["Modules & wallet update","Wallet configuration validation","_isValidImage"]},"405":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#mainmoduleupgradeable","html":"\n
MainModuleUpgradable is a module that mimics the behaviour of the MainModule but allows the wallet configuration to be updated.
\n","isPage":false,"text":"\nMainModuleUpgradable is a module that mimics the behaviour of the MainModule but allows the wallet configuration to be updated.\n","title":"MainModuleUpgradeable","titles":["Modules & wallet update"]},"406":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#updateimagehash","html":"\n
Updates the wallet imageHash, this is the hash that defines the wallet configuration (signers, weights, threshold).
\n
function updateImageHash(\n bytes32 _imageHash\n ) external override onlySelf {
\n","isPage":false,"text":"\nUpdates the wallet imageHash, this is the hash that defines the wallet configuration (signers, weights, threshold).\n function updateImageHash(\n bytes32 _imageHash\n ) external override onlySelf {\n","title":"updateImageHash","titles":["Modules & wallet update","MainModuleUpgradeable"]},"407":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#parameters-2","html":"\n
Name
Type
Description
_imageHash
bytes32
Hash of the new configuration for the wallet.
\n
:::caution Unsanitized input\nThe imageHash is not validated, it is the responsibility of the caller to ensure that the hash is correct. Reasons for incorrect hashes include:
\n
\n
The combined weight of the signers is below the threshold.
\n
The signers are not valid addresses.
\n
The signers are smart contract wallets without proper support for EIP-1271.
\n
The imageHash doesn't correspond to any wallet configuration (may be a random string).
\n
The imageHash corresponds to an unknown wallet configuration.
\n
\n
In any of this cases the wallet will be rendered unusable.\n:::
\n
This method has the onlySelf modifier, which means that it can only be called by the wallet itself using a self-referencing transaction. Calls to this method coming from other addresses, even if these addresses are signers of the wallet, will be rejected.
\n","isPage":false,"text":"\nNameTypeDescription_imageHashbytes32Hash of the new configuration for the wallet.\n:::caution Unsanitized input\nThe imageHash is not validated, it is the responsibility of the caller to ensure that the hash is correct. Reasons for incorrect hashes include:\n\nThe combined weight of the signers is below the threshold.\nThe signers are not valid addresses.\nThe signers are smart contract wallets without proper support for EIP-1271.\nThe imageHash doesn't correspond to any wallet configuration (may be a random string).\nThe imageHash corresponds to an unknown wallet configuration.\n\nIn any of this cases the wallet will be rendered unusable.\n:::\nThis method has the onlySelf modifier, which means that it can only be called by the wallet itself using a self-referencing transaction. Calls to this method coming from other addresses, even if these addresses are signers of the wallet, will be rejected.\n","title":"Parameters:","titles":["Modules & wallet update","MainModuleUpgradeable","updateImageHash"]},"408":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#first-configuration-update","html":"\n
When Sequence wallets are created, the factory contract doesn't call an initialize function. The configuration is instead defined by the salt provided to the factory, the MainModule then checks the counterfactual validity of all signatures against the wallet address.
\n
This means there is no direct way to update the configuration of a wallet while still using the MainModule. Given that the first configuration update needs to also change the wallet implementation to the MainModuleUpgradable, the MainModule is updated to the MainModuleUpgradable and the updateImageHash method is called to update the wallet configuration.
\n","isPage":false,"text":"\nWhen Sequence wallets are created, the factory contract doesn't call an initialize function. The configuration is instead defined by the salt provided to the factory, the MainModule then checks the counterfactual validity of all signatures against the wallet address.\nThis means there is no direct way to update the configuration of a wallet while still using the MainModule. Given that the first configuration update needs to also change the wallet implementation to the MainModuleUpgradable, the MainModule is updated to the MainModuleUpgradable and the updateImageHash method is called to update the wallet configuration.\nconst transactions = [\n {\n delegateCall: false,\n revertOnError: true,\n to: wallet,\n data: walletInterface.encodeFunctionData(\n walletInterface.getFunction('updateImplementation'), [this.context.mainModuleUpgradable]\n ),\n value: ethers.constants.Zero,\n gasLimit: ethers.constants.Zero,\n },\n {\n delegateCall: false,\n revertOnError: true,\n to: wallet,\n data: mainModuleInterface.encodeFunctionData(\n mainModuleInterface.getFunction('updateImageHash'), [newImageHash]\n ),\n value: ethers.constants.Zero,\n gasLimit: ethers.constants.Zero,\n }\n]\n","title":"First configuration update","titles":["Modules & wallet update"]},"409":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#delegatecall-false","html":"\n
delegateCall is used to extend the wallet functionality beyond what's allowed by the module. In this case the called methods are defined on the modules themselves, so there is no need to use delegateCall.
\n","isPage":false,"text":"\ndelegateCall is used to extend the wallet functionality beyond what's allowed by the module. In this case the called methods are defined on the modules themselves, so there is no need to use delegateCall.\n","title":"delegateCall: false","titles":["Modules & wallet update","First configuration update","updateImageHash"]},"410":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#revertonerror-true","html":"\n
revertOnError is used to revert the whole transaction bundle if a transaction flagged by it fails. In this case the operation should be atomic given that a partial wallet configuration update will render the wallet unusable.
\n","isPage":false,"text":"\nrevertOnError is used to revert the whole transaction bundle if a transaction flagged by it fails. In this case the operation should be atomic given that a partial wallet configuration update will render the wallet unusable.\n","title":"revertOnError: true","titles":["Modules & wallet update","First configuration update","updateImageHash"]},"411":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#to-wallet","html":"\n
The methods being called are defined on the wallet itself, but need to be called externally, so the to address is the wallet itself.
\n","isPage":false,"text":"\nThe methods being called are defined on the wallet itself, but need to be called externally, so the to address is the wallet itself.\n","title":"to: wallet","titles":["Modules & wallet update","First configuration update","updateImageHash"]},"412":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#value-ethersconstantszero","html":"\n
The value of the transaction is always zero, since the transaction is a self-referencing transaction and doesn't require transferring funds.
\n","isPage":false,"text":"\nThe value of the transaction is always zero, since the transaction is a self-referencing transaction and doesn't require transferring funds.\n","title":"value: ethers.constants.Zero","titles":["Modules & wallet update","First configuration update","updateImageHash"]},"413":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#gaslimit-ethersconstantszero","html":"\n
The gasLimit of the transaction is always zero, since it represents an unlimited amount of gas.
\n
:::warning Dangerous operation
\n
When the wallet is first updated to the MainModuleUpgradable it doesn't have a valid imageHash yet. It's imperative that the imageHash is updated before the transaction bundle finishes executing.\nIf the imageHash is not updated before the transaction bundle finishes executing, the wallet will be rendered unusable.
\n
For this reason the following considerations should be taken when updating the wallet for the first time:
\n
\n
All transactions should be marked revertOnError = true.
\n
updateImplementation and updateImageHash should both be declared on the same transaction bundle.
\n
The gasLimit of both transactions should be set to unlimited (0).
\n
\n
:::
\n","isPage":false,"text":"\nThe gasLimit of the transaction is always zero, since it represents an unlimited amount of gas.\n:::warning Dangerous operation\nWhen the wallet is first updated to the MainModuleUpgradable it doesn't have a valid imageHash yet. It's imperative that the imageHash is updated before the transaction bundle finishes executing.\nIf the imageHash is not updated before the transaction bundle finishes executing, the wallet will be rendered unusable.\nFor this reason the following considerations should be taken when updating the wallet for the first time:\n\nAll transactions should be marked revertOnError = true.\nupdateImplementation and updateImageHash should both be declared on the same transaction bundle.\nThe gasLimit of both transactions should be set to unlimited (0).\n\n:::\n","title":"gasLimit: ethers.constants.Zero","titles":["Modules & wallet update","First configuration update","updateImageHash"]},"414":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#subsequent-configuration-updates","html":"\n
Once the wallet is updated to the MainModuleUpgradable it can be updated by calling the updateImageHash method, without any additional transaction.
\n","isPage":false,"text":"\nOnce the wallet is updated to the MainModuleUpgradable it can be updated by calling the updateImageHash method, without any additional transaction.\nconst transactions = [\n {\n delegateCall: false,\n revertOnError: true,\n to: wallet,\n data: mainModuleInterface.encodeFunctionData(\n mainModuleInterface.getFunction('updateImageHash'), [newImageHash]\n ),\n value: ethers.constants.Zero,\n gasLimit: ethers.constants.Zero,\n }\n]\n","title":"Subsequent configuration updates","titles":["Modules & wallet update","First configuration update"]},"415":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#retrieving-the-current-configuration","html":"\n
If the wallet is updated to the MainModuleUpgradable it can be queried for the current configuration by calling the getImageHash method.
\n
This method should return the wallet's current configuration hash, which can be compared to a list of known wallet configurations to find the correct one.
\n","isPage":false,"text":"\nIf the wallet is updated to the MainModuleUpgradable it can be queried for the current configuration by calling the getImageHash method.\nThis method should return the wallet's current configuration hash, which can be compared to a list of known wallet configurations to find the correct one.\n","title":"Retrieving the current configuration","titles":["Modules & wallet update","First configuration update"]},"416":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#retrieving-the-wallet-configuration","html":"\n
The imageHash method returns bytes32(0) if the wallet is not yet updated to the MainModuleUpgradable.\nIn this case the wallet is in a counter-factual state and the imageHash can't be directly queried.
\n
This is also the case for non-deployed wallets.
\n
To find the imageHash of a non-deployed or non-updated wallet, a candidate known imageHash needs to be compared against the wallet address.
","isPage":false,"text":"\nThe imageHash method returns bytes32(0) if the wallet is not yet updated to the MainModuleUpgradable.\nIn this case the wallet is in a counter-factual state and the imageHash can't be directly queried.\nThis is also the case for non-deployed wallets.\nTo find the imageHash of a non-deployed or non-updated wallet, a candidate known imageHash needs to be compared against the wallet address.\nSee Compute wallet address.","title":"Retrieving the wallet configuration","titles":["Modules & wallet update","First configuration update","Retrieving the current configuration"]},"417":{"href":"/solutions/technical-references/internals/v1/06-main-module-upgradeable#mainmoduleupgradeable--configuration-migration","html":"","isPage":true,"text":"","title":"MainModuleUpgradeable & configuration migration","titles":[]},"418":{"href":"/solutions/technical-references/internals/v1/08-signature-encoding#signature-encoding","html":"\n
\n","isPage":true,"text":"\nSequence Wallets support ERC-1271 Standard Contract Signature Verification to allow signing of transactions and messages.\n","title":"Signature Encoding","titles":[]},"419":{"href":"/solutions/technical-references/internals/v1/08-signature-encoding#erc-191-ethereum-signed-data","html":"\n
import { Wallet } from '@0xsequence/wallet'\n\n// Construct your Sequence Wallet (out of scope for this section)\nconst wallet: Wallet\n\nconst message = "Hello, World!"\n\nconst prefixedMessage = "\\x19Ethereum Signed Message:\\n" + len(message) + message\nconst signature = await wallet.signMessage(prefixedMessage)
\n
The above will iterate through local, signing the message. If the threshold is reached, the signature is returned.\nOtherwise the library will iterate through the remote signers as well.\nThe resulting signatures are joined and encoded as a hex string.
\n","isPage":false,"text":"\nMessages encoded with as ERC-191 Ethereum Signed Data are able to be created and signed as follows.\nimport { Wallet } from '@0xsequence/wallet'\n \n// Construct your Sequence Wallet (out of scope for this section)\nconst wallet: Wallet\n \nconst message = "Hello, World!"\n \nconst prefixedMessage = "\\x19Ethereum Signed Message:\\n" + len(message) + message\nconst signature = await wallet.signMessage(prefixedMessage)\nThe above will iterate through local, signing the message. If the threshold is reached, the signature is returned.\nOtherwise the library will iterate through the remote signers as well.\nThe resulting signatures are joined and encoded as a hex string.\n","title":"ERC-191 Ethereum Signed Data","titles":["Signature Encoding"]},"420":{"href":"/solutions/technical-references/internals/v1/08-signature-encoding#erc-712-structured-data-signatures","html":"\n
import { Wallet } from '@0xsequence/wallet'\nimport { encodeTypedDataDigest } from '@0xsequence/utils'\n\n// Construct your Sequence Wallet (out of scope for this section)\nconst wallet: Wallet\n\n// Encode the typed data\nconst chainId = 1\nconst typedData = {\n\ttypes: {\n\t\tPerson: [\n\t\t\t{ name: 'name', type: 'string' },\n\t\t\t{ name: 'wallet', type: 'address' },\n\t\t\t{ name: 'count', type: 'uint8' }\n\t\t]\n\t},\n\tprimaryType: 'Person' as const,\n\tdomain: {\n\t\tname: 'Ether Mail',\n\t\tversion: '1',\n\t\tchainId: chainId,\n\t\tverifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC'\n\t},\n\tmessage: {\n\t\tname: 'Bob',\n\t\twallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n\t\tcount: 4\n\t}\n} \nconst hashedData = encodeTypedDataDigest(typedData)\n\nconst signature = await wallet.signMessage(hashedData)
\n
The above will iterate through local, signing the message. If the threshold is reached, the signature is returned.\nOtherwise the library will iterate through the remote signers as well.\nThe resulting signatures are joined and encoded as a hex string.
\n","isPage":false,"text":"\nERC-712 Structured Data can also be signed in a similar fashion.\nimport { Wallet } from '@0xsequence/wallet'\nimport { encodeTypedDataDigest } from '@0xsequence/utils'\n \n// Construct your Sequence Wallet (out of scope for this section)\nconst wallet: Wallet\n \n// Encode the typed data\nconst chainId = 1\nconst typedData = {\n\ttypes: {\n\t\tPerson: [\n\t\t\t{ name: 'name', type: 'string' },\n\t\t\t{ name: 'wallet', type: 'address' },\n\t\t\t{ name: 'count', type: 'uint8' }\n\t\t]\n\t},\n\tprimaryType: 'Person' as const,\n\tdomain: {\n\t\tname: 'Ether Mail',\n\t\tversion: '1',\n\t\tchainId: chainId,\n\t\tverifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC'\n\t},\n\tmessage: {\n\t\tname: 'Bob',\n\t\twallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n\t\tcount: 4\n\t}\n} \nconst hashedData = encodeTypedDataDigest(typedData)\n \nconst signature = await wallet.signMessage(hashedData)\nThe above will iterate through local, signing the message. If the threshold is reached, the signature is returned.\nOtherwise the library will iterate through the remote signers as well.\nThe resulting signatures are joined and encoded as a hex string.\n","title":"ERC-712 Structured Data Signatures","titles":["Signature Encoding"]},"421":{"href":"/solutions/technical-references/internals/v1/08-signature-encoding#verification","html":"\n
The signature can be verified by calling the isValidSignature method on the wallet.
\n
/**\n * @notice Verifies whether the provided signature is valid with respect to the provided hash\n * @dev MUST return the correct magic value if the signature provided is valid for the provided hash\n * > The bytes4 magic value to return when signature is valid is 0x1626ba7e : bytes4(keccak256("isValidSignature(bytes32,bytes)"))\n * @param _hash keccak256 hash that was signed\n * @param _signatures Signature byte array associated with _data.\n * Encoded as abi.encode(Signature[], Configs)\n * @return magicValue Magic value 0x1626ba7e if the signature is valid and 0x0 otherwise\n */\n function isValidSignature(\n bytes32 _hash,\n bytes calldata _signatures\n ) public override virtual view returns (bytes4) {\n // Validate signatures\n (bool isValid,) = _signatureValidation(_hash, _signatures);\n if (isValid) {\n return SELECTOR_ERC1271_BYTES32_BYTES;\n }\n\n return bytes4(0);\n }
\n
This will iterate through the combined signatures and validate that the resulting signature breaches the wallet's threshold.
","isPage":false,"text":"\nThe signature can be verified by calling the isValidSignature method on the wallet.\n /**\n * @notice Verifies whether the provided signature is valid with respect to the provided hash\n * @dev MUST return the correct magic value if the signature provided is valid for the provided hash\n * > The bytes4 magic value to return when signature is valid is 0x1626ba7e : bytes4(keccak256("isValidSignature(bytes32,bytes)"))\n * @param _hash keccak256 hash that was signed\n * @param _signatures Signature byte array associated with _data.\n * Encoded as abi.encode(Signature[], Configs)\n * @return magicValue Magic value 0x1626ba7e if the signature is valid and 0x0 otherwise\n */\n function isValidSignature(\n bytes32 _hash,\n bytes calldata _signatures\n ) public override virtual view returns (bytes4) {\n // Validate signatures\n (bool isValid,) = _signatureValidation(_hash, _signatures);\n if (isValid) {\n return SELECTOR_ERC1271_BYTES32_BYTES;\n }\n\n return bytes4(0);\n }\nThis will iterate through the combined signatures and validate that the resulting signature breaches the wallet's threshold.","title":"Verification","titles":["Signature Encoding"]},"422":{"href":"/solutions/technical-references/internals/v1/09-nested-transaction-batching#nested-transaction-batching","html":"","isPage":true,"text":"","title":"Nested Transaction Batching","titles":[]},"423":{"href":"/solutions/technical-references/internals/v1/10-guest-module#guestmodule-and-on-demand-deployment","html":"","isPage":true,"text":"","title":"GuestModule and on-demand deployment","titles":[]},"424":{"href":"/solutions/technical-references/internals/v1/11-wallet-context#wallet-context","html":"\n
Sequence wallet contracts underwent two independent audits by Consensys Diligence and Quantstamp.
\n
Note: Sequence Wallet was formerly known as "Arcadeum Wallet". Any references of "Arcadeum" in these reports are synonymous with "Sequence".
\n","isPage":true,"text":"\nSequence wallet contracts underwent two independent audits by Consensys Diligence and Quantstamp.\nNote: Sequence Wallet was formerly known as "Arcadeum Wallet". Any references of "Arcadeum" in these reports are synonymous with "Sequence".\n","title":"Contract Audits","titles":[]},"426":{"href":"/solutions/technical-references/internals/v1/12-contract-audits#quantstamp","html":"\n
In the context of Sequence Wallets, the "Wallet Configuration" is a set of parameters that defines the behavior of the wallet, primarily used to define the access control of the wallet, meaning who can sign transactions and how many signatures are needed.
\n","isPage":true,"text":"\nIn the context of Sequence Wallets, the "Wallet Configuration" is a set of parameters that defines the behavior of the wallet, primarily used to define the access control of the wallet, meaning who can sign transactions and how many signatures are needed.\n","title":"Wallet Configuration","titles":[]},"430":{"href":"/solutions/technical-references/internals/v2/04-configuration#top-level-properties","html":"\n
Sequence v2 configurations contain the following 3 properties:
\n
\n
threshold - The required "weight sum" needed for a signature to be considered valid.
\n
checkpoint - Used as a salt and ordering mechanism for wallet updates.
\n
tree - Determines the signers and their weights for the wallet.
\n
\n","isPage":false,"text":"\nSequence v2 configurations contain the following 3 properties:\n\nthreshold - The required "weight sum" needed for a signature to be considered valid.\ncheckpoint - Used as a salt and ordering mechanism for wallet updates.\ntree - Determines the signers and their weights for the wallet.\n\n","title":"Top level properties","titles":["Wallet Configuration"]},"431":{"href":"/solutions/technical-references/internals/v2/04-configuration#threshold","html":"\n
The threshold is a uint16; it can have any value between 0 and 65535. Signatures are only considered valid or invalid if the sum of the weights of the signers that signed the transaction is greater or equal to the threshold.
\n","isPage":false,"text":"\nThe threshold is a uint16; it can have any value between 0 and 65535. Signatures are only considered valid or invalid if the sum of the weights of the signers that signed the transaction is greater or equal to the threshold.\n","title":"Threshold","titles":["Wallet Configuration","Top level properties"]},"432":{"href":"/solutions/technical-references/internals/v2/04-configuration#checkpoint","html":"\n
The checkpoint is a uint32. During wallet creation, a semi-random value can be provided to generate independent wallets with the same initial configuration. Then, during normal operation, the checkpoint is used by Light State Sync to ensure that wallet updates are applied in the correct order.
\n","isPage":false,"text":"\nThe checkpoint is a uint32. During wallet creation, a semi-random value can be provided to generate independent wallets with the same initial configuration. Then, during normal operation, the checkpoint is used by Light State Sync to ensure that wallet updates are applied in the correct order.\n","title":"Checkpoint","titles":["Wallet Configuration","Top level properties"]},"433":{"href":"/solutions/technical-references/internals/v2/04-configuration#tree","html":"\n
The tree is an unbalanced binary Merkle tree, where each leaf may contain a signer, a static signature, or a subtree. The tree can represent any combination of signers and weights and can be used to create complex multi-signature wallets.
\n
The possible leaf types are:
\n","isPage":false,"text":"\nThe tree is an unbalanced binary Merkle tree, where each leaf may contain a signer, a static signature, or a subtree. The tree can represent any combination of signers and weights and can be used to create complex multi-signature wallets.\nThe possible leaf types are:\n","title":"Tree","titles":["Wallet Configuration","Top level properties"]},"434":{"href":"/solutions/technical-references/internals/v2/04-configuration#signer","html":"\n
Signers are represented by a signer address and a uint8 weight. The weight is how much the signer contributes to the threshold.\nThe address can belong to either an ERC1271 compliant contract or an EOA wallet.
\n","isPage":false,"text":"\nSigners are represented by a signer address and a uint8 weight. The weight is how much the signer contributes to the threshold.\nThe address can belong to either an ERC1271 compliant contract or an EOA wallet.\nThe leaf hash is calculated as follows:\nbytes32(uint256(weight) << 160 | uint256(uint160(addr)))\n","title":"Signer","titles":["Wallet Configuration","Top level properties","Tree"]},"435":{"href":"/solutions/technical-references/internals/v2/04-configuration#subdigest","html":"\n
This represents a static subdigest for which any signature is valid. If a signature for this subdigest is provided, the total weight of the signature is automatically set to Infinity.
\n
Notice static subdigests that exist within nested trees will have their "Infinity" weight reduced to the weight of the nested tree.
\n","isPage":false,"text":"\nThis represents a static subdigest for which any signature is valid. If a signature for this subdigest is provided, the total weight of the signature is automatically set to Infinity.\nNotice static subdigests that exist within nested trees will have their "Infinity" weight reduced to the weight of the nested tree.\nThe leaf hash is calculated as follows:\nkeccak256(abi.encodePacked('Sequence static digest:\\n', subdigest));\n","title":"Subdigest","titles":["Wallet Configuration","Top level properties","Tree"]},"436":{"href":"/solutions/technical-references/internals/v2/04-configuration#subtree-nested-configuration","html":"\n
This represents a whole new wallet configuration, this "nested configuration" has its own:
\n
\n
External weight (uint8)
\n
Internal threshold (uint16)
\n
Internal tree
\n
\n
The way it works is that if a signature reaches the internal threshold within the subtree it is considered valid, and the external weight is added to the parent tree. Any number of nested configurations can be created, and it is possible to create multiple nesting levels.
\n
This pattern can be used, among other things, to express the following scenarios:
\n
\n
Non-linear weight distribution, A and B signers can provide 1 weight each, but together they can provide 3 weight.
\n
Limited total weight contribution, A, B, and C signers can provide 1 weight each, but together they can only provide 2 weight.
\n
"Department configurations", N departments are required to sign, and each department has its own inner configuration.
\n\n","isPage":false,"text":"\nThis represents a whole new wallet configuration, this "nested configuration" has its own:\n\nExternal weight (uint8)\nInternal threshold (uint16)\nInternal tree\n\nThe way it works is that if a signature reaches the internal threshold within the subtree it is considered valid, and the external weight is added to the parent tree. Any number of nested configurations can be created, and it is possible to create multiple nesting levels.\nThis pattern can be used, among other things, to express the following scenarios:\n\nNon-linear weight distribution, A and B signers can provide 1 weight each, but together they can provide 3 weight.\nLimited total weight contribution, A, B, and C signers can provide 1 weight each, but together they can only provide 2 weight.\n"Department configurations", N departments are required to sign, and each department has its own inner configuration.\n\nThe leaf hash is calculated as follows:\nkeccak256(abi.encodePacked(\n 'Sequence nested config:\\n',\n imageHash(tree),\n threshold,\n weight\n))\nThe wallet contracts have no way of validating the correctness of the configuration, the responsibility of ensuring the configuration is correct is on the SDKs interacting with the contracts.Things like threshold == 0 or threshold > total weight will result in fully unauthenticated wallets or inaccessible wallets respectively.\n","title":"Subtree (nested configuration)","titles":["Wallet Configuration","Top level properties","Tree"]},"437":{"href":"/solutions/technical-references/internals/v2/04-configuration#imagehash","html":"\n
The configuration is never stored as a whole; instead, the Merkle tree is hashed into a single bytes32 value, this is internally called the imageHash of the configuration.
\n","isPage":false,"text":"\nThe configuration is never stored as a whole; instead, the Merkle tree is hashed into a single bytes32 value, this is internally called the imageHash of the configuration.\nThe imageHash is calculated as follows:\nimageHash := keccak256(abi.encode(\n keccak256(abi.encode(\n hashTree(tree),\n threshold\n )),\n checkpoint\n))\nThe hashTree function is a recursive function that hashes the tree into a single bytes32 value, pseudo code for the hashTree function is as follows:\nexport function hashTree(node: Node | Leaf): string {\n if (isSignerLeaf(node)) {\n return ethers.utils.solidityPack(\n ['uint96', 'address'],\n [node.weight, node.address]\n )\n }\n \n if (isSubdigestLeaf(node)) {\n return ethers.utils.solidityKeccak256(\n ['string', 'bytes32'],\n ['Sequence static digest:\\n', node.subdigest]\n )\n }\n \n if (isNestedLeaf(node)) {\n const nested = hashTree(node.tree)\n return ethers.utils.solidityKeccak256(\n ['string', 'bytes32', 'uint256', 'uint256'],\n ['Sequence nested config:\\n', nested, node.threshold, node.weight]\n )\n }\n \n return ethers.utils.solidityKeccak256(\n ['bytes32', 'bytes32'],\n [hashTree(node.left), hashTree(node.right)]\n )\n}\n","title":"ImageHash","titles":["Wallet Configuration"]},"438":{"href":"/solutions/technical-references/internals/v2/04-configuration#initial-configuration","html":"\n
All Sequence Wallets have an "initial configuration", implemented by using the imageHash of the initial configuration as the SALT during the CREATE2 deployment of the wallet.
\n
Wallets are deployed by calling the deploy function of the Factory contract, which takes the following parameters:
\n
\n
mainModule: The address of the initial code implementation of the wallet.
\n
salt: The imageHash of the initial configuration.
\n
\n","isPage":false,"text":"\nAll Sequence Wallets have an "initial configuration", implemented by using the imageHash of the initial configuration as the SALT during the CREATE2 deployment of the wallet.\nWallets are deployed by calling the deploy function of the Factory contract, which takes the following parameters:\n\nmainModule: The address of the initial code implementation of the wallet.\nsalt: The imageHash of the initial configuration.\n\nThe MainModule should always be used as the initial code implementation of the wallet. The MainModule validates the imageHash (during signature validation) by re-computing the counterfactual address of the wallet, hence it does not require any storage initialization.If the imageHash is ever changed, MainModule will automatically replace the wallet code implementation with MainModuleUpgradeable, while handling the storage initialization.","title":"Initial Configuration","titles":["Wallet Configuration"]},"439":{"href":"/solutions/wallets/embedded-wallet/examples/03-manage-sessions#session-management","html":"\n
Sequence Auth + Embedded Wallet handles the following aspects of your application:
\n
\n
User creation
\n
User authentication
\n
Session management
\n
\n
This means you don't need to implement an account system yourself; instead, you interact with the Auth + WaaS SDK whenever you need to authenticate a user.
\n","isPage":true,"text":"\nSequence Auth + Embedded Wallet handles the following aspects of your application:\n\nUser creation\nUser authentication\nSession management\n\nThis means you don't need to implement an account system yourself; instead, you interact with the Auth + WaaS SDK whenever you need to authenticate a user.\n","title":"Session Management","titles":[]},"440":{"href":"/solutions/wallets/embedded-wallet/examples/03-manage-sessions#sign-in--sign-up","html":"\n
Signing in and signing up are the same operation; the account is automatically created if it doesn't already exist.
\n
import { SequenceWaaS } from "@0xsequence/waas";\n\nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n\n// Get a sessionHash\nconst sessionHash = await waas.getSessionHash();\n\n// Get an idToken using the social auth provider of your choice\n// (Google, Facebook, Twitter, etc.)\n// Note: remember to pass the sessionHash as a nonce!\n\n// Then sign in with Sequence WaaS\nconst res = await waas.signIn({ idToken }, "MacBook Pro - Chrome");\n\nconsole.log(res);
\n\n","isPage":false,"text":"\nSigning in and signing up are the same operation; the account is automatically created if it doesn't already exist.\nimport { SequenceWaaS } from "@0xsequence/waas";\n \nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n \n// Get a sessionHash\nconst sessionHash = await waas.getSessionHash();\n \n// Get an idToken using the social auth provider of your choice\n// (Google, Facebook, Twitter, etc.)\n// Note: remember to pass the sessionHash as a nonce!\n \n// Then sign in with Sequence WaaS\nconst res = await waas.signIn({ idToken }, "MacBook Pro - Chrome");\n \nconsole.log(res);\n{\n "sessionId": "0x63A21cCa14ed7454B9cF6466af422B5c597c6b57",\n "wallet": "0xd6043fe6f06d90ec2cB36cA5CD1B193A8515f350"\n}\nSessions opened with some providers might require a second step in order to be usable for sending transactions.See Email validation.\n","title":"Sign in / Sign Up","titles":["Session Management"]},"441":{"href":"/solutions/wallets/embedded-wallet/examples/03-manage-sessions#email-sign-in--sign-up","html":"\n
Email sign-in is directly supported by the SDK, as long as the used key has been generated with the email scope. Email logins work similarly to social logins, except that the idToken is generated by the SDK itself.
\n
To open a session using an email, you will need to provide an email for the user. The Embedded Wallet Nitro API will then send an email to the user with a One-Time Password (OTP) that can be used to open a session. This OTP has to be provided to the SDK to obtain an idToken.
\n
Once the idToken is obtained, the session can be opened as usual.
\n
import { SequenceWaaS } from "@0xsequence/waas";\n\n// Define the user's email address\nconst email = "user@example.com";\n\nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n\n// This will send an email to the user with an OTP\nconst { instance } = await waas.email.initiateAuth({ email });\n\n// Obtain the OTP from the user\nconst answer = "123456";\n\nconst sessionHash = await sequence.getSessionHash();\nconst { idToken } = await waas.email.finalizeAuth({\n instance,\n answer,\n email,\n sessionHash,\n});\n\n// Log in using the idToken, as usual\nawait waas.signIn({ idToken }, "Apple Vision Pro - Chrome");
\n","isPage":false,"text":"\nEmail sign-in is directly supported by the SDK, as long as the used key has been generated with the email scope. Email logins work similarly to social logins, except that the idToken is generated by the SDK itself.\nTo open a session using an email, you will need to provide an email for the user. The Embedded Wallet Nitro API will then send an email to the user with a One-Time Password (OTP) that can be used to open a session. This OTP has to be provided to the SDK to obtain an idToken.\nOnce the idToken is obtained, the session can be opened as usual.\nimport { SequenceWaaS } from "@0xsequence/waas";\n \n// Define the user's email address\nconst email = "user@example.com";\n \nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n \n// This will send an email to the user with an OTP\nconst { instance } = await waas.email.initiateAuth({ email });\n \n// Obtain the OTP from the user\nconst answer = "123456";\n \nconst sessionHash = await sequence.getSessionHash();\nconst { idToken } = await waas.email.finalizeAuth({\n instance,\n answer,\n email,\n sessionHash,\n});\n \n// Log in using the idToken, as usual\nawait waas.signIn({ idToken }, "Apple Vision Pro - Chrome");\n","title":"Email Sign In / Sign Up","titles":["Session Management","Sign in / Sign Up"]},"442":{"href":"/solutions/wallets/embedded-wallet/examples/03-manage-sessions#google--apple-auth","html":"\n
Google and Apple auth are directly supported by the SDK. The idToken is obtained from the social auth provider and used to open a session. You can see a sample React application using Google auth below. To see a complete application, see the demo-waas-auth repository. A functional demo is also available here.
\n
Begin with a simple main.tsx file that sets up the WaaS SDK, the router, and the Google OAuth provider.
The useSessionHash hook is used to obtain a session hash that is used to prevent replay attacks. The sequence.getSessionHash function is used to obtain the session hash, and the sequence.onSessionStateChanged function is used to update the session hash when the session state changes.
To handle the Google login, you can use the GoogleLogin component from the @react-oauth/google package. The handleGoogleLogin function is called when the user successfully logs in.
\n","isPage":false,"text":"\nGoogle and Apple auth are directly supported by the SDK. The idToken is obtained from the social auth provider and used to open a session. You can see a sample React application using Google auth below. To see a complete application, see the demo-waas-auth repository. A functional demo is also available here.\nBegin with a simple main.tsx file that sets up the WaaS SDK, the router, and the Google OAuth provider.\nimport { SequenceWaaS } from "@0xsequence/waas";\nimport { GoogleOAuthProvider } from "@react-oauth/google";\nimport { createHashRouter, RouterProvider } from "react-router-dom";\n \nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n \nexport const router = createHashRouter([\n {\n path: "/login",\n element: <Login />,\n },\n {\n path: "/",\n element: <App />,\n },\n]);\n \nReactDOM.createRoot(document.getElementById("root")!).render(\n <React.StrictMode>\n <GoogleOAuthProvider clientId={GOOGLE_CLIENT_ID}>\n <RouterProvider router={router} />\n </GoogleOAuthProvider>\n </React.StrictMode>\n);\nThe useSessionHash hook is used to obtain a session hash that is used to prevent replay attacks. The sequence.getSessionHash function is used to obtain the session hash, and the sequence.onSessionStateChanged function is used to update the session hash when the session state changes.\nimport { sequence } from "./main";\nimport { useEffect, useState } from "react";\n \nexport function useSessionHash() {\n const [sessionHash, setSessionHash] = useState("");\n const [error, setError] = useState<any>(undefined);\n \n useEffect(() => {\n const handler = async () => {\n try {\n setSessionHash(await sequence.getSessionHash());\n } catch (error) {\n console.error(error);\n setError(error);\n }\n };\n handler();\n return sequence.onSessionStateChanged(handler);\n }, [setSessionHash, setError]);\n \n return {\n sessionHash,\n error,\n loading: !!sessionHash,\n };\n}\nTo handle the Google login, you can use the GoogleLogin component from the @react-oauth/google package. The handleGoogleLogin function is called when the user successfully logs in.\nimport { router, sequence } from './main'\nimport { CredentialResponse, GoogleLogin } from '@react-oauth/google'\nimport { useSessionHash } from "./useSessionHash.ts";\n \nfunction Login() {\n const { sessionHash } = useSessionHash()\n const [signingIn, setSigningIn] = useState(false)\n \n useEffect(() => {\n (async () => {\n if (await sequence.isSignedIn()) {\n router.navigate('/')\n }\n })()\n }, [])\n \n const handleGoogleLogin = async (tokenResponse: CredentialResponse) => {\n const walletAddress = await sequence.signIn({\n idToken: tokenResponse.credential!\n }, "MacBook Pro - Chrome")\n \n console.log(`Wallet address: ${walletAddress}`)\n router.navigate('/')\n }\n \n return (\n {!!sessionHash && (<>\n <GoogleLogin onSuccess={handleGoogleLogin} shape="circle" width={230} nonce={sessionHash} />\n </>)}\n )\n}\n \nexport default Login\n","title":"Google / Apple Auth","titles":["Session Management","Sign in / Sign Up"]},"443":{"href":"/solutions/wallets/embedded-wallet/examples/03-manage-sessions#list-sessions","html":"\n
This function returns a list of sessions for the current user and only includes sessions that are still valid.
\n
import { SequenceWaaS } from "@0xsequence/waas";\n\nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n\nawait waas.signIn({ idToken }, "MacBook Pro - Chrome");\n\nconst sessions = await waas.listSessions();\nconsole.log(sessions);
","isPage":false,"text":"\nA session can be closed using the id of the session. Any session can be closed from any device with an active session.\nimport { SequenceWaaS } from "@0xsequence/waas";\n \nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n \nawait waas.signIn({ idToken }, "MacBook Pro - Chrome");\n \nconst sessions = await waas.listSessions();\nawait waas.dropSession({ sessionId: sessions[0].id });","title":"Close Session","titles":["Session Management"]},"445":{"href":"/solutions/wallets/embedded-wallet/examples/05-validation#validation","html":"\n
Users with Auth + Embedded Wallet go through two distinct flows based on the login method:
\n","isPage":true,"text":"\nUsers with Auth + Embedded Wallet go through two distinct flows based on the login method:\n","title":"Validation","titles":[]},"446":{"href":"/solutions/wallets/embedded-wallet/examples/05-validation#email-login-one-time-code","html":"\n
For users logging in with an email, Amazon Cognito sends a one-time code to validate their identity. This is a trusted method that does not require additional verification.
\n","isPage":false,"text":"\nFor users logging in with an email, Amazon Cognito sends a one-time code to validate their identity. This is a trusted method that does not require additional verification.\n","title":"Email login (one-time code)","titles":["Validation",null]},"447":{"href":"/solutions/wallets/embedded-wallet/examples/05-validation#social-login","html":"\n
Users who log in via established social auth providers like Google or Facebook don't need additional validation. However, when logging in using a custom provider, we cannot guarantee sufficient protection of user's identity. Due to this, we might require additional verification by asking the user to provide a one-time code we send to their email address.
\n
Please contact Sequence support if you wish to discuss whether your authentication provider can be considered trusted.
\n","isPage":false,"text":"\nUsers who log in via established social auth providers like Google or Facebook don't need additional validation. However, when logging in using a custom provider, we cannot guarantee sufficient protection of user's identity. Due to this, we might require additional verification by asking the user to provide a one-time code we send to their email address.\nPlease contact Sequence support if you wish to discuss whether your authentication provider can be considered trusted.\n","title":"Social login","titles":["Validation",null]},"448":{"href":"/solutions/wallets/embedded-wallet/examples/05-validation#validation-status","html":"\n
To check the validation status of the current session, use the isSessionValid method. This returns true for email login and trusted social logins and false for custom logins until email validation is complete.
\n","isPage":false,"text":"\nTo check the validation status of the current session, use the isSessionValid method. This returns true for email login and trusted social logins and false for custom logins until email validation is complete.\nconst isValid = await waas.isSessionValid();\nconsole.log(isValid);\ntrue\n","title":"Validation status","titles":["Validation"]},"449":{"href":"/solutions/wallets/embedded-wallet/examples/05-validation#trigger-session-validation","html":"\n
Manually trigger a session validation with the validateSession method. This will send a code to the user's email. If validated within 10 minutes, the method returns true; otherwise, it returns false.
\n
const result = await waas.validateSession();
\n
true
\n
Once user receives the code, he can validate the session with the finishValidateSession method that takes the code as an argument. If the code is valid, the method returns true; otherwise, it returns false.
\n
const result = await waas.finishValidateSession("123456");
\n
true
\n","isPage":false,"text":"\nManually trigger a session validation with the validateSession method. This will send a code to the user's email. If validated within 10 minutes, the method returns true; otherwise, it returns false.\nconst result = await waas.validateSession();\ntrue\nOnce user receives the code, he can validate the session with the finishValidateSession method that takes the code as an argument. If the code is valid, the method returns true; otherwise, it returns false.\nconst result = await waas.finishValidateSession("123456");\ntrue\n","title":"Trigger session validation","titles":["Validation","Validation status"]},"450":{"href":"/solutions/wallets/embedded-wallet/examples/05-validation#onvalidationrequired-callback","html":"\n
The onValidationRequired callback is triggered when a session validation is required. This can happen when a user tries to perform an action that requires validation, such as sending a transaction or signing a message. It determines whether the session validation should be triggered or not. If the callback returns true, the session validation is triggered. If it returns false, the action is cancelled.
\n","isPage":false,"text":"\nThe onValidationRequired callback is triggered when a session validation is required. This can happen when a user tries to perform an action that requires validation, such as sending a transaction or signing a message. It determines whether the session validation should be triggered or not. If the callback returns true, the session validation is triggered. If it returns false, the action is cancelled.\nconst tx = await waas.sendERC20({\n validation: {\n onValidationRequired: () => true,\n },\n chainId: 42161,\n token: "0x6b175474e89094c44da98b954eedeac495271d0f", // DAI\n to: "0x27CabC9700EE6Db2797b6AC1e1eCe81C72A2cD8D", // Recipient\n value: "200000000000000000000", // 200 DAI\n});\n","title":"onValidationRequired callback","titles":["Validation","Validation status","Trigger session validation"]},"451":{"href":"/solutions/wallets/embedded-wallet/examples/05-validation#listen-for-session-validations","html":"\n
Events like transaction sends may silently prompt session validation. Use the onValidationRequired hook to catch such instances.
\n
waas.onValidationRequired(() => {\n console.log("Session has been triggered for validation");\n});\n\nawait waas.sendTransaction({ chainId: 1 }, { to: "0x...", value: "1" });
\n
Session has been triggered for validation
\n","isPage":false,"text":"\nEvents like transaction sends may silently prompt session validation. Use the onValidationRequired hook to catch such instances.\nwaas.onValidationRequired(() => {\n console.log("Session has been triggered for validation");\n});\n \nawait waas.sendTransaction({ chainId: 1 }, { to: "0x...", value: "1" });\nSession has been triggered for validation\n","title":"Listen for session validations","titles":["Validation","Validation status"]},"452":{"href":"/solutions/wallets/embedded-wallet/examples/05-validation#automatic-session-validation","html":"\n
Session validation is automatic when certain actions requiring validation are performed. This can be managed using the onValidationRequired hook.
\n
const tx = await waas.sendTransaction({\n chainId: 1,\n validation: {\n onValidationRequired: () => {\n console.log("Session has been triggered for validation");\n return true;\n },\n },\n to: "0x061150e5574716DBb1a2cdf54b3DcE9F94395f65",\n value: "1",\n});
\n
By returning true or false from the onValidationRequired hook, you either continue or cancel the action, respectively.
","isPage":false,"text":"\nSession validation is automatic when certain actions requiring validation are performed. This can be managed using the onValidationRequired hook.\nconst tx = await waas.sendTransaction({\n chainId: 1,\n validation: {\n onValidationRequired: () => {\n console.log("Session has been triggered for validation");\n return true;\n },\n },\n to: "0x061150e5574716DBb1a2cdf54b3DcE9F94395f65",\n value: "1",\n});\nBy returning true or false from the onValidationRequired hook, you either continue or cancel the action, respectively.","title":"Automatic session validation","titles":["Validation"]},"453":{"href":"/solutions/wallets/embedded-wallet/examples/06-transaction-receipts#transaction-receipts","html":"\n
Any methods that involve sending transactions will return either successful or failed transaction receipts. Failed transaction receipts are generated without executing the transaction.
\n","isPage":true,"text":"\nAny methods that involve sending transactions will return either successful or failed transaction receipts. Failed transaction receipts are generated without executing the transaction.\n","title":"Transaction receipts","titles":[]},"454":{"href":"/solutions/wallets/embedded-wallet/examples/06-transaction-receipts#successful-transaction-response","html":"\n
Any transaction that is successfully included in a block will return a SentTransactionResponse object. This must be checked for before accessing the transaction hash, using the isSentTransactionResponse type guard.
\n","isPage":false,"text":"\nAny transaction that is successfully included in a block will return a SentTransactionResponse object. This must be checked for before accessing the transaction hash, using the isSentTransactionResponse type guard.\nimport { Sequence, isSentTransactionResponse } from "@0xsequence/waas";\n \nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n \nawait waas.signIn({ idToken }, "Session name");\n \nconst tx = await waas.sendTransaction({\n chainId: 42161,\n transactions: [\n {\n to: "0xD72C236Be524Ec24F72329317e2785E687105B69",\n value: "0",\n },\n ],\n});\n \nif (isSentTransactionResponse(tx)) {\n console.log(tx);\n}\nThe relevant fields are:\n\ntxHash: The transaction hash of the transaction that was sent to the network.\nreceipt.logs: Logs emitted by the transaction.\nreceipt.status: The status of the transaction. SUCCEEDED or FAILED.\nreceipt.revertReason: If the transaction was executed but reverted, it includes the reason.\n\nTo view the full response object, see the [Transaction Receipt Response] section.\n{\n "code": "transactionReceipt",\n "data": {\n "txHash": "0xf2e9f728abd65089f25efda5852e605ced377f4e2c89dbf143b124623ed09b2c",\n "metaTxHash": "acc36ed4ef40db74137266e48d863083a5c7e85e2735d69adafcb5b362b6cfc0",\n "nativeReceipt": { ... },\n "receipt": {\n "id": "acc36ed4ef40db74137266e48d863083a5c7e85e2735d69adafcb5b362b6cfc0",\n "index": 0,\n "logs": [\n {\n "address": "0x4d4EE1b8583e31fe789eAF2e1b6e011C220c10B6",\n "data": "0x0000000000000000000000001119e72b4af230becebd933d0e07f0eec51d8c2a0000000000000000000000000000000000000000000000000000000000000001",\n "topics": [\n "0x1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881"\n ]\n },\n {\n "address": "0x4d4EE1b8583e31fe789eAF2e1b6e011C220c10B6",\n "data": "0x0000000000000000000000000000000000000000000000000000000000000000",\n "topics": [\n "0x5c4eeb02dabf8976016ab414d617f9a162936dcace3cdef8c69ef6e262ad5ae7",\n "0xacc36ed4ef40db74137266e48d863083a5c7e85e2735d69adafcb5b362b6cfc0"\n ]\n }\n ],\n "receipts": [ ... ],\n "revertReason": null,\n "status": "SUCCEEDED"\n },\n "request": { ... },\n "simulations": [ ... ]\n }\n}\n","title":"Successful transaction response","titles":["Transaction receipts"]},"455":{"href":"/solutions/wallets/embedded-wallet/examples/06-transaction-receipts#failed-transaction-response","html":"\n
An Embedded Wallet will try to catch any failing transactions before they are sent to the network. This is done by simulating the transaction on the network before sending it. If the simulation fails, the transaction will not be sent to the network and a FailedTransactionResponse will be returned.
\n
To view the full response object, see the TODO: link to wallet API [Transaction Receipt Response] section.
\n
import { Sequence, isSentTransactionResponse } from "@0xsequence/waas";\n\nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n\nawait waas.signIn({ idToken }, "Session name");\n\nconst tx = await waas.sendTransaction({\n chainId: 137,\n transactions: [\n {\n // This address always fails on Polygon, give it a try :D\n to: "0x839eE023B21f4Ffe2294025DE0AC30Ba7278D6Fd",\n value: "0",\n },\n ],\n});\n\nif (isSentTransactionResponse(tx)) {\n // ... This will never be executed\n} else {\n // tx can only be `SentTransactionResponse` or `FailedTransactionResponse`\n console.log(tx);\n}
","isPage":false,"text":"\nAn Embedded Wallet will try to catch any failing transactions before they are sent to the network. This is done by simulating the transaction on the network before sending it. If the simulation fails, the transaction will not be sent to the network and a FailedTransactionResponse will be returned.\nTo view the full response object, see the TODO: link to wallet API [Transaction Receipt Response] section.\nimport { Sequence, isSentTransactionResponse } from "@0xsequence/waas";\n \nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n \nawait waas.signIn({ idToken }, "Session name");\n \nconst tx = await waas.sendTransaction({\n chainId: 137,\n transactions: [\n {\n // This address always fails on Polygon, give it a try :D\n to: "0x839eE023B21f4Ffe2294025DE0AC30Ba7278D6Fd",\n value: "0",\n },\n ],\n});\n \nif (isSentTransactionResponse(tx)) {\n // ... This will never be executed\n} else {\n // tx can only be `SentTransactionResponse` or `FailedTransactionResponse`\n console.log(tx);\n}\n{\n "code": "transactionFailed",\n "data": {\n "error": "This is an error message",\n "request": {\n "code": "sendTransaction",\n "expires": 1699443005,\n "identifier": "ts-sdk-1699442705965-0x153824576D03629b264683B430bBF9AcEA1d0975",\n "issued": 1699442705,\n "network": "137",\n "transactions": [\n {\n "data": "0x",\n "to": "0x839eE023B21f4Ffe2294025DE0AC30Ba7278D6Fd",\n "type": "transaction",\n "value": "0x00"\n }\n ],\n "wallet": "0x4d4EE1b8583e31fe789eAF2e1b6e011C220c10B6"\n },\n "simulations": [\n {\n "executed": true,\n "gasLimit": 7908,\n "gasUsed": 5931,\n "reason": "This is an error message :)",\n "result": null,\n "succeeded": false\n }\n ]\n }\n}","title":"Failed transaction response","titles":["Transaction receipts"]},"456":{"href":"/solutions/wallets/universal-wallet/examples/02-auth-address#authenticate-users-with-message-signature","html":"\n","isPage":true,"text":"\n","title":"Authenticate Users with Message Signature","titles":[]},"457":{"href":"/solutions/wallets/universal-wallet/examples/02-auth-address#ask-for-the-wallet-address","html":"\n
\n","isPage":false,"text":"\nTo get the user's Sequence wallet address:\nconst wallet = sequence.getWallet()\nconst address = wallet.getAddress()\nconsole.log(address)\n","title":"Ask for the wallet address","titles":["Authenticate Users with Message Signature"]},"458":{"href":"/solutions/wallets/universal-wallet/examples/02-auth-address#authenticate-wallet","html":"\n
In many cases, you'll want your users to connect and then verify they do control this wallet address. Applications typically do this by asking the user\nto sign a message with their wallet, and then verify the signature from the user to ensure its integrity.
\n
As this is such a common workflow, Sequence can automatically authenticate the account address at the same time\nwhile the user is prompt to connect their wallet to your dapp. This allows the user experience to be simpler and\nmore seamless.
\n
import { sequence } from '0xsequence'\n\nconst wallet = sequence.getWallet()\n\nconst connectDetails = await wallet.connect({\n app: 'Your Dapp name',\n authorize: true // <---<<< this will automatically sign+verify a EIP712 message when user clicks "Connect"\n})
\n
It will look like this to your users:
\n\n
In the above example, we pass authorize: true to the connect() function, which will automatically have the user\nsign a EIP712 signed message to prove their identity. This allows you to then easily authenticate the connected\nwallet address with absolute certainty.
\n
You can find the signed message proof returned in connectDetails.proof, which is an EIP712 signed object using\na simple convention from ethauth. NOTE: EIP712 allows you to use an actual object for\nsigning instead of just a plain-text string.
\n","isPage":false,"text":"\nIn many cases, you'll want your users to connect and then verify they do control this wallet address. Applications typically do this by asking the user\nto sign a message with their wallet, and then verify the signature from the user to ensure its integrity.\nAs this is such a common workflow, Sequence can automatically authenticate the account address at the same time\nwhile the user is prompt to connect their wallet to your dapp. This allows the user experience to be simpler and\nmore seamless.\nimport { sequence } from '0xsequence'\n \nconst wallet = sequence.getWallet()\n \nconst connectDetails = await wallet.connect({\n app: 'Your Dapp name',\n authorize: true // <---<<< this will automatically sign+verify a EIP712 message when user clicks "Connect"\n})\nIt will look like this to your users:\n\nIn the above example, we pass authorize: true to the connect() function, which will automatically have the user\nsign a EIP712 signed message to prove their identity. This allows you to then easily authenticate the connected\nwallet address with absolute certainty.\nYou can find the signed message proof returned in connectDetails.proof, which is an EIP712 signed object using\na simple convention from ethauth. NOTE: EIP712 allows you to use an actual object for\nsigning instead of just a plain-text string.\n","title":"Authenticate wallet","titles":["Authenticate Users with Message Signature"]},"459":{"href":"/solutions/wallets/universal-wallet/examples/02-auth-address#authenticate-wallet-server-side","html":"\n
The above example demonstrates how to connect and verify the user's identity in your dapp on the client-side,\nbut if you'd like to authenticate the Sequence authorization proof on your server, then you can do so with the following snippet:
\n
import { ValidateSequenceWalletProof } from '@0xsequence/auth'\nimport { commons, v2 } from '@0xsequence/core'\nimport { ETHAuth } from '@0xsequence/ethauth'\nimport { trackers } from '@0xsequence/sessions'\nimport * as ethers from 'ethers'\n\n// ...\n\nconst rpcUrl = 'https://polygon-mainnet.infura.io/v3/<your infura key here>'\nconst provider = new ethers.providers.JsonRpcProvider(rpcUrl)\n\n// create an EIP-6492-aware ETHAuth proof validator\nconst validator = ValidateSequenceWalletProof(\n () => new commons.reader.OnChainReader(provider),\n new trackers.remote.RemoteConfigTracker('https://sessions.sequence.app'),\n v2.DeployedWalletContext\n)\nconst ethauth = new ETHAuth(validator)\nawait ethauth.configJsonRpcProvider(rpcUrl)\n\ntry {\n const proof = await ethAuth.decodeProof(connectDetails.proof.proofString)\n console.log(`proof for address ${proof.address} is valid`)\n} catch (err) {\n console.log(`invalid proof -- do not trust address: ${err}`)\n}
\n
See the Go Sequence SDK on using Sequence in your Go applications.
As always, if you have any questions or require help, reach out to us on Discord.
","isPage":false,"text":"\nThe above example demonstrates how to connect and verify the user's identity in your dapp on the client-side,\nbut if you'd like to authenticate the Sequence authorization proof on your server, then you can do so with the following snippet:\nimport { ValidateSequenceWalletProof } from '@0xsequence/auth'\nimport { commons, v2 } from '@0xsequence/core'\nimport { ETHAuth } from '@0xsequence/ethauth'\nimport { trackers } from '@0xsequence/sessions'\nimport * as ethers from 'ethers'\n \n// ...\n \nconst rpcUrl = 'https://polygon-mainnet.infura.io/v3/<your infura key here>'\nconst provider = new ethers.providers.JsonRpcProvider(rpcUrl)\n \n// create an EIP-6492-aware ETHAuth proof validator\nconst validator = ValidateSequenceWalletProof(\n () => new commons.reader.OnChainReader(provider),\n new trackers.remote.RemoteConfigTracker('https://sessions.sequence.app'),\n v2.DeployedWalletContext\n)\nconst ethauth = new ETHAuth(validator)\nawait ethauth.configJsonRpcProvider(rpcUrl)\n \ntry {\n const proof = await ethAuth.decodeProof(connectDetails.proof.proofString)\n console.log(`proof for address ${proof.address} is valid`)\n} catch (err) {\n console.log(`invalid proof -- do not trust address: ${err}`)\n}\nSee the Go Sequence SDK on using Sequence in your Go applications.\nIf your server is written in a language other than Javascript/Typescript or Go, all you have to do is validate\nthe signature with EIP1271, the standard method for validating signed messages for a smart wallet.\nAs always, if you have any questions or require help, reach out to us on Discord.","title":"Authenticate wallet server-side","titles":["Authenticate Users with Message Signature"]},"460":{"href":"/solutions/wallets/universal-wallet/examples/04-session-keys#no-wallet-confirmation-signatures","html":"\n
It is possible to build an application where users sign messages without requiring a confirmation in their Sequence wallet every time. This is possible using session keys, or ephemeral keys.
\n","isPage":true,"text":"\nIt is possible to build an application where users sign messages without requiring a confirmation in their Sequence wallet every time. This is possible using session keys, or ephemeral keys.\n","title":"No-Wallet-Confirmation Signatures","titles":[]},"461":{"href":"/solutions/wallets/universal-wallet/examples/04-session-keys#session-keys","html":"\n
Session keys are ephemeral private keys that can be generated and stored client-side, typically in a user's local storage. They provide a convenient and secure way for users to authorize specific actions in a decentralized application without requiring them to confirm each action through their primary wallet.
\n
By signing a message with their primary wallet (e.g., Sequence Wallet), users can authorize a session key to act on their behalf for a limited time or scope. Applications can then interpret signed messages from the session key as if they were coming directly from the user's wallet, streamlining the user experience.
\n
Session keys are particularly useful for applications that require frequent user interactions, as they help reduce the number of wallet confirmations needed, while still maintaining a secure and verifiable authentication process.
\n","isPage":false,"text":"\nSession keys are ephemeral private keys that can be generated and stored client-side, typically in a user's local storage. They provide a convenient and secure way for users to authorize specific actions in a decentralized application without requiring them to confirm each action through their primary wallet.\nBy signing a message with their primary wallet (e.g., Sequence Wallet), users can authorize a session key to act on their behalf for a limited time or scope. Applications can then interpret signed messages from the session key as if they were coming directly from the user's wallet, streamlining the user experience.\nSession keys are particularly useful for applications that require frequent user interactions, as they help reduce the number of wallet confirmations needed, while still maintaining a secure and verifiable authentication process.\n","title":"Session Keys","titles":[]},"462":{"href":"/solutions/wallets/universal-wallet/examples/04-session-keys#using-session-keys-with-sequence","html":"\n","isPage":false,"text":"\n","title":"Using Session keys with Sequence","titles":[]},"463":{"href":"/solutions/wallets/universal-wallet/examples/04-session-keys#1-initialize-sequence-wallet-and-connect","html":"\n
import { Wallet } from '@0xsequence/wallet'\nimport { ethers } from 'ethers'\n\nconst wallet = new Wallet()\nawait wallet.connect()\n\nconst signer = wallet.getSigner()\nconst userAddress = signer.getAddress()
\n","isPage":false,"text":"\nimport { Wallet } from '@0xsequence/wallet'\nimport { ethers } from 'ethers'\n \nconst wallet = new Wallet()\nawait wallet.connect()\n \nconst signer = wallet.getSigner()\nconst userAddress = signer.getAddress()\n","title":"1. Initialize Sequence Wallet and Connect","titles":["Using Session keys with Sequence",null]},"464":{"href":"/solutions/wallets/universal-wallet/examples/04-session-keys#2-generate-a-session-key","html":"\n
Create a new ephemeral private key, store it in local storage, and derive the associated address:
\n","isPage":false,"text":"\nCreate a new ephemeral private key, store it in local storage, and derive the associated address:\nconst sessionPrivateKey = ethers.utils.randomBytes(32)\nlocalStorage.setItem('sessionPrivateKey', ethers.utils.hexlify(sessionPrivateKey))\nconst sessionWallet = new ethers.Wallet(sessionPrivateKey)\nconst sessionAddress = await sessionWallet.getAddress()\n","title":"2. Generate a Session Key","titles":["Using Session keys with Sequence",null]},"465":{"href":"/solutions/wallets/universal-wallet/examples/04-session-keys#3-sign-authorization-message","html":"\n
Sign a message with the user's Sequence Wallet to authorize the session key:
\n
const authorizationMessage = `Authorize this device to play this game.`\nconst signature = await signer.signMessage(authorizationMessage)
\n","isPage":false,"text":"\nSign a message with the user's Sequence Wallet to authorize the session key:\nconst authorizationMessage = `Authorize this device to play this game.`\nconst signature = await signer.signMessage(authorizationMessage)\n","title":"3. Sign Authorization Message","titles":["Using Session keys with Sequence",null]},"466":{"href":"/solutions/wallets/universal-wallet/examples/04-session-keys#4-verify-authorization-signature","html":"\n
Verify the signature on the server or client side using Sequence utility functions:
\n","isPage":false,"text":"\nUse the session key to sign a message client-side without user interaction:\nconst message = 'Perform action without wallet confirmation'\nconst sessionSignature = await sessionWallet.signMessage(message)\n","title":"5. Sign Message with Session Key","titles":["Using Session keys with Sequence",null]},"468":{"href":"/solutions/wallets/universal-wallet/examples/04-session-keys#6-verify-session-signature","html":"\n
Verify the session signature on the server or client side:
Note: You should retrieve the session key stored in local storage upon loading the application and only create a new session key if none can be found.
","isPage":false,"text":"\nVerify the session signature on the server or client side:\nconst recoveredSessionAddress = ethers.utils.verifyMessage(message, sessionSignature)\nif (recoveredSessionAddress === sessionAddress) {\n console.log('Session signature valid')\n} else {\n console.log('Session signature invalid')\n}\nNote: You should retrieve the session key stored in local storage upon loading the application and only create a new session key if none can be found.","title":"6. Verify Session Signature","titles":["Using Session keys with Sequence",null]},"469":{"href":"/solutions/wallets/universal-wallet/examples/05-send-transaction#sending-transactions","html":"\n
Signing a transaction will only retrieve the signed payload.\nIf you want the wallet to actually dispatch the transaction to the network as well, that requires only a small modification to the previous example (note the change from signTransactions to sendTransaction):
","isPage":true,"text":"\nSigning a transaction will only retrieve the signed payload.\nIf you want the wallet to actually dispatch the transaction to the network as well, that requires only a small modification to the previous example (note the change from signTransactions to sendTransaction):\nconst transaction = {\n to: recipientAddress,\n value: 1000000000000000000\n}\n \nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n ","title":"Sending Transactions","titles":[]},"470":{"href":"/solutions/wallets/universal-wallet/examples/06-send-erc20#sending-erc-20-tokens","html":"\n
You can ask the wallet to send a single ERC-20 token transfer:
\n
const erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\n\n// Encode an ERC-20 token transfer to recipient of the specified amount\nconst data = erc20Interface.encodeFunctionData(\n 'transfer', [recipientAddress, amount]\n)\n\nconst transaction = {\n to: daiContractAddress,\n data\n}\n\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n
\n
With batching functionality, you can send multiple token transfers in a single native transaction:
\n
const erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\n\n// Encode two different ERC-20 token transfers\nconst data1 = erc20Interface.encodeFunctionData(\n 'transfer', [recipient1Address, amount1]\n)\nconst data2 = erc20Interface.encodeFunctionData(\n 'transfer', [recipient2Address, amount2]\n)\n\nconst transaction1 = {\n to: daiContractAddress,\n data: data1\n}\n\nconst transaction2 = {\n to: daiContractAddress,\n data: data2\n}\n\n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction([transaction1, transaction2])\nconsole.log(txnResponse)\n
","isPage":true,"text":"\nYou can ask the wallet to send a single ERC-20 token transfer:\nconst erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\n \n// Encode an ERC-20 token transfer to recipient of the specified amount\nconst data = erc20Interface.encodeFunctionData(\n 'transfer', [recipientAddress, amount]\n)\n \nconst transaction = {\n to: daiContractAddress,\n data\n}\n \nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n \nWith batching functionality, you can send multiple token transfers in a single native transaction:\nconst erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\n \n// Encode two different ERC-20 token transfers\nconst data1 = erc20Interface.encodeFunctionData(\n 'transfer', [recipient1Address, amount1]\n)\nconst data2 = erc20Interface.encodeFunctionData(\n 'transfer', [recipient2Address, amount2]\n)\n \nconst transaction1 = {\n to: daiContractAddress,\n data: data1\n}\n \nconst transaction2 = {\n to: daiContractAddress,\n data: data2\n}\n \n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction([transaction1, transaction2])\nconsole.log(txnResponse)\n ","title":"Sending ERC-20 Tokens","titles":[]},"471":{"href":"/solutions/wallets/universal-wallet/examples/07-send-erc721#sending-erc-721-nft-tokens","html":"\n
Sending an ERC-721 NFT is similar to sending an ERC-20 token.\nThe only notable difference is in the contract standard itself:
\n
const erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\n\n// Encode the transfer of the NFT tokenId to recipient\nconst address = await wallet.getAddress()\nconst data = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipientAddress, tokenId]\n)\n\nconst transaction = {\n to: erc721TokenAddress,\n data\n}\n\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n
\n
With batching functionality, you can send multiple token transfers in a single native transaction:
\n
const erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\n\n// Encode two different ERC-721 token transfers\nconst data1 = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient1Address, amount1]\n)\nconst data2 = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient2Address, amount2]\n)\n\nconst transaction1 = {\n to: erc721ContractAddress,\n data: data1\n}\n\nconst transaction2 = {\n to: erc721ContractAddress,\n data: data2\n}\n\n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransactionBatch([transaction1, transaction2])\nconsole.log(txnResponse)\n
","isPage":true,"text":"\nSending an ERC-721 NFT is similar to sending an ERC-20 token.\nThe only notable difference is in the contract standard itself:\nconst erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\n \n// Encode the transfer of the NFT tokenId to recipient\nconst address = await wallet.getAddress()\nconst data = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipientAddress, tokenId]\n)\n \nconst transaction = {\n to: erc721TokenAddress,\n data\n}\n \nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n \nWith batching functionality, you can send multiple token transfers in a single native transaction:\nconst erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\n \n// Encode two different ERC-721 token transfers\nconst data1 = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient1Address, amount1]\n)\nconst data2 = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient2Address, amount2]\n)\n \nconst transaction1 = {\n to: erc721ContractAddress,\n data: data1\n}\n \nconst transaction2 = {\n to: erc721ContractAddress,\n data: data2\n}\n \n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransactionBatch([transaction1, transaction2])\nconsole.log(txnResponse)\n ","title":"Sending ERC-721 (NFT) Tokens","titles":[]},"472":{"href":"/solutions/wallets/universal-wallet/examples/08-send-erc1155#sending-erc-1155-collectible-tokens","html":"\n
Sending an ERC-1155 collectible is similar to sending an ERC-20 token.\nThe only notable difference is in the contract standard itself:
\n
const erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n\n// Encode the transfer of the collectible to recipient\nconst address = await wallet.getAddress()\nconst data = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipientAddress, tokenId, amount, '0x']\n)\n\nconst transaction = {\n to: erc1155TokenAddress,\n data\n}\n\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n
\n
With batching functionality, you can send multiple token transfers in a single native transaction:
\n
const erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n\n// Encode two different ERC-1155 token transfers\nconst data1 = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient1Address, token1Id, amount1, '0x']\n)\nconst data2 = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient2Address, token2Id, amount2, '0x']\n)\n\nconst transaction1 = {\n to: erc1155ContractAddress,\n data: data1\n}\nconst transaction2 = {\n to: erc1155ContractAddress,\n data: data2\n}\n\n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransactionBatch([transaction1, transaction2])\nconsole.log(txnResponse)\n
","isPage":true,"text":"\nSending an ERC-1155 collectible is similar to sending an ERC-20 token.\nThe only notable difference is in the contract standard itself:\nconst erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n \n// Encode the transfer of the collectible to recipient\nconst address = await wallet.getAddress()\nconst data = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipientAddress, tokenId, amount, '0x']\n)\n \nconst transaction = {\n to: erc1155TokenAddress,\n data\n}\n \nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n \nWith batching functionality, you can send multiple token transfers in a single native transaction:\nconst erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n \n// Encode two different ERC-1155 token transfers\nconst data1 = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient1Address, token1Id, amount1, '0x']\n)\nconst data2 = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient2Address, token2Id, amount2, '0x']\n)\n \nconst transaction1 = {\n to: erc1155ContractAddress,\n data: data1\n}\nconst transaction2 = {\n to: erc1155ContractAddress,\n data: data2\n}\n \n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransactionBatch([transaction1, transaction2])\nconsole.log(txnResponse)\n ","title":"Sending ERC-1155 (Collectible) Tokens","titles":[]},"473":{"href":"/solutions/wallets/universal-wallet/examples/09-send-batch-transactions#sending-a-batch-of-transactions","html":"\n
Likewise, bundling multiple transactions to be sent in a single native transaction is equally as easy:
","isPage":true,"text":"\nLikewise, bundling multiple transactions to be sent in a single native transaction is equally as easy:\nconst transaction1 = {\n to: recipient1Address,\n value: 1000000000000000000\n}\n \nconst transaction2 = {\n to: recipient2Address,\n value: 1000000000000000000\n}\n \nconst signer = wallet.getSigner()\nconst response = await signer.sendTransaction([transaction1, transaction2])\nconsole.log(response)\nThe transactions don't have to be the same token or even token standard either.\nYou can mix and match:\nconst erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\nconst erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\nconst erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n \nconst erc20Data = erc20Interface.encodeFunctionData(\n 'transfer', [recipient2Address, amount2]\n)\nconst erc721Data = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient3Address, amount3]\n)\nconst erc1155Data = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient4Address, token4Id, amount4, '0x']\n)\n \nconst transactions = [\n { to: recipient1Address, value: '1000000000000000000' },\n { to: daiContractAddress, data: erc20Data },\n { to: erc721ContractAddress, data: erc721Data },\n { to: erc1155ContractAddress, data: erc1155Data }\n]\n \nconst signer = wallet.getSigner()\nconst response = await signer.sendTransaction(transactions)\nconsole.log(response)","title":"Sending a Batch of Transactions","titles":[]},"474":{"href":"/solutions/wallets/universal-wallet/examples/10-building-backends#building-backends-with-sequence","html":"\n","isPage":true,"text":"\n","title":"Building Backends with Sequence","titles":[]},"475":{"href":"/solutions/wallets/universal-wallet/examples/10-building-backends#nodejs","html":"\n
The 0xsequence package which is available for browser / client use, also works perfectly on nodejs backends\nwritten in Javascript or Typescript.
\n","isPage":false,"text":"\nThe 0xsequence package which is available for browser / client use, also works perfectly on nodejs backends\nwritten in Javascript or Typescript.\n","title":"nodejs","titles":["Building Backends with Sequence",null]},"476":{"href":"/solutions/wallets/universal-wallet/examples/10-building-backends#go","html":"\n
go-sequence is the equivalent of 0xsequence\nbut for Go / Golang backends. In fact, all of Sequence's infrastructure is written in Go and is built with go-sequence.
\n","isPage":false,"text":"\nA complete Sequence SDK is also available in Go: https://github.com/0xsequence/go-sequence.\ngo-sequence is the equivalent of 0xsequence\nbut for Go / Golang backends. In fact, all of Sequence's infrastructure is written in Go and is built with go-sequence.\n","title":"Go","titles":["Building Backends with Sequence",null]},"477":{"href":"/solutions/wallets/universal-wallet/examples/10-building-backends#ethkit","html":"\n
As part of the Sequence open source tools, our team has also built ethkit, which\nis an Ethereum dev toolkit for Go backends. ethkit supports EOA wallets,\nand you can think of it like ethers.js but for Go.
\n","isPage":false,"text":"\nAs part of the Sequence open source tools, our team has also built ethkit, which\nis an Ethereum dev toolkit for Go backends. ethkit supports EOA wallets,\nand you can think of it like ethers.js but for Go.\n","title":"ethkit","titles":["Building Backends with Sequence",null]},"478":{"href":"/solutions/wallets/universal-wallet/examples/10-building-backends#support-for-other-backend-languages","html":"\n
If your backend services are written in a language other than JS or Go, you can still easily integrate Sequence,\nas Sequence is really just a standard Ethereum client library with some extra features. In many cases, the extra\nfeatures are best utilized on the client-side / dapp.
\n
If your situation for example is a Python or Java backend where you'd like to verify signatures from a Sequence Wallet,\nwell then, you can call the standard EIP1271 function for the account address\nfrom your backend.
","isPage":false,"text":"\nIf your backend services are written in a language other than JS or Go, you can still easily integrate Sequence,\nas Sequence is really just a standard Ethereum client library with some extra features. In many cases, the extra\nfeatures are best utilized on the client-side / dapp.\nIf your situation for example is a Python or Java backend where you'd like to verify signatures from a Sequence Wallet,\nwell then, you can call the standard EIP1271 function for the account address\nfrom your backend.\nIf you'd like to use the Sequence's Meta-Transaction capabilities, see Building Relaying Server with Sequence.","title":"Support for other backend languages","titles":["Building Backends with Sequence",null]}},"dirtCount":0,"index":[["|",{"2":{"434":1,"437":1}}],["||",{"2":{"80":4}}],["zellic",{"0":{"428":1}}],["zero",{"0":{"412":1,"413":1},"2":{"408":4,"412":1,"413":1,"414":2}}],["^5",{"2":{"241":1,"370":1}}],["^1",{"2":{"241":1,"370":1}}],["❤️",{"2":{"125":1}}],["🖼️",{"2":{"96":1,"245":1,"373":1}}],["👛",{"2":{"96":1,"245":1,"373":1}}],["🔐🪪",{"2":{"96":1,"245":1,"373":1}}],["⛓️",{"2":{"96":1,"245":1,"373":1}}],["🪙",{"2":{"96":1,"245":1,"373":1}}],["🦊",{"2":{"96":1,"245":1,"373":1}}],["🧰",{"2":{"95":1,"244":1,"372":1}}],["7908",{"2":{"455":1}}],["712",{"0":{"420":1},"2":{"420":1}}],["7f1",{"2":{"139":2}}],["7",{"0":{"337":1},"2":{"85":1,"99":3,"241":1,"242":1,"370":1,"371":1}}],["721",{"0":{"41":1,"233":1,"471":1},"2":{"35":1,"61":1,"233":2,"471":2}}],["5931",{"2":{"455":1}}],["50",{"2":{"443":3}}],["500",{"2":{"80":1}}],["5",{"0":{"229":1,"335":1,"467":1},"2":{"85":1,"99":3,"142":1,"161":1,"191":2,"242":1,"253":1,"263":1,"346":1,"371":1,"390":2,"391":3}}],["~0",{"2":{"73":1}}],["`failedtransactionresponse`",{"2":{"455":1}}],["`wallet",{"2":{"442":1}}],["`walletproxybytecode`",{"2":{"395":1}}],["`mainmodule`",{"2":{"395":1}}],["`authorize",{"2":{"227":1,"465":1}}],["`invalid",{"2":{"220":1,"459":1}}],["`proof",{"2":{"220":1,"459":1}}],["`senttransactionresponse`",{"2":{"455":1}}],["`sequenceconfig`",{"2":{"139":2}}],["`something",{"2":{"80":2}}],["`https",{"2":{"85":3}}],["`block",{"2":{"80":1}}],["`unauthorized",{"2":{"80":1}}],["`unauthorized`",{"2":{"80":1}}],["`unexpected",{"2":{"66":2,"72":1}}],["`$",{"2":{"80":1,"92":2,"366":2,"440":2,"441":2,"442":2,"443":2,"444":2,"454":2,"455":2}}],["`your",{"2":{"77":1}}],["`",{"2":{"66":2,"72":1,"77":1,"80":5,"85":2,"92":2,"167":4,"172":6,"175":4,"220":1,"227":1,"366":2,"440":2,"441":2,"442":3,"443":2,"444":2,"454":2,"455":2,"459":1,"465":1}}],["$",{"2":{"66":2,"72":1,"77":1,"80":4,"85":2,"220":2,"442":1,"459":2}}],["815189234z",{"2":{"443":1}}],["815189174z",{"2":{"443":1}}],["819722082z",{"2":{"443":1}}],["8545",{"2":{"400":1}}],["8",{"0":{"338":1},"2":{"62":1,"139":2}}],["09t18",{"2":{"443":2}}],["03",{"2":{"443":3}}],["02t18",{"2":{"443":4}}],["0a1",{"2":{"139":1}}],["0b3",{"2":{"139":1}}],["0",{"0":{"254":1,"265":1},"2":{"61":1,"83":1,"84":1,"126":3,"129":1,"139":2,"150":2,"158":1,"160":3,"241":3,"248":2,"254":3,"265":3,"346":1,"358":1,"370":3,"400":1,"413":1,"416":1,"421":1,"431":1,"436":1,"444":1,"454":2,"455":1}}],["0x4d4ee1b8583e31fe789eaf2e1b6e011c220c10b6",{"2":{"454":2,"455":1}}],["0x4fbf69aa2a75f9942a768dc8da7804ec965f7bea",{"2":{"390":1,"391":2}}],["0x3c4e11e4dbf23b87c14bd75d0da9c75707392d21",{"2":{"443":2}}],["0x5c4eeb02dabf8976016ab414d617f9a162936dcace3cdef8c69ef6e262ad5ae7",{"2":{"454":1}}],["0x574372ff1a0eede68b5358cce7bbb93155a9dfe0",{"2":{"443":2}}],["0x596af90cecdbf9a768886e771178fd5561dd27ab",{"2":{"390":1,"391":2,"400":1}}],["0xe6b9b21c077f382333220a072e4c44280b873907",{"2":{"424":1}}],["0xec9a7204a43d3f4a82c84fde92d25bfc9110981e",{"2":{"390":1,"391":1}}],["0xd72c236be524ec24f72329317e2785e687105b69",{"2":{"454":1}}],["0xd6043fe6f06d90ec2cb36ca5cd1b193a8515f350",{"2":{"440":1}}],["0xd130b43062d875a4b7af3f8fc036bc6e9d3e1b3e",{"2":{"424":1}}],["0xd01f11855bccb95f88d7a48492f66410d4637313",{"2":{"395":1,"424":1}}],["0x061150e5574716dbb1a2cdf54b3dce9f94395f65",{"2":{"452":1}}],["0x02390f3e6e5fd1c6786cb78fd3027c117a9955a7",{"2":{"424":1}}],["0x0",{"2":{"421":1}}],["0x0000000000000000000000000000000000000000000000000000000000000000",{"2":{"454":1}}],["0x0000000000000000000000001119e72b4af230becebd933d0e07f0eec51d8c2a0000000000000000000000000000000000000000000000000000000000000001",{"2":{"454":1}}],["0x00",{"2":{"85":1,"340":1,"455":1}}],["0xcccccccccccccccccccccccccccccccccccccccc",{"2":{"420":1}}],["0xc2be9cf6d9ee4fd211f88620760e829792659b16",{"2":{"385":2}}],["0xf2e9f728abd65089f25efda5852e605ced377f4e2c89dbf143b124623ed09b2c",{"2":{"454":1}}],["0xff",{"2":{"395":1}}],["0xf9d09d634fb818b05149329c1dccfaea53639d96",{"2":{"395":1,"424":1}}],["0x6b175474e89094c44da98b954eedeac495271d0f",{"2":{"450":1}}],["0x63a21cca14ed7454b9cf6466af422b5c597c6b57",{"2":{"440":1}}],["0x631998e91476da5b870d741192fc5cbc55f5a52e",{"2":{"24":2,"30":1,"39":3,"41":3,"43":3,"47":1,"50":7,"52":3,"56":3,"57":3,"121":1}}],["0x603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3",{"2":{"395":1}}],["0x6192e0fdcd868b3de01c7fbc0ad98baebd7330c1",{"2":{"390":1,"391":2}}],["0x153824576d03629b264683b430bbf9acea1d0975",{"2":{"455":1}}],["0x1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881",{"2":{"454":1}}],["0x1626ba7e",{"2":{"421":2}}],["0x1693ffc74edbb50d6138517fe5cd64fd1c917709",{"2":{"346":1,"385":2}}],["0x17b66009af459dc8ebf37acf8a8b355379be2fe5",{"2":{"43":2}}],["0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",{"2":{"420":1}}],["0xb537a160472183f2150d42eb1c3dd6684a55f74c",{"2":{"346":1,"385":2}}],["0xb392c99d9f8e3e0b248e5c283818be5bf5cecca7",{"2":{"342":1}}],["0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d",{"2":{"61":2}}],["0x9766bf76b2e3e7bcb8c61410a3fc873f1e89b43f",{"2":{"143":2}}],["0x9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6",{"2":{"77":1}}],["0x",{"2":{"80":1,"84":1,"234":3,"235":1,"451":1,"455":1,"472":3,"473":1}}],["0xacc36ed4ef40db74137266e48d863083a5c7e85e2735d69adafcb5b362b6cfc0",{"2":{"454":1}}],["0xa9c88358862211870db6f18bc9b3f6e4f8b3eae7",{"2":{"346":1,"385":2}}],["0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4",{"2":{"43":2}}],["0xabc",{"2":{"23":1,"24":1,"32":1,"37":1}}],["0x7efe6ce415956c5f80c6530cc6cc81b4808f6118",{"2":{"424":1}}],["0x7c0ebabfc394ec6d926e801fe0e69a1f15a7fe4d",{"2":{"43":2}}],["0x7227e371540cf7b8e512544ba6871472031f3335",{"2":{"43":2,"61":1}}],["0x27cabc9700ee6db2797b6ac1e1ece81c72a2cd8d",{"2":{"450":1}}],["0x27a11c1563a5dda238379b95c91b3abbad9c0cf6",{"2":{"62":2}}],["0x2791bca1f2de4661ed88a30c99a7a9449aa84174",{"2":{"43":2,"66":1,"120":1}}],["0x2953399124f0cbb46d2cbacd8a89cf0599974963",{"2":{"43":2}}],["0x839ee023b21f4ffe2294025de0ac30ba7278d6fd",{"2":{"455":2}}],["0x8f3cf7ad23cd3cadbd9735aff958023239c6a063",{"2":{"43":2}}],["0x8bb759bb68995343ff1e9d57ac85ff5c5fb79334",{"2":{"30":1}}],["0x8e3e38fe7367dd3b52d1e281e4e8400447c8d8b9",{"2":{"23":1,"24":1,"32":1,"37":1}}],["0xsequence",{"0":{"194":1},"2":{"23":2,"24":2,"27":5,"28":2,"30":1,"32":2,"37":2,"39":2,"41":2,"43":2,"46":4,"47":2,"56":2,"57":4,"66":2,"72":1,"77":1,"80":5,"85":2,"90":1,"92":1,"93":2,"99":10,"100":2,"101":4,"102":1,"103":1,"117":4,"118":1,"122":1,"124":1,"129":1,"193":1,"194":3,"219":1,"220":4,"225":1,"237":1,"238":2,"241":7,"242":3,"247":1,"248":5,"249":1,"254":4,"257":1,"258":5,"259":1,"265":4,"267":1,"268":2,"275":2,"277":1,"283":1,"285":1,"289":1,"364":1,"366":1,"370":7,"371":3,"419":1,"420":2,"440":1,"441":1,"442":1,"443":1,"444":1,"454":1,"455":1,"458":1,"459":4,"463":1,"475":1,"476":2}}],["qmw5gvygwb98gsn8vjtrwu4pln6jryexnxzknwpphvwtdm",{"2":{"339":1}}],["qmdjzqexj2wnny7pnnn4kauzckjh4va5xhoxmmis919ev3",{"2":{"332":1}}],["qmuqgkka8ew7exiuhnmwz4uoxa11wv7nfjhaogvabassyy",{"2":{"61":1}}],["qr",{"2":{"216":2}}],["quantstamp",{"0":{"426":1},"2":{"425":1}}],["quantityremaining",{"2":{"385":1}}],["quantityraw",{"2":{"121":1}}],["quantity",{"2":{"385":1}}],["quicker",{"2":{"159":1}}],["quickly",{"2":{"88":1,"345":1,"362":1,"369":1}}],["quickstart",{"0":{"86":1,"343":1,"360":1,"367":1},"1":{"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"344":1,"345":1,"346":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"368":1,"369":1,"370":1,"371":1},"2":{"188":1,"192":1}}],["quite",{"2":{"49":1}}],["quot",{"2":{"4":4,"7":8,"23":26,"24":30,"28":8,"30":16,"32":24,"37":30,"39":28,"41":26,"42":2,"43":46,"47":8,"50":78,"55":2,"56":44,"57":56,"61":93,"62":68,"66":8,"72":8,"73":4,"75":2,"77":14,"80":40,"81":8,"83":12,"84":12,"85":2,"129":8,"130":14,"131":4,"133":2,"139":58,"143":8,"144":10,"150":12,"153":2,"154":2,"157":2,"158":2,"167":14,"179":2,"194":38,"205":2,"206":2,"207":12,"208":2,"209":6,"210":4,"211":2,"216":2,"219":2,"241":13,"242":4,"249":6,"289":8,"290":2,"291":2,"304":4,"305":4,"308":4,"310":4,"312":4,"314":6,"323":8,"325":4,"331":12,"332":12,"335":2,"336":2,"341":4,"342":2,"346":32,"366":4,"370":13,"371":4,"385":60,"388":4,"389":10,"390":28,"395":20,"400":6,"419":4,"421":2,"425":6,"429":2,"430":2,"435":2,"436":4,"438":2,"440":14,"441":10,"442":26,"443":86,"444":6,"449":2,"450":6,"451":6,"452":6,"454":74,"455":76,"458":2}}],["queried",{"2":{"181":1,"385":1,"415":1,"416":1}}],["queries",{"2":{"27":1,"28":1,"35":1,"322":1}}],["querycontractmessagesender",{"2":{"325":1}}],["querycontract",{"2":{"325":2}}],["queryclientprovider",{"2":{"100":3,"101":5,"117":2,"124":2}}],["queryclient",{"2":{"100":4,"101":5,"117":1,"124":1}}],["querying",{"0":{"325":1},"2":{"30":1,"50":1,"61":1,"62":1,"64":1,"322":1,"325":1,"327":1}}],["query",{"0":{"10":1},"2":{"2":1,"23":1,"24":1,"25":1,"27":1,"28":1,"32":1,"33":3,"37":1,"39":6,"41":6,"42":2,"45":1,"49":3,"50":6,"55":2,"99":3,"100":1,"101":1,"325":3}}],["questions",{"2":{"220":1,"243":1,"459":1}}],["question",{"2":{"0":1}}],["911",{"2":{"339":1}}],["9",{"0":{"339":1},"2":{"61":3}}],["6492",{"2":{"220":1,"459":1}}],["6",{"0":{"230":1,"336":1,"468":1},"2":{"134":1,"347":1,"379":1}}],["6f1",{"2":{"127":1}}],["66597",{"2":{"121":1}}],["65548",{"2":{"62":3}}],["65535",{"2":{"431":1}}],["65535required",{"2":{"388":1}}],["65539",{"2":{"56":2,"57":1}}],["65538",{"2":{"56":2,"57":1}}],["65537",{"2":{"56":2,"57":1}}],["65556",{"2":{"50":1}}],["6x",{"2":{"50":1,"62":1}}],["230",{"2":{"442":1}}],["24th",{"2":{"426":1}}],["2nd",{"2":{"426":1}}],["255",{"2":{"389":1}}],["2fa",{"2":{"134":2}}],["22",{"2":{"50":2,"443":3}}],["2123",{"2":{"443":2}}],["21",{"2":{"50":2,"52":1}}],["2",{"0":{"71":1,"77":1,"135":1,"226":1,"294":1,"332":1,"358":1,"464":1},"1":{"78":1,"79":1,"136":1,"137":1,"138":1,"139":1,"140":1},"2":{"50":1,"56":1,"57":2,"62":1,"77":1,"85":1,"99":3,"129":1,"139":2,"161":1,"191":1,"292":1,"331":1,"346":1,"356":2,"358":2,"390":2,"391":4,"393":2,"436":1}}],["2020",{"2":{"426":1,"427":1}}],["2023",{"2":{"139":4,"428":1,"443":4}}],["2022",{"2":{"139":3}}],["2021",{"2":{"127":1,"139":1,"426":1}}],["200000000000000000000",{"2":{"450":1}}],["200",{"2":{"80":1,"212":1,"450":1}}],["20",{"0":{"232":1,"470":1},"2":{"50":8,"52":2,"66":1,"73":2,"74":1,"232":3,"233":1,"234":1,"470":3,"471":1,"472":1}}],["42",{"2":{"443":4}}],["42161",{"2":{"66":1,"72":1,"450":1,"454":1}}],["401",{"2":{"80":2}}],["400",{"2":{"80":6}}],["4",{"0":{"85":1,"228":1,"334":1,"466":1},"2":{"50":1,"74":1,"75":1,"346":1,"390":1,"420":1}}],["486",{"2":{"4":8}}],["🌄",{"2":{"26":1}}],["\tmessage",{"2":{"420":1}}],["\tdomain",{"2":{"420":1}}],["\tprimarytype",{"2":{"420":1}}],["\ttypes",{"2":{"420":1}}],["\ttry",{"2":{"85":1}}],["\ttokenbalances",{"2":{"23":1,"32":1}}],["\treturn",{"2":{"85":1}}],["\tconst",{"2":{"85":12}}],["\tcontractaddress",{"2":{"24":1,"39":1,"41":1}}],["\t\twallet",{"2":{"420":1}}],["\t\tverifyingcontract",{"2":{"420":1}}],["\t\tversion",{"2":{"420":1}}],["\t\tcount",{"2":{"420":1}}],["\t\tcontractaddress",{"2":{"39":1,"41":1}}],["\t\tchainid",{"2":{"420":1}}],["\t\tname",{"2":{"420":2}}],["\t\tnetworks",{"2":{"85":1}}],["\t\tperson",{"2":{"420":1}}],["\t\tposition",{"2":{"105":1}}],["\t\tprojectaccesskey",{"2":{"85":1}}],["\t\tdefaulttheme",{"2":{"105":1}}],["\t\tthrow",{"2":{"85":1}}],["\t\treturn",{"2":{"85":1}}],["\t\tsigner",{"2":{"85":1}}],["\t\tsettings",{"2":{"85":1}}],["\t\t",{"2":{"85":3,"105":1,"420":1}}],["\t\t\t\t",{"2":{"85":1}}],["\t\t\t\t\turl",{"2":{"85":1}}],["\t\t\t\tprovider",{"2":{"85":1}}],["\t\t\t\turl",{"2":{"85":1}}],["\t\t\trelayer",{"2":{"85":1}}],["\t\t\trpcurl",{"2":{"85":1}}],["\t\t\tprovider",{"2":{"85":1}}],["\t\t\t",{"2":{"85":2,"420":3}}],["\t\taccountaddress",{"2":{"37":1}}],["\t\tlog",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1}}],["\tfilter",{"2":{"37":2,"39":2,"41":1}}],["\tfmt",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1}}],["\tverifiedonly",{"2":{"28":1}}],["\tnftbalances",{"2":{"24":1}}],["\tif",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1}}],["\tincludemetadata",{"2":{"23":2,"24":2,"32":1,"37":2,"39":1,"41":2}}],["\tseqindexer",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1}}],["\t",{"2":{"23":6,"24":6,"28":1,"32":7,"37":9,"39":9,"41":8,"43":1,"47":1,"56":1,"57":2,"85":11,"105":1,"420":3}}],["\taccountaddress",{"2":{"23":1,"24":1,"32":1,"37":1}}],["+=",{"2":{"141":1,"142":2,"153":1,"154":2}}],["+1",{"2":{"62":2}}],["+",{"2":{"8":1,"24":1,"129":1,"131":1,"167":1,"179":1,"193":1,"214":1,"247":2,"256":2,"257":3,"266":2,"267":2,"273":1,"283":1,"285":1,"322":1,"339":1,"384":1,"391":4,"419":2,"439":2,"445":1}}],["==",{"2":{"436":1}}],["===",{"2":{"66":1,"80":10,"230":1,"468":1}}],["=0",{"2":{"256":1}}],["=",{"0":{"254":1,"265":1},"2":{"7":3,"23":7,"24":8,"27":2,"28":5,"32":7,"37":8,"39":9,"41":8,"43":4,"46":1,"47":2,"56":4,"57":8,"66":20,"72":9,"73":6,"77":8,"80":14,"81":4,"82":1,"85":17,"92":1,"100":8,"101":10,"102":6,"103":5,"105":1,"117":2,"118":6,"119":1,"120":2,"123":4,"124":3,"145":2,"147":2,"149":2,"152":1,"154":2,"167":7,"172":2,"175":2,"194":11,"195":1,"218":2,"219":2,"220":6,"225":3,"226":3,"227":2,"228":3,"229":2,"230":1,"231":3,"232":12,"233":13,"234":13,"235":13,"248":1,"249":2,"254":1,"259":1,"265":1,"269":3,"277":2,"278":5,"288":3,"289":3,"293":2,"294":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":2,"302":1,"304":2,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":2,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":2,"322":1,"323":10,"325":6,"326":2,"327":7,"366":1,"385":2,"391":3,"393":3,"395":6,"400":4,"408":1,"413":1,"414":1,"419":3,"420":4,"421":1,"424":1,"437":2,"440":3,"441":6,"442":14,"443":2,"444":2,"448":1,"449":2,"450":2,"451":1,"452":2,"454":2,"455":2,"457":2,"458":2,"459":6,"463":3,"464":3,"465":2,"466":3,"467":2,"468":1,"469":3,"470":12,"471":13,"472":13,"473":13}}],["yet",{"2":{"159":1,"413":1,"416":1}}],["yes",{"2":{"130":1}}],["y",{"2":{"126":1,"160":1}}],["yarn",{"2":{"7":1,"27":1,"99":1,"117":1,"241":1,"248":1,"254":1,"258":1,"265":1,"268":1,"370":1}}],["you",{"2":{"1":1,"3":4,"4":5,"6":2,"23":2,"24":1,"25":1,"26":3,"27":3,"28":2,"32":1,"33":1,"34":1,"35":1,"37":1,"39":3,"41":2,"46":1,"49":1,"50":6,"53":1,"62":1,"63":2,"65":2,"66":5,"67":4,"73":4,"74":3,"75":3,"76":1,"77":4,"78":1,"82":2,"83":3,"84":3,"85":2,"90":1,"91":2,"92":2,"94":1,"97":1,"98":1,"99":1,"102":1,"104":1,"105":1,"122":2,"123":3,"124":2,"127":1,"129":5,"130":6,"131":8,"132":4,"133":2,"136":1,"137":1,"139":4,"141":5,"142":6,"143":3,"144":3,"145":5,"146":3,"147":5,"148":3,"149":5,"150":13,"151":3,"152":1,"153":4,"154":8,"155":4,"157":1,"158":5,"159":4,"163":4,"164":2,"165":7,"167":5,"168":3,"169":5,"172":4,"174":7,"175":2,"177":1,"178":1,"179":2,"180":3,"181":1,"182":2,"187":4,"188":2,"190":2,"191":2,"193":2,"194":9,"216":1,"219":4,"220":4,"230":1,"231":1,"232":2,"233":1,"234":1,"235":1,"239":1,"240":4,"241":3,"243":6,"246":1,"248":1,"254":1,"265":1,"290":2,"294":2,"295":1,"299":3,"300":3,"301":2,"302":4,"304":2,"321":1,"322":4,"323":7,"324":2,"325":3,"326":2,"327":4,"328":2,"330":1,"331":4,"334":1,"337":1,"338":4,"339":4,"340":1,"341":1,"342":5,"347":2,"355":1,"357":3,"358":2,"364":1,"365":2,"366":2,"370":2,"374":1,"379":2,"439":3,"441":1,"442":2,"447":1,"452":1,"458":4,"459":4,"468":1,"469":1,"470":2,"471":1,"472":1,"473":1,"477":1,"478":4}}],["yourself",{"2":{"357":1,"439":1}}],["yoursite",{"2":{"194":2,"206":1}}],["yours",{"2":{"187":1}}],["yourcallshowauthfailurescreen",{"2":{"167":1}}],["yourcallreadytoreceivecode",{"2":{"167":1}}],["your",{"0":{"125":1,"194":1,"214":1,"244":1,"331":1,"333":1,"336":1,"372":1},"1":{"245":1,"373":1},"2":{"0":1,"3":2,"4":3,"5":1,"6":2,"7":2,"8":2,"11":1,"22":1,"23":1,"25":2,"26":2,"28":1,"30":4,"31":1,"32":1,"33":3,"35":1,"36":1,"38":1,"40":1,"42":1,"46":2,"47":1,"49":1,"50":1,"55":1,"59":2,"63":1,"65":2,"66":11,"67":3,"72":3,"73":2,"74":1,"75":5,"77":7,"78":2,"80":4,"81":2,"82":1,"83":4,"84":5,"95":2,"96":3,"97":1,"98":1,"100":3,"117":1,"123":2,"124":2,"125":2,"126":1,"129":3,"130":2,"131":3,"132":3,"133":2,"139":1,"141":1,"144":2,"145":1,"147":1,"149":1,"150":1,"151":1,"154":4,"155":2,"157":2,"158":3,"159":1,"165":5,"167":1,"168":4,"169":1,"172":4,"174":1,"176":1,"177":1,"179":2,"180":2,"181":1,"182":2,"186":2,"187":7,"189":1,"190":1,"191":1,"192":1,"193":2,"194":8,"206":1,"216":1,"219":4,"220":5,"240":3,"241":4,"243":2,"244":2,"245":3,"246":1,"290":1,"302":3,"303":1,"321":1,"327":2,"328":1,"330":1,"331":2,"332":2,"333":2,"334":1,"335":3,"336":2,"337":1,"338":3,"340":2,"341":1,"342":1,"357":1,"358":1,"370":4,"372":2,"373":3,"374":1,"377":1,"419":1,"420":1,"439":1,"440":1,"447":1,"458":4,"459":5,"478":3}}],["range",{"2":{"308":1}}],["randomly",{"2":{"75":1,"76":1}}],["randomnoncespace2",{"2":{"73":2}}],["randomnoncespace1",{"2":{"73":2}}],["randombytes",{"2":{"73":2,"226":1,"464":1}}],["random",{"2":{"62":1,"73":1,"293":1,"407":1,"432":1}}],["rainbow",{"2":{"257":1,"259":1,"351":1}}],["rainbowkit",{"0":{"257":1},"1":{"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1},"2":{"243":1,"251":1,"257":3,"258":3,"259":3,"261":1,"264":1,"266":1}}],["ramps",{"0":{"347":1,"379":1}}],["ramp",{"2":{"194":2,"210":1,"347":5,"379":5}}],["ration",{"2":{"206":1}}],["ratio",{"2":{"194":2}}],["rather",{"2":{"142":1,"322":1}}],["raw",{"2":{"143":2}}],["rawtransactions",{"2":{"145":1,"147":1,"149":1}}],["rawtransaction",{"0":{"143":1},"2":{"143":1,"145":2,"147":2,"149":2,"151":2}}],["risks",{"2":{"384":1}}],["ripped",{"2":{"130":1}}],["right",{"2":{"108":3,"126":1,"158":1,"182":1,"190":1,"437":1}}],["rotation",{"2":{"353":1}}],["rotate",{"2":{"172":1}}],["root",{"2":{"132":1,"442":1}}],["router=",{"2":{"442":1}}],["routerprovider",{"2":{"442":2}}],["router",{"2":{"255":6,"256":2,"264":6,"266":2,"442":7}}],["route",{"2":{"131":1,"322":1}}],["robust",{"2":{"95":1,"244":1,"372":1}}],["role",{"2":{"77":6}}],["runtime",{"2":{"396":1}}],["runs",{"2":{"194":2}}],["running",{"2":{"179":1,"195":1,"289":1}}],["run",{"2":{"75":1,"127":1,"179":4,"193":1}}],["rpcurl",{"2":{"7":2,"85":2,"220":3,"459":3}}],["rpc",{"0":{"53":1,"54":1},"2":{"6":2,"7":2,"23":2,"24":2,"26":2,"30":3,"32":2,"37":2,"39":2,"41":2,"43":2,"49":6,"51":3,"53":2,"54":1,"56":2,"57":4,"302":2,"346":1,"355":1,"385":2}}],["revertreason",{"2":{"454":2}}],["revert",{"2":{"410":1}}],["revertonerror",{"0":{"410":1},"2":{"408":2,"410":1,"413":1,"414":1}}],["reverted",{"2":{"66":1,"454":1}}],["rejected",{"2":{"399":1,"407":1}}],["region",{"2":{"347":1,"379":1}}],["registers",{"2":{"179":1}}],["registersession",{"2":{"172":1,"174":1}}],["registering",{"2":{"173":1}}],["registered",{"2":{"168":1,"174":1}}],["register",{"2":{"135":2,"172":2}}],["registry",{"2":{"33":1}}],["rewrite",{"2":{"327":2}}],["retrieving",{"0":{"415":1,"416":1},"1":{"416":1}}],["retrieve",{"2":{"194":1,"230":1,"231":1,"385":1,"468":1,"469":1}}],["returning",{"2":{"66":2,"452":1}}],["returns",{"2":{"42":1,"74":2,"145":1,"147":1,"149":1,"296":1,"402":1,"416":1,"421":1,"443":1,"448":1,"449":4,"450":2}}],["return",{"0":{"404":1},"2":{"4":1,"23":3,"24":1,"37":1,"41":1,"61":1,"62":1,"66":2,"72":1,"80":17,"83":1,"84":1,"85":2,"100":1,"101":2,"102":1,"103":1,"117":1,"118":1,"123":2,"124":1,"143":1,"200":1,"288":2,"289":2,"315":1,"320":1,"325":1,"415":1,"421":5,"437":4,"442":3,"452":1,"453":1,"454":1}}],["returned",{"2":{"4":2,"30":1,"57":1,"135":1,"174":1,"204":1,"219":1,"419":1,"420":1,"455":1,"458":1}}],["remaining",{"2":{"381":1}}],["remember",{"2":{"179":1,"440":1}}],["removed",{"2":{"384":1}}],["remove",{"2":{"384":1}}],["removing",{"2":{"150":1}}],["remoteconfigtracker",{"2":{"220":1,"459":1}}],["remotely",{"2":{"193":1}}],["remote",{"0":{"14":1},"2":{"220":1,"419":1,"420":1,"459":1}}],["relevant",{"2":{"454":1}}],["release",{"2":{"131":1}}],["reload",{"2":{"342":1}}],["rely",{"2":{"124":1}}],["relayed",{"2":{"72":1}}],["relayerurl",{"2":{"85":2}}],["relayer",{"0":{"8":1,"74":1},"1":{"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"8":6,"11":2,"66":2,"73":1,"74":2,"77":4,"85":1}}],["relaying",{"0":{"65":1},"1":{"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1},"2":{"67":1,"240":1,"478":1}}],["redirect",{"2":{"197":1}}],["reducing",{"2":{"172":1}}],["reduced",{"2":{"435":1}}],["reduce",{"2":{"23":1,"24":1,"37":1,"41":1,"223":1,"392":1,"461":1}}],["reddit",{"2":{"141":1,"142":1,"153":1,"154":1}}],["redeploy",{"2":{"83":1,"85":1}}],["recursive",{"2":{"437":1}}],["recent",{"2":{"255":1,"264":1,"307":1}}],["receipts",{"0":{"453":1},"1":{"454":1,"455":1},"2":{"300":1,"453":2,"454":1}}],["receipt",{"2":{"151":1,"298":1,"300":1,"320":1,"321":1,"323":5,"326":1,"327":2,"454":5,"455":1}}],["receives",{"2":{"449":1}}],["received",{"2":{"141":1,"174":1}}],["receive",{"2":{"77":1,"134":1,"151":1,"154":1,"168":1,"299":2,"300":2,"322":1,"324":1}}],["recovery",{"2":{"353":1,"359":1}}],["recoveredsessionaddress",{"2":{"230":2,"468":2}}],["recognize",{"2":{"131":1,"154":1}}],["recommendations",{"2":{"384":1}}],["recommended",{"0":{"129":1},"1":{"130":1},"2":{"142":1,"144":1,"145":1,"147":1,"149":1,"150":1,"153":1,"154":1,"259":1,"288":1,"289":1,"301":1,"304":1,"314":1,"321":1,"322":1,"327":1}}],["recommend",{"2":{"27":1,"30":1,"46":1,"49":1,"51":1,"63":1,"133":2,"150":1,"152":1,"154":1,"191":1}}],["recipient4address",{"2":{"235":1,"473":1}}],["recipient3address",{"2":{"235":1,"473":1}}],["recipient2address",{"2":{"232":1,"233":1,"234":1,"235":2,"470":1,"471":1,"472":1,"473":2}}],["recipient2",{"2":{"73":1}}],["recipient1address",{"2":{"232":1,"233":1,"234":1,"235":2,"470":1,"471":1,"472":1,"473":2}}],["recipient1",{"2":{"73":1}}],["recipient",{"2":{"66":1,"232":1,"233":1,"234":1,"450":1,"470":1,"471":1,"472":1}}],["recipientaddress",{"2":{"66":1,"72":1,"231":1,"232":1,"233":1,"234":1,"321":1,"469":1,"470":1,"471":1,"472":1}}],["reports",{"2":{"425":1}}],["repo",{"2":{"214":1}}],["repository",{"2":{"75":1,"104":1,"442":1}}],["replay",{"2":{"201":1,"442":1}}],["replaced",{"2":{"155":1}}],["replace",{"0":{"221":1},"2":{"7":1,"83":1,"84":1,"130":1,"132":1,"139":1,"155":1,"381":1,"384":1,"438":1}}],["represent",{"2":{"433":1}}],["represents",{"2":{"183":1,"185":1,"413":1,"435":1,"436":1}}],["represented",{"2":{"64":1,"143":2,"434":1}}],["reflect",{"2":{"216":1}}],["referencing",{"2":{"399":1,"407":1,"412":1}}],["references",{"2":{"27":1,"28":1,"425":1}}],["reference",{"0":{"49":1},"1":{"50":1,"51":1,"52":1,"53":1,"54":1},"2":{"26":2,"53":2,"133":1,"145":1,"147":1,"149":1}}],["referred",{"2":{"148":1}}],["refer",{"2":{"90":1,"100":1,"123":1,"176":1,"177":1,"364":1}}],["refreshedat",{"2":{"443":2}}],["refreshes",{"2":{"158":1}}],["refreshjobstatus",{"2":{"57":3}}],["refreshjob",{"2":{"57":1}}],["refresh",{"0":{"202":1},"2":{"57":3,"58":2,"202":2,"342":3}}],["refreshing",{"0":{"57":1},"1":{"58":1}}],["rendered",{"2":{"205":1,"287":1,"288":1,"289":4,"407":1,"413":1}}],["rendering",{"2":{"37":1,"255":1,"264":1,"287":1,"288":2}}],["render",{"2":{"33":2,"41":1,"287":1,"410":1,"442":1}}],["reason",{"2":{"413":1,"454":1,"455":1}}],["reasons",{"2":{"407":1}}],["reaches",{"2":{"436":1}}],["reached",{"2":{"419":1,"420":1}}],["reach",{"2":{"159":1,"220":1,"243":1,"459":1}}],["reactdom",{"2":{"442":1}}],["react",{"0":{"104":1,"274":1},"1":{"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1},"2":{"99":3,"100":1,"101":1,"103":1,"243":1,"274":3,"275":1,"277":2,"278":1,"282":1,"442":8}}],["really",{"2":{"240":1,"304":1,"478":1}}],["realm",{"2":{"95":1,"151":1,"244":1,"372":1}}],["real",{"2":{"30":1,"33":1,"181":2,"355":1}}],["reader",{"2":{"220":1,"459":1}}],["reading",{"0":{"400":1},"2":{"152":1}}],["readable",{"2":{"144":1,"150":1}}],["ready",{"2":{"97":1,"168":1,"246":1,"337":1,"342":1,"374":1}}],["read",{"0":{"152":1},"2":{"26":1,"45":1,"53":1,"61":1,"73":1,"131":2,"144":2,"194":1,"325":1,"342":1,"400":1}}],["re",{"2":{"27":1,"33":1,"46":1,"65":1,"74":1,"97":1,"126":1,"141":2,"142":1,"144":1,"150":3,"153":1,"154":1,"160":1,"169":1,"193":1,"202":1,"246":1,"374":1,"438":1}}],["resource",{"2":{"130":1}}],["resources",{"2":{"129":1,"132":6}}],["res",{"2":{"80":4,"139":2,"385":3,"440":2}}],["resulting",{"2":{"419":1,"420":1,"421":1}}],["result",{"2":{"50":1,"74":1,"76":1,"77":1,"142":2,"143":1,"154":3,"164":2,"172":1,"325":1,"398":1,"436":1,"449":2,"455":1}}],["results",{"2":{"30":3,"158":1}}],["restofonboardparams",{"2":{"269":1}}],["restwallets",{"2":{"269":1}}],["restarted",{"2":{"139":1}}],["rest",{"0":{"49":1,"52":1},"1":{"50":1,"51":1,"52":1,"53":1,"54":1},"2":{"45":1,"49":3,"51":2,"52":1,"288":1,"289":1,"294":1,"357":1,"401":1}}],["respect",{"2":{"421":1}}],["respectively",{"2":{"436":1,"452":1}}],["respective",{"2":{"29":1,"48":1,"243":1}}],["responsibility",{"2":{"407":1,"436":1}}],["responsible",{"2":{"165":1}}],["responsive",{"2":{"172":1,"302":1}}],["responses",{"2":{"50":1}}],["response",{"0":{"454":1,"455":1},"2":{"23":1,"24":1,"37":2,"41":1,"50":2,"61":1,"80":19,"175":2,"235":4,"322":1,"385":1,"454":2,"455":2,"473":4}}],["resilient",{"2":{"6":1,"33":1}}],["requiring",{"2":{"194":1,"222":1,"223":1,"327":1,"452":1,"460":1,"461":1}}],["requirefreshsigner",{"2":{"424":1}}],["requirements",{"0":{"127":1,"161":1},"2":{"135":1}}],["required",{"2":{"82":1,"126":1,"138":1,"167":1,"193":1,"311":1,"322":1,"356":1,"358":1,"430":1,"436":1,"450":1}}],["require",{"2":{"8":1,"175":1,"220":1,"223":1,"287":1,"289":1,"327":1,"383":1,"412":1,"438":1,"440":1,"446":1,"447":1,"459":1,"461":1}}],["requires",{"2":{"2":1,"3":1,"5":1,"23":1,"27":1,"43":1,"46":1,"56":1,"155":1,"172":1,"231":1,"241":1,"302":1,"370":1,"450":1,"469":1}}],["requests",{"0":{"185":1},"2":{"11":1,"26":1,"53":1,"77":1,"180":1,"181":1,"185":1,"216":1,"302":1}}],["request",{"2":{"3":1,"4":1,"5":1,"23":1,"24":1,"32":1,"37":1,"39":1,"41":1,"42":1,"43":1,"50":2,"55":1,"56":1,"57":3,"80":20,"83":1,"85":6,"125":1,"151":1,"216":1,"346":1,"385":1,"454":1,"455":1}}],["vulnerate",{"2":{"359":1}}],["v6",{"0":{"274":1},"1":{"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1},"2":{"274":2,"275":1,"277":1,"282":1}}],["v3",{"2":{"220":1,"459":1}}],["vocs",{"0":{"221":1}}],["volume",{"2":{"181":1}}],["void",{"2":{"141":1,"142":3,"153":2,"154":3,"167":5,"175":2}}],["v2",{"2":{"66":2,"220":2,"284":1,"430":1,"459":2}}],["v1",{"2":{"66":1}}],["v18",{"2":{"27":1,"46":1}}],["ve",{"2":{"59":1,"63":1,"130":1,"136":1,"137":1,"141":2,"145":1,"146":1,"147":1,"149":1,"150":1,"158":1,"167":2,"168":1,"172":2,"174":1,"193":2,"243":1,"290":1,"302":1,"327":1,"338":1,"341":1}}],["verifies",{"2":{"421":1}}],["verified",{"2":{"23":1,"24":1,"30":3,"37":1,"41":1,"142":1,"198":1,"359":1,"421":1}}],["verifiedonly",{"2":{"23":2,"24":2,"30":2,"37":2,"41":2}}],["verifiable",{"2":{"223":1,"461":1}}],["verification",{"0":{"421":1},"2":{"80":1,"418":1,"446":1,"447":1}}],["verifying",{"2":{"358":1}}],["verifymessage",{"2":{"230":1,"468":1}}],["verify",{"0":{"228":1,"230":1,"466":1,"468":1},"2":{"80":5,"219":2,"220":1,"228":1,"230":1,"240":1,"357":1,"458":2,"459":1,"466":1,"468":1,"478":1}}],["version=",{"2":{"139":2}}],["versioning",{"2":{"126":1,"160":1}}],["versions",{"0":{"254":1,"265":1,"288":1},"2":{"66":1,"139":3,"256":1,"274":1,"287":1}}],["version",{"0":{"289":1},"2":{"66":2,"126":3,"130":1,"131":1,"158":1,"160":3,"241":1,"248":2,"254":2,"256":2,"265":2,"287":1,"370":1}}],["versus",{"2":{"66":1}}],["versa",{"2":{"63":1}}],["very",{"2":{"30":1,"132":1,"143":1,"154":1,"175":1,"179":1,"193":1}}],["v",{"2":{"57":2}}],["vs",{"0":{"63":1},"2":{"49":1}}],["virtual",{"2":{"352":1,"421":1}}],["vision",{"2":{"441":1}}],["visibility",{"2":{"172":1}}],["visible",{"2":{"172":1,"347":1,"379":1}}],["visualizations",{"2":{"181":1}}],["viem",{"2":{"99":4,"254":1,"265":1}}],["viewable",{"2":{"142":1}}],["viewer",{"0":{"84":1},"2":{"84":1}}],["view",{"2":{"26":1,"76":1,"115":3,"139":2,"165":1,"172":2,"337":1,"402":1,"421":1,"454":1,"455":1}}],["vice",{"2":{"63":1}}],["via",{"0":{"216":1},"2":{"57":2,"58":1,"96":1,"122":1,"131":3,"132":1,"135":2,"154":2,"158":1,"180":1,"183":1,"184":1,"187":1,"193":4,"216":3,"242":1,"245":1,"248":1,"258":1,"275":1,"297":1,"298":1,"299":1,"300":1,"327":1,"347":3,"358":1,"371":1,"373":1,"379":3,"381":1,"447":1}}],["video",{"2":{"4":2,"188":1,"243":1}}],["vary",{"2":{"241":1,"370":1}}],["vars",{"2":{"81":2}}],["varies",{"2":{"400":1}}],["variety",{"2":{"8":1,"26":1,"186":1,"188":1,"190":1}}],["variable",{"2":{"150":1}}],["variables",{"0":{"81":1},"2":{"80":1,"81":1,"150":1,"175":2}}],["variation",{"2":{"145":1,"147":1,"149":1}}],["various",{"2":{"99":1,"108":1,"256":1,"386":1}}],["valuable",{"2":{"180":1}}],["valueasstring",{"2":{"150":2,"151":1}}],["value=",{"2":{"139":2}}],["value",{"0":{"412":1},"2":{"61":8,"62":1,"84":1,"143":4,"144":1,"182":1,"198":1,"231":1,"232":2,"234":2,"235":5,"281":1,"324":1,"400":1,"408":2,"412":1,"414":1,"421":3,"431":1,"432":1,"437":2,"450":1,"451":1,"452":1,"454":1,"455":2,"469":1,"470":2,"472":2,"473":5}}],["values",{"0":{"404":1},"2":{"4":1,"107":1,"108":1,"113":1,"114":1,"132":1,"143":1,"150":1,"158":1,"304":1,"305":1,"308":1,"310":1,"312":1,"314":1,"395":1}}],["validity",{"2":{"408":1}}],["valid`",{"2":{"220":1,"459":1}}],["validating",{"2":{"220":1,"436":1,"459":1}}],["validations",{"0":{"451":1}}],["validation",{"0":{"401":1,"445":1,"448":1,"449":1,"452":1},"1":{"402":1,"403":1,"404":1,"446":1,"447":1,"448":1,"449":2,"450":3,"451":2,"452":1},"2":{"80":1,"401":1,"438":1,"440":1,"447":1,"448":2,"449":1,"450":5,"451":3,"452":4}}],["validatesession",{"2":{"449":2}}],["validatesequencewalletproof",{"2":{"220":2,"459":2}}],["validates",{"2":{"402":1,"438":1}}],["validated",{"2":{"392":2,"403":1,"407":1,"449":1}}],["validate",{"2":{"220":1,"395":1,"401":1,"402":1,"421":2,"446":1,"449":1,"459":1}}],["validator",{"2":{"220":3,"459":3}}],["valid",{"0":{"391":1},"2":{"80":2,"167":1,"174":1,"194":1,"230":1,"340":1,"385":1,"388":1,"407":1,"413":1,"421":4,"430":1,"431":1,"435":1,"436":1,"443":1,"449":1,"468":1}}],["joined",{"2":{"419":1,"420":1}}],["job",{"2":{"57":2}}],["jobid",{"2":{"57":1}}],["july",{"2":{"426":1}}],["jump",{"2":{"190":1}}],["just",{"2":{"30":1,"50":1,"64":1,"67":1,"84":1,"96":1,"130":1,"141":1,"150":2,"165":1,"167":1,"172":1,"193":3,"219":1,"240":1,"245":1,"341":1,"373":1,"458":1,"478":1}}],["java",{"2":{"240":1,"478":1}}],["javascript",{"2":{"26":1,"77":1,"220":1,"237":1,"459":1,"475":1}}],["jacket",{"2":{"61":1}}],["jpg",{"2":{"50":1}}],["js",{"0":{"27":1,"46":1,"214":2,"242":1,"287":1,"288":1,"289":1,"371":1},"2":{"23":1,"24":1,"26":1,"27":1,"32":1,"37":1,"39":1,"41":1,"43":1,"46":1,"53":1,"56":1,"57":2,"94":1,"193":2,"239":1,"240":1,"241":3,"242":3,"243":1,"287":2,"289":1,"370":1,"371":3,"385":1,"477":1,"478":1}}],["jsonrpcprovider",{"2":{"7":1,"77":1,"85":2,"220":1,"400":1,"459":1}}],["json",{"2":{"4":2,"23":3,"24":3,"32":3,"37":3,"39":3,"41":3,"43":3,"50":1,"56":3,"57":6,"61":1,"62":1,"75":1,"80":5,"83":1,"84":1,"131":2,"241":2,"331":3,"332":2,"333":1,"334":1,"338":1,"339":3,"340":1,"346":1,"370":2,"385":7}}],["jwt",{"2":{"3":1,"4":1,"134":1}}],["1699442705",{"2":{"455":1}}],["1699442705965",{"2":{"455":1}}],["1699443005",{"2":{"455":1}}],["160",{"2":{"434":1}}],["191",{"0":{"419":1},"2":{"419":1}}],["11",{"0":{"341":1},"2":{"443":4}}],["1155",{"0":{"41":1,"234":1,"472":1},"2":{"23":2,"35":1,"50":2,"61":2,"62":2,"234":2,"336":1,"338":1,"472":2}}],["18",{"2":{"143":2,"144":1}}],["102951017z",{"2":{"443":1}}],["102950917z",{"2":{"443":1}}],["109787921z",{"2":{"443":1}}],["109234880945084120673",{"2":{"443":4}}],["10",{"0":{"340":1},"2":{"443":2,"449":1}}],["10^decimals",{"2":{"143":1}}],["10^18",{"2":{"143":1}}],["100",{"2":{"121":1,"212":1}}],["1000000000000000000",{"2":{"143":1,"231":1,"235":3,"469":1,"473":3}}],["10000000000",{"2":{"120":1}}],["1447300",{"2":{"139":1}}],["14",{"2":{"129":1}}],["1271",{"2":{"389":1,"407":1,"418":1}}],["123",{"2":{"201":1,"339":2}}],["123456",{"2":{"441":1,"449":1}}],["1234",{"2":{"57":3}}],["1200x400",{"2":{"194":2,"206":1}}],["12",{"0":{"254":1,"265":1,"342":1},"2":{"62":2,"254":1,"256":1,"265":1,"395":1}}],["158456331411102687640546264635",{"2":{"61":1}}],["13+",{"2":{"287":1}}],["13",{"0":{"289":1},"2":{"287":1,"289":1}}],["131092",{"2":{"50":1}}],["137",{"2":{"43":1,"50":1,"56":1,"57":1,"66":3,"72":2,"73":2,"100":1,"101":1,"120":1,"124":1,"269":1,"277":1,"455":2}}],["1",{"0":{"70":1,"75":1,"134":1,"225":1,"293":1,"331":1,"357":1,"463":1},"1":{"76":1},"2":{"4":13,"43":1,"56":2,"57":3,"66":4,"72":2,"77":1,"85":1,"126":1,"136":1,"137":1,"139":3,"143":4,"150":1,"151":1,"160":1,"177":1,"194":2,"199":1,"206":1,"248":1,"253":1,"254":2,"263":1,"265":2,"299":1,"300":1,"321":1,"327":2,"331":1,"340":1,"342":1,"346":1,"358":1,"385":2,"390":1,"391":1,"393":2,"420":2,"436":2,"451":2,"452":2}}],["3rd",{"2":{"358":1}}],["32",{"2":{"226":1,"395":1,"443":3,"464":1}}],["36000",{"2":{"199":1}}],["30",{"2":{"74":1,"182":1}}],["3",{"0":{"72":1,"80":1,"227":1,"333":1,"465":1},"1":{"81":1,"82":1,"83":1,"84":1},"2":{"4":1,"127":1,"139":2,"194":2,"206":1,"346":1,"381":1,"390":1,"391":2,"393":2,"430":1,"436":1,"443":1}}],["x19ethereum",{"2":{"419":1}}],["xattr",{"2":{"179":1}}],["xavier",{"2":{"62":1}}],["xavi",{"2":{"62":1}}],["xcodeproj",{"2":{"179":3}}],["xcode",{"0":{"179":1},"2":{"179":2}}],["xmlns",{"2":{"139":4}}],["xml",{"2":{"139":6}}],["xyz",{"2":{"27":1,"28":1,"80":1,"81":1,"152":1}}],["x",{"0":{"254":1,"265":1},"2":{"3":1,"23":2,"24":2,"27":1,"32":2,"37":2,"39":2,"41":2,"43":2,"46":1,"56":2,"57":4,"83":1,"84":1,"126":1,"160":1,"172":1,"254":1,"256":1,"265":1,"342":1,"358":2,"385":1}}],["x27",{"2":{"0":1,"4":1,"8":1,"23":16,"24":17,"26":2,"27":8,"28":1,"30":1,"32":13,"37":13,"39":13,"41":14,"43":24,"46":7,"49":1,"50":5,"53":1,"56":16,"57":22,"59":1,"61":1,"62":2,"63":1,"66":18,"73":1,"74":1,"75":2,"78":1,"80":2,"82":1,"83":2,"84":2,"85":8,"91":1,"92":6,"93":1,"97":1,"100":18,"101":22,"102":5,"103":2,"105":5,"107":4,"113":9,"114":9,"117":2,"118":2,"120":6,"121":6,"123":6,"124":17,"126":2,"127":1,"129":1,"130":2,"131":2,"132":1,"136":1,"137":1,"139":8,"141":6,"142":1,"144":1,"145":4,"146":1,"147":4,"149":4,"150":7,"153":1,"154":3,"155":1,"157":1,"158":3,"159":1,"160":1,"165":3,"167":3,"168":2,"169":2,"172":5,"173":1,"174":1,"175":1,"180":1,"193":3,"194":5,"196":2,"198":1,"201":1,"216":2,"218":1,"219":5,"220":16,"223":2,"225":4,"226":2,"227":1,"228":4,"229":2,"230":4,"232":10,"233":10,"234":16,"235":17,"238":1,"240":3,"243":2,"246":1,"259":10,"269":4,"272":1,"277":4,"278":4,"288":4,"289":3,"290":1,"302":1,"304":1,"323":6,"325":3,"327":1,"331":1,"333":3,"340":1,"341":1,"346":4,"352":2,"357":3,"358":3,"359":2,"365":1,"366":2,"374":1,"382":1,"385":4,"392":1,"393":8,"394":1,"396":1,"398":1,"400":4,"401":2,"402":1,"407":1,"408":5,"409":1,"412":1,"413":2,"414":2,"415":1,"416":1,"419":2,"420":28,"421":1,"424":12,"435":2,"436":2,"437":24,"439":1,"440":1,"441":1,"442":8,"447":2,"449":1,"457":1,"458":5,"459":16,"461":2,"463":4,"464":2,"465":1,"466":4,"467":2,"468":4,"470":10,"471":10,"472":16,"473":17,"476":1,"478":3}}],["human",{"2":{"144":1,"150":1}}],["html",{"2":{"139":1}}],["http",{"2":{"23":1,"24":1,"26":2,"32":1,"37":1,"39":1,"41":1,"53":1,"100":2,"101":2,"139":4,"400":1}}],["https",{"2":{"4":8,"7":1,"23":3,"24":3,"26":2,"27":2,"28":2,"30":2,"32":3,"37":3,"39":3,"41":3,"43":2,"44":1,"46":1,"50":7,"52":6,"54":1,"56":2,"57":5,"61":6,"62":4,"66":1,"67":1,"72":1,"74":2,"76":1,"77":1,"80":2,"81":1,"83":1,"84":1,"93":1,"129":1,"139":2,"152":1,"193":1,"194":2,"206":1,"220":2,"238":1,"242":2,"247":1,"257":1,"267":1,"283":1,"285":1,"289":1,"339":1,"342":2,"346":1,"371":2,"376":1,"377":1,"385":2,"443":4,"459":2,"476":1}}],["hint",{"2":{"198":1}}],["hit",{"2":{"179":2}}],["hides",{"2":{"172":1}}],["hide",{"2":{"172":1}}],["hidden",{"2":{"133":1}}],["highly",{"2":{"287":1,"302":1,"304":1,"322":1}}],["high",{"2":{"33":1,"179":1,"181":1,"182":1}}],["higher",{"2":{"5":1}}],["history",{"0":{"36":1,"37":1,"38":1,"39":1},"1":{"37":1,"39":1},"2":{"33":1,"35":2,"37":6,"39":6,"155":1}}],["horizon",{"2":{"383":3}}],["horik",{"2":{"62":1}}],["home",{"2":{"190":1,"288":3}}],["hope",{"2":{"158":1,"159":1}}],["hooks",{"2":{"288":2}}],["hook",{"2":{"102":2,"103":1,"118":1,"288":1,"442":1,"451":1,"452":2}}],["hosting",{"2":{"330":1,"383":1}}],["hosted",{"2":{"74":1,"357":1,"358":1}}],["hosts",{"2":{"27":1,"28":1}}],["host",{"2":{"26":1,"198":1}}],["however",{"2":{"61":1,"122":1,"130":1,"131":1,"155":1,"327":1,"447":1}}],["how",{"0":{"156":1,"181":1,"191":1,"288":1,"289":1,"329":1},"1":{"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1},"2":{"4":1,"25":1,"42":2,"45":1,"50":1,"55":2,"59":1,"73":1,"74":1,"105":1,"123":2,"131":1,"133":1,"141":1,"144":2,"146":1,"148":1,"150":1,"165":1,"172":1,"173":1,"175":1,"177":1,"193":1,"220":1,"291":1,"304":1,"324":1,"342":1,"347":1,"379":1,"384":1,"429":1,"434":1,"459":1}}],["h",{"2":{"23":2,"24":2,"32":2,"37":2,"39":2,"41":2,"43":2,"56":2,"57":4,"83":1,"84":1,"163":2,"167":2,"175":1,"177":1,"385":1}}],["he",{"2":{"449":1}}],["hence",{"2":{"438":1}}],["henrique",{"2":{"62":1}}],["hesitate",{"2":{"159":1}}],["heavily",{"2":{"290":1}}],["head",{"2":{"332":1,"341":1}}],["headless",{"2":{"190":1,"191":1}}],["header",{"2":{"179":1,"346":1}}],["headers",{"2":{"3":1,"80":5,"385":1}}],["heard",{"2":{"146":1}}],["hex",{"2":{"419":1,"420":1}}],["hexdataslice",{"2":{"395":1}}],["hexzeropad",{"2":{"395":1}}],["hexadecimal",{"2":{"143":1,"154":1,"301":2,"304":2,"305":1,"307":1,"308":1,"309":1,"310":2,"312":1,"314":1}}],["hexlify",{"2":{"73":2,"226":1,"464":1}}],["hello",{"2":{"75":1,"76":1,"419":1}}],["helps",{"2":{"175":1,"177":1}}],["helper",{"2":{"143":1}}],["helpful",{"2":{"30":1,"39":1,"41":1,"188":1,"291":1}}],["help",{"2":{"23":1,"24":1,"30":1,"37":1,"41":1,"59":1,"130":1,"133":1,"158":1,"159":1,"220":1,"223":1,"243":1,"330":1,"383":1,"459":1,"461":1}}],["here",{"2":{"26":1,"34":1,"35":1,"39":1,"41":1,"61":1,"62":1,"73":1,"85":1,"105":1,"123":1,"152":1,"154":1,"173":1,"194":1,"220":1,"252":1,"256":4,"262":1,"266":3,"273":1,"282":1,"285":1,"289":2,"442":1,"459":1}}],["had",{"2":{"384":1}}],["happen",{"2":{"358":1,"450":1}}],["happens",{"2":{"179":1}}],["hardware",{"2":{"357":1}}],["harmoniously",{"2":{"255":1,"264":1}}],["handling",{"2":{"438":1}}],["handlegooglelogin",{"2":{"442":3}}],["handlers",{"2":{"194":1}}],["handler",{"2":{"142":1,"153":1,"154":1,"442":3}}],["handlerequest",{"2":{"80":2}}],["handles",{"2":{"142":1,"439":1}}],["handle",{"2":{"7":2,"52":1,"80":8,"81":1,"85":6,"141":1,"150":1,"442":1}}],["hand",{"2":{"62":1,"179":1}}],["hat",{"2":{"61":2}}],["having",{"2":{"6":1,"65":1,"73":1,"74":1,"133":1,"194":1}}],["haven",{"2":{"129":1,"131":1}}],["have",{"2":{"1":1,"6":1,"30":1,"59":1,"61":1,"64":1,"66":1,"67":3,"77":1,"80":2,"84":1,"92":1,"129":1,"130":1,"139":1,"143":1,"145":1,"147":1,"149":1,"150":1,"159":2,"165":2,"172":2,"174":1,"175":1,"179":1,"182":1,"193":1,"194":1,"219":1,"220":2,"235":1,"294":1,"303":1,"327":1,"328":1,"331":1,"340":1,"366":1,"392":1,"413":1,"431":1,"435":1,"436":1,"438":1,"458":1,"459":2,"473":1}}],["hasn",{"2":{"172":1,"357":1}}],["hashtree",{"2":{"437":7}}],["hasheddata",{"2":{"420":2}}],["hashed",{"2":{"392":1,"437":1}}],["hashes",{"2":{"37":1,"299":1,"407":1,"437":1}}],["hash",{"0":{"392":1,"393":1},"1":{"393":1,"395":1},"2":{"74":1,"80":2,"85":1,"299":1,"306":1,"315":1,"318":1,"319":1,"320":1,"395":2,"401":1,"402":1,"406":1,"407":1,"415":1,"421":6,"434":1,"435":1,"436":1,"442":3,"454":2}}],["has",{"2":{"0":1,"30":1,"94":1,"144":2,"172":1,"188":1,"192":1,"211":1,"216":1,"239":1,"328":1,"382":1,"387":1,"390":1,"399":1,"400":1,"407":1,"436":2,"441":2,"451":2,"452":1,"477":1}}],["kind",{"2":{"358":1}}],["kinds",{"2":{"27":1,"28":1,"243":1}}],["kitcheckoutprovider",{"2":{"117":4}}],["kitconfig",{"2":{"101":1,"105":2,"124":2}}],["kitwalletprovider",{"2":{"101":7}}],["kitprovider",{"2":{"100":4,"101":6,"105":3,"117":2,"124":2}}],["kit",{"0":{"98":1,"99":1,"100":1,"122":1,"244":1,"372":1},"1":{"99":1,"123":1,"245":1,"373":1},"2":{"95":1,"96":1,"97":2,"98":1,"99":8,"100":3,"101":4,"102":1,"103":1,"104":1,"105":2,"107":1,"117":6,"118":1,"122":3,"123":2,"124":3,"125":1,"243":1,"244":1,"245":1,"246":2,"372":1,"373":1,"374":2}}],["kitexavier",{"2":{"62":1}}],["keccak256",{"2":{"77":2,"393":5,"395":2,"421":2,"435":1,"436":1,"437":2}}],["keepwalletopened",{"0":{"203":1},"2":{"203":2}}],["keeps",{"2":{"30":1}}],["keep",{"2":{"3":1,"175":1,"203":1}}],["keyboard",{"2":{"129":1}}],["keypair",{"2":{"77":1}}],["keyword",{"2":{"75":1,"150":1}}],["keystore",{"2":{"177":1}}],["keys",{"0":{"223":1,"224":1,"382":1,"461":1,"462":1},"1":{"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1},"2":{"3":1,"91":1,"132":2,"139":1,"163":1,"193":1,"222":2,"223":3,"353":1,"359":1,"365":1,"380":3,"381":6,"382":1,"384":3,"460":2,"461":3}}],["key",{"0":{"96":1,"226":1,"229":1,"245":1,"373":1,"380":1,"383":1,"384":1,"464":1,"467":1},"1":{"381":1,"382":1,"383":1,"384":1},"2":{"3":4,"7":2,"11":1,"22":1,"23":3,"24":1,"25":1,"27":1,"31":1,"32":2,"33":1,"36":1,"37":2,"38":1,"39":1,"40":1,"41":1,"43":2,"46":2,"56":2,"57":3,"66":2,"72":1,"77":3,"80":5,"81":2,"85":2,"91":2,"92":2,"100":1,"101":1,"124":1,"132":1,"163":2,"164":3,"177":1,"179":2,"180":1,"182":1,"194":1,"220":1,"223":2,"226":1,"227":1,"228":2,"229":1,"230":2,"293":2,"302":1,"349":1,"353":1,"358":1,"365":2,"366":2,"380":3,"381":9,"382":1,"383":6,"384":6,"440":2,"441":3,"442":2,"443":2,"444":2,"454":2,"455":2,"459":1,"461":2,"464":1,"465":1,"466":2,"467":1,"468":2}}],["known",{"2":{"150":1,"323":2,"325":2,"395":1,"415":1,"416":1,"425":1}}],["knowledge",{"2":{"74":1}}],["know",{"2":{"0":1,"77":1,"241":1,"370":1}}],["pseudo",{"2":{"437":1}}],["python",{"2":{"240":1,"478":1}}],["philosophy",{"2":{"380":1}}],["phone",{"2":{"193":2,"358":1,"376":1,"377":1}}],["phase",{"2":{"179":2}}],["pc",{"0":{"138":1},"2":{"127":1,"161":1}}],["pkey",{"2":{"80":4,"81":1,"85":1}}],["person",{"2":{"420":1}}],["personalized",{"2":{"386":1}}],["perspective",{"2":{"216":1}}],["per",{"2":{"385":1}}],["period",{"2":{"183":1}}],["perfectly",{"2":{"237":1,"475":1}}],["perfect",{"2":{"158":2}}],["performs",{"2":{"358":1}}],["performed",{"2":{"303":1,"452":1}}],["perform",{"2":{"75":1,"76":1,"80":1,"83":1,"158":1,"200":1,"229":1,"450":1,"467":1}}],["permission",{"2":{"3":1,"77":1}}],["png",{"2":{"50":2,"62":1,"194":2,"206":1}}],["pnpm",{"2":{"7":1,"27":1,"75":2,"80":1,"85":1,"90":1,"99":1,"117":1,"241":1,"364":1,"370":1}}],["pixel",{"2":{"443":1}}],["pinata",{"0":{"332":1},"2":{"330":1,"332":2,"333":1,"334":1,"339":1,"340":1}}],["piece",{"2":{"33":1}}],["pick",{"2":{"30":1,"127":1,"194":1,"209":1}}],["plugin",{"2":{"163":1,"165":1,"169":1,"173":1,"258":3,"259":1}}],["plugins",{"2":{"139":1,"165":3}}],["plain",{"2":{"219":1,"458":1}}],["places",{"2":{"155":1}}],["place",{"2":{"117":1,"132":1,"177":2,"358":1,"359":1}}],["placed",{"2":{"80":1,"289":1}}],["platforms",{"0":{"375":1},"1":{"376":1,"377":1,"378":1},"2":{"134":1,"135":1}}],["platformspecificsetup",{"2":{"127":1}}],["platform",{"2":{"75":1,"135":1,"167":1,"172":1,"357":1}}],["players",{"2":{"190":1,"191":1}}],["playercontroller",{"2":{"172":1}}],["player",{"2":{"136":2,"137":2,"139":3}}],["playground",{"2":{"107":1}}],["play",{"2":{"50":1,"129":1,"130":1,"131":1,"227":1,"465":1}}],["plan",{"2":{"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1,"150":1}}],["please",{"2":{"2":1,"5":1,"23":1,"25":1,"43":1,"45":1,"57":2,"90":1,"100":1,"131":1,"133":1,"139":3,"141":1,"143":1,"144":1,"150":1,"155":1,"158":1,"159":1,"174":2,"176":1,"179":1,"192":1,"214":1,"243":2,"274":1,"364":1,"385":1,"447":1}}],["pair",{"2":{"349":1}}],["paid",{"2":{"67":1,"72":1,"312":1}}],["packaging",{"0":{"176":1},"1":{"177":1,"178":1,"179":1},"2":{"176":1,"179":2}}],["packaged",{"2":{"179":1}}],["packages",{"0":{"99":1},"2":{"85":1,"99":1,"241":2,"370":2}}],["package",{"0":{"129":1},"1":{"130":1},"2":{"75":1,"99":2,"122":1,"129":5,"130":1,"131":6,"158":1,"179":1,"193":1,"237":1,"241":5,"248":2,"258":1,"267":1,"275":1,"370":4,"442":1,"475":1}}],["pawn",{"2":{"165":6,"172":2}}],["pattern",{"2":{"436":1}}],["patterns",{"2":{"188":1,"192":1}}],["path",{"2":{"139":1,"179":1,"194":3,"442":2}}],["path=",{"2":{"129":1}}],["patch",{"2":{"126":2,"160":2}}],["pasting",{"2":{"150":1}}],["pasted",{"2":{"216":1}}],["paste",{"2":{"129":1,"139":1,"154":1,"332":1,"339":1}}],["password",{"2":{"441":1}}],["passes",{"2":{"299":1,"300":1}}],["passed",{"2":{"30":1,"80":1,"113":2,"114":2,"167":1,"201":1,"251":1,"252":1,"261":1,"401":1}}],["passing",{"2":{"105":1,"107":1,"115":1}}],["pass",{"2":{"3":1,"4":3,"23":1,"30":1,"42":1,"55":1,"81":1,"118":1,"124":1,"151":1,"167":2,"194":3,"219":1,"299":1,"300":1,"440":1,"458":1}}],["palette",{"2":{"107":1}}],["pageprops",{"2":{"289":2}}],["pagesize",{"2":{"385":1}}],["pages",{"0":{"288":1},"2":{"255":3,"256":1,"264":3,"266":1,"287":2}}],["page",{"2":{"77":1,"84":1,"101":1,"113":1,"114":1,"117":1,"134":1,"188":2,"192":1,"211":1,"287":1,"288":2,"304":1,"385":4}}],["parent",{"2":{"436":1}}],["parentheses",{"2":{"150":1}}],["param",{"2":{"421":2}}],["parametersasobjectarray",{"2":{"150":2,"151":1}}],["parameters",{"0":{"250":1,"260":1,"270":1,"399":1,"403":1,"407":1},"1":{"251":1,"252":1,"253":1,"261":1,"262":1,"263":1,"271":1,"272":1},"2":{"150":5,"195":1,"429":1,"438":1}}],["parameter",{"2":{"108":1,"141":1,"143":1,"144":1,"150":1,"167":1,"168":1,"251":1,"261":1,"302":1,"304":1,"322":1}}],["parallelize",{"2":{"8":1}}],["parallel",{"0":{"73":1},"2":{"8":1,"73":1}}],["parse",{"2":{"59":1,"63":1,"80":1}}],["partner",{"2":{"359":3}}],["party",{"2":{"357":1,"358":1}}],["parts",{"2":{"173":2}}],["partial",{"2":{"85":2,"359":1,"410":1}}],["particularly",{"2":{"223":1,"287":1,"290":1,"461":1}}],["particular",{"0":{"41":1},"2":{"35":2,"39":1}}],["part",{"2":{"8":1,"94":1,"239":1,"477":1}}],["paytrie",{"2":{"347":1,"379":1}}],["paypal",{"2":{"193":1}}],["payload",{"2":{"179":1,"231":1,"469":1}}],["payable",{"2":{"150":3}}],["payments",{"2":{"116":1}}],["payment",{"2":{"74":1,"210":2,"211":2,"347":1,"379":1}}],["pay",{"2":{"8":1,"66":5,"353":1}}],["purchasing",{"2":{"213":1}}],["purchase",{"2":{"212":1,"213":2,"347":2,"379":2}}],["purpose",{"2":{"126":1,"142":1,"173":1}}],["purple",{"2":{"61":1}}],["pull",{"2":{"125":1}}],["publishing",{"2":{"139":1}}],["published",{"2":{"30":1}}],["publishcollection",{"2":{"4":1}}],["publicclient",{"2":{"249":1}}],["publically",{"2":{"142":1}}],["public",{"2":{"3":1,"4":1,"6":1,"141":1,"142":3,"153":2,"154":3,"421":1}}],["publicly",{"2":{"3":2,"357":1}}],["putting",{"2":{"150":1}}],["put",{"2":{"4":3,"80":1,"131":1}}],["portrait",{"2":{"172":2}}],["potentially",{"2":{"290":1,"303":1}}],["potential",{"2":{"96":1,"191":1,"245":1,"373":1}}],["power",{"2":{"96":1,"245":1,"373":1}}],["powered",{"2":{"50":1,"139":5}}],["points",{"2":{"155":1}}],["point",{"2":{"75":1,"123":1,"143":1,"172":1,"303":1,"304":1,"338":1}}],["popups",{"2":{"194":1}}],["popup",{"2":{"194":2}}],["popular",{"0":{"351":1},"2":{"30":2,"50":1,"59":1,"95":1,"96":1,"190":1,"244":1,"245":1,"290":1,"372":1,"373":1}}],["pop",{"2":{"190":1}}],["pops",{"2":{"3":1}}],["polygonindexer",{"2":{"152":1}}],["polygon",{"0":{"32":1},"2":{"23":5,"24":5,"26":2,"28":1,"32":5,"37":5,"39":6,"41":5,"43":5,"47":1,"50":6,"52":3,"56":4,"57":4,"61":1,"62":1,"66":2,"72":1,"83":1,"100":2,"101":2,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":2,"151":1,"152":1,"153":1,"154":1,"194":1,"220":1,"249":1,"259":1,"301":1,"302":1,"455":1,"459":1}}],["position",{"0":{"108":1},"2":{"108":1}}],["possibilities",{"2":{"95":1,"151":1,"244":1,"372":1}}],["possible",{"2":{"3":1,"107":1,"108":1,"172":1,"194":1,"216":1,"222":2,"325":1,"356":1,"359":1,"433":1,"436":1,"460":2}}],["post",{"2":{"23":2,"24":2,"32":2,"37":2,"39":2,"41":2,"43":2,"56":2,"57":5,"74":1,"80":5,"83":1,"84":1,"85":1,"129":1,"141":1,"142":1,"153":1,"154":1,"346":1,"385":3}}],["prudent",{"2":{"382":1}}],["pr",{"2":{"155":1,"159":1}}],["practices",{"2":{"59":1}}],["practice",{"2":{"59":1,"61":1,"63":2,"290":1}}],["primitive",{"2":{"349":1}}],["primary",{"2":{"223":2,"461":2}}],["primarily",{"2":{"190":1,"429":1}}],["pricepertoken",{"2":{"385":1}}],["price",{"2":{"316":1,"385":1}}],["pricesort",{"2":{"346":1}}],["prices",{"2":{"155":1}}],["pricing",{"0":{"5":1},"2":{"8":1}}],["privatekeystring",{"2":{"293":1}}],["privatekey",{"2":{"77":4}}],["private",{"2":{"77":2,"80":1,"81":1,"85":1,"160":1,"163":1,"164":1,"223":1,"226":1,"293":2,"380":3,"381":1,"384":1,"461":1,"464":1}}],["privately",{"2":{"4":1}}],["print",{"2":{"76":1,"77":1}}],["println",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1}}],["prism",{"2":{"62":1}}],["priority",{"2":{"317":1}}],["prioritizing",{"2":{"191":1}}],["prior",{"2":{"2":1,"4":1,"85":1,"139":2,"167":1,"172":1}}],["prepared",{"2":{"352":1}}],["prepare",{"0":{"331":1}}],["pre",{"2":{"327":1,"328":1}}],["presented",{"2":{"181":1}}],["press",{"2":{"75":1,"84":1,"129":1}}],["prefixedmessage",{"2":{"419":2}}],["prefilling",{"2":{"212":1}}],["prefabs",{"2":{"133":1,"155":1}}],["prefab",{"2":{"133":2,"155":1}}],["preference",{"2":{"384":1}}],["preferred",{"2":{"190":1}}],["prefer",{"2":{"4":1,"302":1}}],["preview",{"2":{"339":1}}],["previously",{"2":{"85":1,"216":1,"293":1}}],["previous",{"2":{"4":1,"66":1,"231":1,"469":1}}],["prevent",{"0":{"80":1},"1":{"81":1,"82":1,"83":1,"84":1},"2":{"74":1,"82":1,"213":1,"442":1}}],["proxy",{"2":{"395":2,"398":1}}],["pros",{"0":{"350":1,"353":1}}],["protect",{"2":{"384":1}}],["protected",{"2":{"357":1}}],["protects",{"2":{"356":1,"359":1}}],["protection",{"2":{"201":1,"359":1,"383":1,"447":1}}],["protocol",{"2":{"193":1,"197":1,"385":1}}],["protocols",{"2":{"1":1,"216":1}}],["proper",{"2":{"407":1}}],["properly",{"2":{"177":1}}],["properties",{"0":{"63":1,"430":1},"1":{"431":1,"432":1,"433":1,"434":1,"435":1,"436":1},"2":{"50":1,"61":4,"62":2,"63":6,"430":1}}],["progressively",{"2":{"193":1}}],["progress",{"2":{"155":1}}],["program",{"2":{"57":1,"396":1}}],["produce",{"0":{"287":1},"2":{"287":1}}],["produced",{"2":{"77":1}}],["products",{"2":{"189":1}}],["product",{"2":{"155":1}}],["prone",{"2":{"150":1}}],["proceed",{"2":{"134":1}}],["process",{"2":{"66":1,"80":1,"92":2,"96":1,"129":1,"150":3,"158":1,"175":2,"179":1,"188":1,"194":1,"223":1,"245":1,"340":1,"366":2,"373":1,"440":2,"441":2,"442":2,"443":2,"444":2,"454":2,"455":2,"461":1}}],["provisioning",{"2":{"178":1}}],["providing",{"2":{"77":1,"95":1,"145":1,"147":1,"149":1,"150":1,"244":1,"357":1,"372":1}}],["provided",{"2":{"66":1,"72":1,"75":1,"91":1,"115":3,"130":1,"143":1,"145":1,"147":1,"149":1,"205":1,"290":1,"301":1,"302":1,"304":3,"323":2,"327":1,"328":1,"365":1,"396":1,"402":1,"408":1,"421":4,"432":1,"435":1,"441":1}}],["provides",{"2":{"50":1,"55":1,"107":1,"122":1,"126":1,"134":1,"151":1,"160":1,"186":1,"290":1,"295":1,"357":1,"359":1}}],["provide",{"2":{"26":1,"30":1,"53":1,"90":1,"96":1,"123":1,"124":1,"133":1,"150":3,"155":3,"164":2,"188":1,"190":1,"191":1,"192":1,"223":1,"245":1,"290":1,"304":1,"320":1,"322":2,"323":1,"324":1,"327":1,"339":1,"348":1,"357":1,"364":1,"373":1,"436":4,"441":1,"447":1,"461":1}}],["providerurl",{"2":{"172":1,"174":2}}],["provider",{"2":{"7":4,"66":2,"72":1,"77":2,"85":5,"117":1,"174":1,"194":1,"207":2,"211":1,"220":2,"228":1,"289":1,"347":1,"379":1,"400":2,"440":1,"442":2,"447":2,"459":2,"466":1}}],["providers",{"2":{"6":1,"7":1,"77":1,"80":1,"85":3,"99":1,"190":1,"207":1,"210":2,"211":1,"220":1,"347":4,"379":4,"400":1,"440":1,"447":1,"459":1}}],["prove",{"2":{"84":1,"219":1,"458":1}}],["proofstring",{"2":{"80":1,"220":1,"459":1}}],["proof",{"2":{"74":1,"80":5,"83":5,"84":4,"194":2,"199":1,"200":1,"219":2,"220":6,"458":2,"459":6}}],["prompted",{"2":{"216":1,"339":1}}],["prompt",{"2":{"129":1,"131":1,"216":1,"219":1,"272":1,"451":1,"458":1}}],["prompts",{"2":{"11":1,"75":1}}],["promise",{"2":{"73":1,"80":4,"85":2}}],["probably",{"2":{"146":1}}],["probability",{"2":{"73":1}}],["problem",{"2":{"73":1}}],["problems",{"2":{"0":1,"175":1}}],["pro",{"2":{"23":1,"42":1,"49":1,"55":1,"179":1,"440":1,"441":1,"442":1,"443":2,"444":1}}],["projectfilesios",{"2":{"179":1}}],["projectname",{"0":{"111":1}}],["projectaccesskey",{"2":{"66":2,"72":1,"77":1,"92":1,"100":2,"101":2,"124":1,"163":1,"194":3,"366":1,"440":1,"441":1,"442":1,"443":1,"444":1,"454":1,"455":1}}],["projectid",{"2":{"4":2,"443":2}}],["project",{"0":{"91":1,"365":1},"2":{"3":1,"5":1,"7":1,"11":1,"30":1,"50":1,"63":2,"75":7,"76":1,"77":1,"80":5,"81":1,"85":1,"91":1,"92":1,"111":1,"130":5,"131":2,"132":1,"136":1,"137":1,"139":2,"165":2,"179":8,"180":1,"181":1,"182":1,"185":1,"192":1,"241":2,"243":1,"335":1,"358":1,"365":1,"366":1,"370":2,"440":1,"441":1,"442":1,"443":1,"444":1,"454":1,"455":1}}],["projects",{"2":{"0":1,"4":10,"8":1,"59":3,"63":1}}],["circle",{"2":{"442":1}}],["cid",{"2":{"332":1,"333":1}}],["certain",{"2":{"386":1,"452":1}}],["certainty",{"2":{"219":1,"458":1}}],["center",{"2":{"108":3}}],["c++",{"2":{"165":3,"167":1}}],["cpp",{"2":{"164":1,"167":2,"175":1}}],["cs",{"2":{"141":1}}],["ctx",{"2":{"80":3}}],["cdn",{"0":{"242":1,"371":1},"2":{"242":1,"371":1}}],["cd",{"2":{"75":1,"76":1}}],["c",{"0":{"70":1,"71":1,"72":1},"2":{"132":2,"154":1,"324":1,"436":1}}],["cross",{"2":{"385":1}}],["cr",{"2":{"179":1}}],["cryptography",{"2":{"384":1}}],["cryptographically",{"2":{"293":1,"357":1}}],["crypto",{"0":{"120":1},"2":{"357":1}}],["cryptocurrencies",{"2":{"347":1,"379":1}}],["cryptocurrency",{"2":{"116":1,"120":1}}],["cryptocheckout",{"0":{"120":1},"2":{"119":1,"120":2}}],["credential",{"2":{"442":1}}],["credentialresponse",{"2":{"442":2}}],["credentialsin",{"2":{"165":1,"167":3,"172":2,"174":2}}],["credentials",{"0":{"163":1},"2":{"91":1,"163":2,"165":3,"167":3,"168":2,"172":2,"173":1,"174":2,"365":1,"384":1}}],["credit",{"2":{"67":1,"347":1,"379":1}}],["creator",{"2":{"338":1}}],["creators",{"2":{"148":1}}],["creation",{"2":{"11":1,"355":1,"357":1,"392":1,"395":1,"401":1,"432":1,"439":1}}],["creating",{"0":{"4":1,"123":1},"2":{"122":1,"123":1,"125":1,"141":1,"142":1,"145":1,"147":1,"149":1,"152":1,"179":1,"190":1,"302":1,"322":2}}],["createroot",{"2":{"442":1}}],["createrandom",{"2":{"77":1}}],["createhashrouter",{"2":{"442":2}}],["create2",{"2":{"395":1,"438":1}}],["creates",{"2":{"381":1}}],["createtransaction",{"2":{"321":2}}],["createtoken",{"2":{"4":1}}],["createclient",{"2":{"289":1}}],["createconnector",{"2":{"123":2}}],["createconfig",{"2":{"100":2,"101":2,"124":1,"249":1}}],["createcollection",{"2":{"4":1}}],["createasset",{"2":{"4":1}}],["createdat",{"2":{"385":1,"443":2}}],["createdby",{"2":{"385":1}}],["created",{"2":{"4":2,"130":1,"132":1,"145":1,"147":1,"149":1,"158":1,"293":1,"294":1,"327":1,"334":1,"338":1,"355":2,"381":1,"385":2,"408":1,"419":1,"436":1,"440":1}}],["create",{"0":{"68":1},"2":{"3":1,"4":1,"7":2,"65":1,"66":5,"72":2,"73":1,"75":4,"77":2,"80":1,"85":5,"92":1,"123":3,"124":1,"130":1,"132":4,"139":1,"145":2,"147":2,"149":2,"151":1,"158":2,"165":2,"167":1,"172":1,"177":1,"192":1,"220":1,"226":1,"230":1,"289":1,"293":1,"302":2,"321":1,"323":5,"325":1,"327":2,"332":1,"335":1,"366":1,"380":2,"433":1,"436":1,"459":1,"464":1,"468":1}}],["craft",{"2":{"66":1,"72":1}}],["custodial",{"2":{"141":1,"189":1,"191":1,"355":1,"384":1}}],["customization",{"0":{"159":1},"2":{"187":1,"384":1}}],["customizable",{"2":{"157":1,"191":1}}],["customizability",{"0":{"157":1},"1":{"158":1,"159":1}}],["customize",{"2":{"105":1,"123":1,"159":1,"187":1,"194":1}}],["custom",{"0":{"122":1,"123":1,"124":1,"125":1,"167":1},"1":{"123":1},"2":{"122":2,"123":6,"124":5,"125":2,"127":1,"135":2,"139":1,"145":1,"147":1,"149":1,"151":1,"165":3,"172":1,"188":1,"197":1,"289":1,"290":1,"344":1,"386":1,"447":1,"448":1}}],["cut",{"2":{"62":1}}],["curious",{"2":{"141":1,"150":1}}],["currencies",{"2":{"143":1}}],["currencyaddress",{"2":{"385":1}}],["currencyaddresses",{"2":{"346":1,"385":3}}],["currency",{"2":{"66":1,"143":2,"211":2,"213":4,"304":1,"321":1,"385":2}}],["currently",{"2":{"91":1,"135":1,"292":1,"347":1,"359":1,"365":1,"379":1,"381":1}}],["current",{"0":{"400":1,"415":1},"1":{"416":1},"2":{"58":1,"404":1,"415":2,"443":1,"448":1}}],["curl",{"2":{"23":1,"24":1,"26":1,"32":1,"37":1,"39":1,"41":1,"43":1,"56":1,"57":2,"83":2,"84":1,"342":1,"346":1,"385":1}}],["c3bgcu3lkfr9bp9jfsslenpaaaaaaaaaa",{"2":{"23":3,"24":4,"27":1,"28":1,"32":3,"37":3,"39":4,"41":4,"43":4,"46":1,"47":1,"56":4,"57":4}}],["claim",{"2":{"201":1}}],["class",{"2":{"92":1,"145":1,"147":1,"149":1,"152":2,"165":2,"327":1,"366":1}}],["closing",{"2":{"173":1}}],["close",{"0":{"444":1},"2":{"102":1,"203":1}}],["closed",{"2":{"91":1,"365":1,"385":1,"444":2}}],["cloud",{"0":{"332":1},"2":{"75":1,"332":1,"339":1,"340":1}}],["cloudflare",{"0":{"19":1,"75":1,"81":1},"1":{"76":1},"2":{"11":2,"74":3,"75":3,"80":1}}],["clone",{"2":{"75":1}}],["clothes",{"2":{"61":1}}],["clipboard",{"2":{"84":1,"216":2}}],["cli",{"0":{"75":1},"1":{"76":1},"2":{"74":2,"75":1}}],["clientid=",{"2":{"442":1}}],["client=",{"2":{"100":1,"101":2,"117":1,"124":1,"289":1}}],["clients",{"0":{"302":1},"1":{"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1},"2":{"51":1}}],["client",{"0":{"53":1},"2":{"26":2,"51":3,"53":2,"83":1,"150":1,"164":2,"177":6,"220":1,"223":1,"228":1,"229":1,"230":1,"237":1,"240":2,"288":2,"289":9,"297":2,"298":2,"299":2,"300":2,"302":4,"303":1,"304":2,"305":1,"306":1,"307":1,"308":1,"309":2,"310":1,"311":1,"312":1,"313":2,"314":2,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":2,"323":7,"325":3,"326":1,"327":5,"442":1,"459":1,"461":1,"466":1,"467":1,"468":1,"475":1,"478":2}}],["clicks",{"2":{"96":1,"219":1,"245":1,"373":1,"458":1}}],["clicking",{"2":{"77":1,"182":1}}],["click",{"2":{"3":3,"50":1,"129":3,"130":3,"131":1,"132":1,"158":2,"179":7,"289":1,"334":1,"335":1,"337":1,"339":1,"341":1}}],["cheap",{"2":{"350":1}}],["checkpoint",{"0":{"432":1},"2":{"430":1,"432":2,"437":1}}],["checks",{"2":{"408":1}}],["checked",{"2":{"392":1,"454":1}}],["checking",{"2":{"30":1,"120":1,"174":1}}],["check",{"2":{"26":1,"58":2,"66":2,"72":1,"80":2,"97":1,"141":1,"142":1,"153":1,"154":1,"167":1,"188":1,"192":1,"194":1,"246":1,"304":1,"344":1,"374":1,"448":1}}],["checkoutconfig",{"2":{"120":1}}],["checkoutsettings",{"2":{"118":2,"119":2}}],["checkout",{"0":{"20":1,"118":1,"119":1,"120":1},"1":{"120":1,"121":1},"2":{"97":1,"116":1,"117":6,"118":3,"119":1,"246":1,"374":1}}],["chrome",{"0":{"215":1},"2":{"193":2,"214":1,"215":1,"378":1,"440":1,"441":1,"442":1,"443":2,"444":1}}],["chiefly",{"2":{"189":1}}],["children",{"2":{"289":2}}],["child",{"2":{"165":1,"289":1}}],["choosing",{"2":{"338":1}}],["chooses",{"2":{"216":1}}],["choose",{"2":{"7":1,"155":1,"216":1,"347":1,"379":1,"384":1}}],["choice",{"2":{"187":1,"335":1,"440":1}}],["chose",{"2":{"131":1,"169":1,"216":1,"322":1}}],["chop",{"2":{"50":1}}],["chart",{"2":{"182":1}}],["chance",{"2":{"179":1}}],["changed",{"2":{"130":1,"401":1,"438":1}}],["changes",{"2":{"8":1,"58":1,"126":2,"131":2,"158":1,"160":2,"179":1,"193":1,"274":1,"442":1}}],["change",{"2":{"3":1,"50":2,"182":1,"231":1,"394":1,"396":1,"401":1,"408":1,"469":1}}],["challenge",{"2":{"134":2}}],["challenging",{"2":{"131":1}}],["chainindexer",{"2":{"152":3}}],["chainid",{"0":{"280":1,"309":1},"2":{"43":3,"50":1,"56":3,"57":3,"66":1,"72":1,"80":4,"85":4,"115":1,"120":1,"228":2,"277":1,"301":2,"309":2,"420":2,"450":1,"451":1,"452":1,"454":1,"455":1,"466":2}}],["chainconfig",{"2":{"80":2}}],["chain",{"2":{"3":1,"7":1,"27":2,"28":2,"30":1,"33":4,"43":1,"52":2,"55":1,"56":1,"57":1,"73":1,"80":10,"81":3,"85":6,"100":5,"101":5,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":2,"151":1,"152":1,"153":1,"154":1,"213":1,"232":1,"233":1,"234":1,"280":1,"301":5,"302":2,"304":2,"309":2,"313":2,"336":1,"339":1,"342":1,"470":1,"471":1,"472":1}}],["chains",{"0":{"251":1,"261":1},"2":{"2":1,"33":3,"45":1,"49":2,"100":4,"101":4,"124":1,"241":1,"249":1,"251":1,"259":1,"261":1,"293":1}}],["calculated",{"2":{"434":1,"435":1,"436":1,"437":1}}],["caller",{"2":{"407":1}}],["called",{"2":{"44":1,"57":1,"61":1,"62":1,"191":1,"194":1,"241":1,"358":1,"370":1,"399":1,"402":1,"407":1,"408":1,"409":1,"411":2,"437":1,"442":1}}],["callfunction",{"2":{"323":7}}],["callable",{"2":{"165":2}}],["calldata",{"2":{"85":1,"234":2,"235":1,"421":1,"472":2,"473":1}}],["callcontractfunction",{"2":{"145":1,"147":1,"149":1,"323":4,"327":1}}],["callcontract",{"2":{"80":3,"85":2}}],["callbacks",{"2":{"175":2}}],["callback",{"0":{"450":1},"2":{"66":2,"175":2,"450":2}}],["callshowauthsuccessscreen",{"2":{"167":4}}],["calls",{"2":{"30":2,"61":1,"167":2,"172":1,"174":1,"290":2,"399":1,"407":1}}],["calling",{"0":{"323":1},"2":{"2":1,"30":1,"80":1,"142":1,"150":3,"153":1,"154":1,"165":1,"172":1,"322":1,"323":1,"398":1,"414":1,"415":1,"421":1,"438":1}}],["call",{"0":{"346":1},"2":{"2":1,"3":1,"4":1,"7":1,"26":1,"58":1,"73":1,"80":3,"142":1,"150":5,"153":1,"154":2,"167":5,"168":1,"172":1,"174":2,"189":1,"240":1,"323":1,"342":1,"408":1,"478":1}}],["capturables",{"2":{"175":1}}],["capturable",{"2":{"175":2}}],["capabilities",{"2":{"53":1,"240":1,"478":1}}],["cater",{"2":{"191":1}}],["category",{"2":{"139":12,"167":5}}],["catch",{"2":{"7":1,"66":1,"80":3,"85":1,"220":1,"290":2,"442":1,"451":1,"455":1,"459":1}}],["causes",{"2":{"289":1}}],["cause",{"2":{"126":3,"132":1,"160":3}}],["caution",{"2":{"66":1,"194":1,"407":1}}],["came",{"2":{"80":1}}],["carefully",{"2":{"193":1}}],["care",{"2":{"72":1}}],["cardtype",{"2":{"62":1}}],["cards",{"2":{"50":2,"62":2,"182":1}}],["card",{"2":{"50":2,"62":1,"67":1,"347":2,"379":2}}],["cast",{"2":{"62":1}}],["case",{"2":{"25":1,"61":1,"73":1,"115":1,"151":1,"167":1,"323":2,"325":2,"383":1,"401":1,"409":1,"410":1,"416":2}}],["cases",{"2":{"8":1,"63":1,"131":1,"154":1,"173":1,"219":1,"240":1,"407":1,"458":1,"478":1}}],["cancel",{"2":{"452":1}}],["cancelled",{"2":{"385":1,"450":1}}],["candidate",{"2":{"416":1}}],["canvas",{"2":{"133":4}}],["cannot",{"2":{"66":1,"135":1,"274":1,"322":1,"359":1,"447":1}}],["can",{"0":{"191":1},"2":{"4":3,"6":1,"8":1,"27":1,"28":1,"30":1,"33":1,"34":1,"35":1,"39":1,"41":1,"50":3,"62":1,"63":1,"64":2,"65":2,"66":4,"67":2,"73":5,"74":1,"75":2,"76":1,"77":4,"78":1,"80":1,"83":2,"84":1,"85":1,"90":1,"92":1,"94":1,"102":1,"104":1,"105":2,"107":1,"115":1,"122":1,"123":3,"124":1,"125":1,"126":1,"130":3,"131":1,"133":1,"141":1,"142":3,"143":2,"144":3,"145":1,"146":2,"147":1,"148":3,"149":1,"150":2,"153":2,"154":4,"155":2,"158":2,"160":1,"163":3,"164":1,"165":1,"167":1,"169":3,"174":1,"175":2,"179":2,"180":1,"187":4,"190":3,"191":1,"193":1,"194":6,"195":1,"198":1,"210":1,"213":1,"216":3,"219":2,"220":1,"223":3,"230":1,"232":2,"233":1,"234":1,"235":1,"239":1,"240":2,"241":2,"242":1,"243":1,"248":1,"253":1,"257":1,"263":1,"267":1,"278":1,"283":1,"284":1,"287":1,"288":2,"289":6,"290":2,"291":1,"301":1,"302":2,"303":2,"323":2,"325":1,"326":1,"327":1,"330":1,"331":2,"338":1,"342":2,"347":3,"352":2,"355":2,"356":1,"357":3,"358":4,"364":1,"366":1,"370":1,"371":1,"379":3,"380":2,"381":2,"383":1,"384":2,"386":1,"394":1,"396":1,"397":2,"399":1,"401":1,"407":1,"414":1,"415":2,"416":1,"420":1,"421":1,"429":1,"431":1,"432":1,"433":2,"434":1,"436":6,"441":2,"442":2,"444":2,"447":1,"449":1,"450":1,"452":1,"455":1,"458":2,"459":1,"461":3,"468":1,"470":2,"471":1,"472":1,"473":1,"477":1,"478":2}}],["cost",{"2":{"392":1}}],["coding",{"2":{"187":1}}],["codehash",{"2":{"395":2}}],["codeat",{"0":{"310":1},"2":{"310":1}}],["codein",{"2":{"167":1,"168":1}}],["code",{"0":{"221":1,"446":1},"2":{"23":1,"26":1,"27":1,"43":1,"53":1,"56":1,"67":1,"72":1,"75":1,"77":1,"80":1,"85":1,"101":1,"134":1,"141":1,"144":1,"146":1,"148":1,"150":3,"154":2,"168":2,"179":2,"192":1,"194":1,"216":3,"247":1,"257":1,"267":1,"283":1,"288":1,"289":1,"310":1,"357":1,"358":1,"395":2,"398":1,"437":1,"438":3,"446":1,"447":1,"449":4,"454":1,"455":2}}],["co",{"2":{"148":1}}],["cognito",{"2":{"134":2,"446":1}}],["colorschememanager",{"2":{"158":4}}],["colors",{"2":{"107":2,"158":1,"187":1}}],["color",{"0":{"158":1},"2":{"107":1,"158":3}}],["colleted",{"2":{"169":1}}],["collect",{"2":{"168":1,"177":1}}],["collected",{"2":{"167":2,"168":1}}],["collectibleinterface",{"2":{"85":2}}],["collectibleinfo",{"2":{"56":1}}],["collectible",{"0":{"85":1,"234":1,"472":1},"2":{"74":2,"85":1,"234":2,"472":2}}],["collectibles",{"0":{"9":1,"13":1,"74":1},"1":{"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"96":1,"121":1,"245":1,"373":1}}],["collectionaddress",{"2":{"346":1,"385":3}}],["collectionid",{"2":{"4":4}}],["collection",{"2":{"4":5,"24":2,"336":1,"385":3}}],["collections",{"0":{"4":1,"24":1},"2":{"2":1,"4":10}}],["collision",{"2":{"73":1}}],["coinquantity",{"2":{"120":1}}],["coinbase",{"2":{"114":1}}],["coins",{"2":{"96":1,"245":1,"373":1}}],["coingecko",{"2":{"30":1}}],["copied",{"2":{"84":1}}],["copy",{"2":{"3":1,"84":1,"150":1,"165":2,"216":1,"332":1,"333":1,"334":1}}],["corrupt",{"2":{"398":1}}],["corruption",{"2":{"398":1}}],["corresponds",{"2":{"402":1,"404":1,"407":1}}],["correspond",{"2":{"113":1,"114":1,"407":1}}],["corresponding",{"2":{"2":1,"26":1,"39":1,"41":1,"113":1,"114":1,"192":1,"387":1,"388":1}}],["correctness",{"2":{"436":1}}],["correct",{"2":{"66":1,"255":1,"264":1,"407":1,"415":1,"421":1,"432":1,"436":1}}],["corner",{"2":{"182":1}}],["core",{"2":{"99":1,"100":1,"117":1,"220":1,"278":1,"398":1,"459":1}}],["cors",{"2":{"80":1}}],["counterfactual",{"2":{"408":1,"438":1}}],["counter",{"2":{"395":1,"401":1,"416":1}}],["count",{"2":{"183":1,"420":1}}],["could",{"2":{"66":2,"324":1,"331":1,"359":1,"384":1}}],["course",{"2":{"33":1,"50":1,"193":1}}],["comes",{"2":{"380":1}}],["come",{"2":{"50":1}}],["combine",{"2":{"243":1}}],["combined",{"2":{"241":1,"370":1,"381":1,"388":1,"391":4,"407":1,"421":1}}],["combinations",{"0":{"391":1}}],["combination",{"2":{"50":1,"289":1,"391":1,"433":1}}],["combat",{"2":{"30":1}}],["communicating",{"2":{"358":1}}],["communication",{"2":{"11":1,"358":1,"377":1}}],["communicate",{"2":{"193":1}}],["commons",{"2":{"220":2,"459":2}}],["common",{"2":{"59":1,"188":1,"190":1,"192":1,"219":1,"241":1,"458":1}}],["command",{"2":{"57":1,"75":1,"76":1,"179":1,"248":1,"254":1,"265":1,"289":1}}],["commands",{"2":{"26":1,"127":2}}],["comma",{"2":{"50":1}}],["com",{"2":{"23":1,"24":1,"28":2,"30":1,"32":1,"37":1,"39":1,"41":1,"43":1,"47":2,"56":1,"57":2,"61":2,"62":2,"93":1,"129":1,"131":1,"139":8,"194":2,"206":1,"208":1,"238":1,"242":1,"247":1,"257":1,"267":1,"283":1,"285":1,"289":1,"371":1,"441":1,"443":4,"476":1}}],["coming",{"0":{"20":1,"159":1},"2":{"80":1,"140":1,"155":1,"223":1,"399":1,"407":1,"461":1}}],["computing",{"2":{"395":1,"438":1}}],["computed",{"2":{"394":1}}],["compute",{"0":{"393":1,"395":1},"2":{"395":1,"416":1}}],["computer",{"2":{"333":1,"376":1}}],["compared",{"2":{"380":1,"415":1,"416":1}}],["compat",{"2":{"82":1}}],["compatible",{"2":{"2":1,"8":2,"33":5,"45":1,"49":1,"61":1,"82":1,"193":1,"194":1,"243":1,"284":2,"355":2}}],["composed",{"2":{"241":1,"349":1,"370":1}}],["component",{"2":{"133":1,"165":1,"172":2,"289":12,"442":1}}],["components",{"0":{"291":1},"2":{"100":1,"101":1,"156":1,"288":1,"289":6,"291":1}}],["compromised",{"2":{"359":3,"380":1,"381":2,"383":1,"384":3}}],["comprised",{"2":{"156":1}}],["comprehensive",{"2":{"96":1,"245":1,"373":1}}],["compiled",{"2":{"154":1}}],["compile",{"2":{"154":1}}],["compliant",{"2":{"434":1}}],["complicated",{"2":{"150":2}}],["complexity",{"2":{"142":1,"187":1}}],["complex",{"0":{"145":1,"147":1,"149":1},"2":{"142":1,"150":1,"151":1,"433":1}}],["completeness",{"2":{"303":1}}],["completes",{"2":{"134":1}}],["completely",{"2":{"61":1,"63":1,"130":1,"189":1}}],["complete",{"2":{"30":1,"74":2,"75":1,"77":2,"85":1,"93":1,"101":1,"187":1,"190":1,"194":1,"238":1,"442":1,"448":1,"476":1}}],["completed",{"2":{"3":1,"85":1,"172":1,"395":1}}],["convention",{"2":{"219":1,"458":1}}],["convenient",{"2":{"191":1,"192":1,"223":1,"461":1}}],["convenience",{"2":{"49":1,"51":1,"145":1,"147":1,"149":1,"159":1,"191":1,"327":1,"328":2}}],["conversely",{"2":{"187":1,"190":1}}],["converted",{"2":{"324":1}}],["convert",{"2":{"144":1,"150":1}}],["congratulations",{"2":{"141":1,"341":1}}],["conflicts",{"2":{"123":1}}],["configs",{"2":{"421":1}}],["configjsonrpcprovider",{"2":{"220":1,"459":1}}],["config=",{"2":{"100":1,"101":3,"105":1,"117":1,"124":2}}],["config",{"2":{"92":1,"100":2,"101":3,"117":1,"124":1,"130":1,"132":2,"163":3,"177":2,"366":1,"436":1,"437":1,"440":1,"441":1,"442":1,"443":1,"444":1,"454":1,"455":1}}],["configuring",{"0":{"119":1},"1":{"120":1,"121":1},"2":{"130":1}}],["configure",{"2":{"100":1,"105":1,"109":1,"119":1,"347":1,"358":1,"379":1}}],["configured",{"2":{"80":4,"136":1,"137":1,"402":1}}],["configurations",{"2":{"100":1,"124":1,"415":1,"430":1,"436":2}}],["configuration",{"0":{"105":1,"109":1,"120":1,"121":1,"387":1,"388":1,"392":1,"394":1,"401":1,"408":1,"414":1,"415":1,"416":1,"417":1,"429":1,"436":1,"438":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"388":1,"389":2,"390":2,"391":2,"392":2,"393":3,"394":1,"395":3,"402":1,"403":1,"404":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":2,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1},"2":{"91":1,"97":1,"100":1,"105":1,"120":1,"121":1,"124":2,"136":1,"137":1,"246":1,"356":1,"365":1,"374":1,"387":1,"392":1,"393":2,"394":1,"401":2,"402":1,"403":1,"404":1,"405":1,"406":1,"407":3,"408":4,"410":1,"415":2,"429":1,"432":1,"436":5,"437":2,"438":3}}],["confirms",{"2":{"216":1}}],["confirmations",{"2":{"223":1,"461":1}}],["confirmation",{"0":{"222":1,"460":1},"2":{"74":1,"216":1,"222":1,"229":1,"460":1,"467":1}}],["confirm",{"2":{"3":1,"223":1,"461":1}}],["connectweb3react",{"2":{"278":1}}],["connectoptions",{"2":{"195":2}}],["connector",{"0":{"123":1,"288":1,"289":1},"2":{"113":2,"114":2,"123":12,"124":3,"191":1,"247":1,"248":5,"249":2,"254":3,"255":2,"257":1,"258":1,"259":1,"265":3,"274":2,"275":2,"277":2,"278":1}}],["connectorsforwallets",{"2":{"259":2}}],["connectors",{"0":{"122":1,"124":1,"125":1,"243":1},"1":{"123":1},"2":{"99":4,"100":3,"101":3,"113":2,"114":2,"122":4,"123":5,"124":5,"125":2,"243":4,"249":4,"259":2,"277":1,"278":2,"287":1,"289":3}}],["connectdetails",{"2":{"194":3,"195":1,"204":1,"219":2,"220":1,"458":2,"459":1}}],["connected",{"0":{"183":1},"2":{"141":1,"180":1,"183":2,"194":1,"216":1,"219":1,"309":1,"313":1,"458":1}}],["connecttowaas",{"2":{"141":1}}],["connecting",{"0":{"141":1,"194":1,"214":1,"215":1,"216":1},"2":{"100":1,"141":1,"203":2,"204":1,"206":1,"216":1}}],["connections",{"2":{"96":1,"245":1,"373":1}}],["connection",{"2":{"7":1,"98":1,"102":1,"216":3,"252":2,"262":1,"278":1,"281":1,"303":1}}],["connect",{"0":{"102":1,"193":1,"195":1,"225":1,"252":1,"262":1,"463":1},"1":{"194":1,"195":1,"196":2,"197":2,"198":2,"199":2,"200":2,"201":2,"202":2,"203":2,"204":2,"205":2,"206":2,"207":2,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":1,"215":1,"216":1},"2":{"75":1,"84":2,"96":1,"100":1,"101":1,"102":1,"114":1,"124":1,"193":3,"194":7,"195":2,"196":2,"199":1,"200":1,"201":1,"202":3,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"216":1,"219":5,"220":1,"225":1,"245":1,"247":1,"249":1,"252":1,"253":1,"257":1,"259":1,"262":2,"263":1,"267":1,"271":1,"272":1,"280":1,"283":1,"284":2,"347":1,"373":1,"379":1,"458":5,"459":1,"463":1}}],["consensys",{"0":{"427":1},"2":{"425":1}}],["consent",{"2":{"130":1,"355":1}}],["considered",{"2":{"388":1,"391":1,"430":1,"431":1,"436":1,"447":1}}],["consider",{"2":{"290":1}}],["considerations",{"2":{"255":1,"264":1,"413":1}}],["consulted",{"2":{"289":1}}],["consumption",{"2":{"37":1}}],["cons",{"2":{"120":1}}],["console",{"2":{"7":2,"23":1,"24":1,"32":1,"37":1,"39":1,"41":1,"43":1,"56":1,"57":2,"66":3,"72":2,"77":1,"80":1,"120":1,"194":2,"218":1,"220":2,"228":2,"230":2,"231":1,"232":2,"233":2,"234":2,"235":2,"385":1,"400":1,"440":1,"442":2,"443":1,"448":1,"451":1,"452":1,"454":1,"455":1,"457":1,"459":2,"466":2,"468":2,"469":1,"470":2,"471":2,"472":2,"473":2}}],["constants",{"0":{"412":1,"413":1},"2":{"408":4,"414":2}}],["constraints",{"2":{"358":1}}],["constructions",{"2":{"355":1}}],["constructor",{"2":{"327":1}}],["construct",{"2":{"321":1,"325":1,"419":1,"420":1}}],["const",{"2":{"7":3,"23":3,"24":4,"27":2,"32":3,"37":3,"39":4,"41":3,"43":2,"46":1,"56":2,"57":4,"66":14,"72":7,"73":6,"77":7,"80":11,"85":3,"92":1,"100":6,"101":7,"102":4,"103":3,"105":1,"117":1,"118":4,"119":1,"123":2,"124":3,"167":6,"168":1,"169":1,"175":4,"194":11,"195":1,"218":2,"219":2,"220":5,"225":3,"226":3,"227":2,"228":3,"229":2,"230":1,"231":3,"232":12,"233":13,"234":13,"235":13,"249":2,"259":1,"269":3,"277":2,"278":3,"288":2,"289":2,"366":1,"385":1,"393":2,"395":6,"400":4,"408":1,"414":1,"419":4,"420":6,"424":1,"437":1,"440":3,"441":6,"442":9,"443":2,"444":2,"448":1,"449":2,"450":1,"452":1,"454":2,"455":2,"457":2,"458":2,"459":5,"463":3,"464":3,"465":2,"466":3,"467":2,"468":1,"469":3,"470":12,"471":13,"472":13,"473":13}}],["continue",{"2":{"452":1}}],["contains",{"2":{"61":1,"62":1,"63":1,"104":1,"179":1,"358":1,"398":1,"402":1}}],["contain",{"2":{"61":1,"62":1,"139":1,"430":1,"433":1}}],["containing",{"2":{"56":1,"57":1,"289":1,"381":1}}],["contact",{"2":{"5":1,"23":1,"43":1,"56":1,"57":2,"91":1,"365":1,"385":1,"447":1}}],["contribution",{"2":{"436":1}}],["contributes",{"2":{"434":1}}],["contribute",{"2":{"125":1}}],["controlling",{"2":{"172":1,"384":1}}],["controlled",{"2":{"66":2,"72":1,"77":1,"380":1}}],["control",{"2":{"30":1,"80":3,"123":1,"131":1,"187":1,"219":1,"380":1,"382":1,"383":1,"384":1,"429":1,"458":1}}],["contractbytecodeasstring",{"2":{"326":1}}],["contractdeploymentresult",{"2":{"326":1}}],["contractdeploymentreturn",{"2":{"154":1}}],["contractdeployer",{"2":{"326":2}}],["contractcall",{"2":{"323":3,"327":1}}],["contractabi",{"2":{"323":2,"325":2}}],["contractabiasstring",{"2":{"150":2,"151":1}}],["contractaddresses",{"2":{"37":1,"43":3}}],["contractaddress",{"2":{"23":2,"24":6,"37":1,"39":4,"41":6,"50":1,"52":3,"56":3,"57":3,"61":1,"62":1,"66":1,"85":2,"115":1,"120":1,"121":1,"150":2,"151":1,"310":1,"322":1,"323":2,"325":2,"326":1,"327":1}}],["contracturi",{"2":{"44":1,"64":1}}],["contractinfo",{"2":{"43":1,"47":1}}],["contractmetadata",{"2":{"43":2}}],["contracts",{"0":{"322":1,"325":1,"326":1,"348":1},"1":{"323":1,"324":1,"325":1,"326":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1},"2":{"8":2,"23":1,"24":1,"30":2,"37":1,"41":1,"43":1,"54":1,"57":1,"61":2,"62":1,"77":2,"151":1,"154":1,"324":1,"335":1,"352":2,"357":1,"392":1,"425":1,"436":2}}],["contract",{"0":{"9":1,"10":1,"13":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":2,"44":1,"56":1,"77":1,"79":1,"154":1,"323":1,"336":1,"337":1,"338":1,"352":1,"425":1},"1":{"39":1,"41":1,"43":1,"44":1,"78":1,"79":1,"353":1,"426":1,"427":1,"428":1},"2":{"4":4,"8":1,"11":2,"23":2,"24":4,"30":1,"33":1,"35":3,"37":3,"39":8,"41":9,"42":5,"43":2,"44":1,"45":1,"49":3,"50":10,"52":1,"54":5,"55":3,"56":1,"57":1,"61":2,"62":2,"64":3,"65":1,"66":3,"67":4,"74":1,"77":4,"78":1,"79":2,"80":7,"81":2,"85":2,"120":2,"141":1,"144":2,"145":2,"146":1,"147":2,"148":2,"149":2,"150":4,"151":2,"154":5,"191":1,"233":1,"234":1,"310":1,"322":8,"323":8,"325":9,"326":1,"327":5,"328":1,"330":1,"335":1,"336":2,"337":1,"338":3,"339":1,"342":1,"348":2,"352":1,"356":1,"358":1,"385":4,"389":1,"392":2,"395":2,"396":2,"400":1,"401":1,"407":1,"408":1,"418":1,"434":1,"438":1,"471":1,"472":1}}],["contrast",{"2":{"3":1}}],["context",{"0":{"424":1},"2":{"23":2,"24":2,"28":1,"32":2,"37":2,"39":2,"41":2,"43":1,"47":1,"56":1,"57":2,"292":1,"302":1,"395":1,"408":1,"429":1}}],["content",{"2":{"23":2,"24":2,"32":2,"37":2,"39":2,"41":2,"43":2,"56":2,"57":4,"58":1,"80":1,"83":1,"84":1,"165":3,"288":1,"289":2,"332":1,"346":1,"385":3}}],["ubiquitous",{"2":{"327":1}}],["umd",{"2":{"242":3,"371":3}}],["ue",{"2":{"167":1}}],["ufunction",{"2":{"167":6,"175":1}}],["ufunctions",{"2":{"167":1}}],["uobject",{"2":{"167":3,"172":1,"174":1}}],["uauthenticator",{"2":{"167":5,"169":1,"174":2,"175":1}}],["utf",{"2":{"139":2}}],["utility",{"2":{"124":1,"228":1,"466":1}}],["utilizing",{"2":{"4":1}}],["utilized",{"2":{"187":1,"240":1,"478":1}}],["utilize",{"2":{"3":1,"63":1,"100":1,"102":1}}],["utils",{"2":{"66":1,"72":1,"73":4,"77":2,"85":1,"226":2,"228":1,"230":1,"232":2,"233":2,"234":2,"235":3,"393":3,"395":7,"400":2,"420":1,"437":4,"464":2,"466":1,"468":1,"470":2,"471":2,"472":2,"473":3}}],["ui",{"0":{"155":1,"157":1,"167":1},"1":{"156":1,"157":1,"158":2,"159":2},"2":{"131":1,"133":2,"155":6,"156":1,"157":2,"158":1,"159":1,"165":1,"167":1,"168":1,"172":6,"187":1,"191":1}}],["uint96",{"2":{"437":1}}],["uint32",{"2":{"432":1}}],["uint160",{"2":{"434":1}}],["uint16",{"2":{"431":1,"436":1}}],["uint80",{"2":{"389":1}}],["uint8",{"2":{"324":1,"393":4,"420":1,"434":1,"436":1}}],["uint256",{"2":{"61":1,"62":1,"66":1,"72":1,"85":2,"150":1,"232":2,"233":2,"234":4,"235":4,"322":1,"340":2,"393":2,"434":2,"437":2,"470":2,"471":2,"472":4,"473":4}}],["uint64",{"2":{"57":1,"385":1}}],["uint",{"2":{"57":1,"324":1}}],["ultimate",{"2":{"95":1,"244":1,"372":1}}],["ux",{"2":{"87":1,"361":1}}],["unauthenticated",{"2":{"436":1}}],["unauthorized",{"2":{"382":1}}],["unbalanced",{"2":{"433":1}}],["unbuffered",{"2":{"73":1}}],["unusable",{"2":{"407":1,"410":1,"413":1}}],["unpkg",{"2":{"242":1,"371":1}}],["unparalleled",{"2":{"148":1}}],["unfamiliar",{"2":{"141":1,"142":1,"153":1,"154":1}}],["unexpected",{"2":{"132":1}}],["unnoticed",{"2":{"131":1}}],["unlimited",{"2":{"388":1,"413":2}}],["unless",{"2":{"127":1,"150":1,"304":1}}],["unleash",{"2":{"96":1,"245":1,"373":1}}],["unlock",{"2":{"95":1,"244":1,"372":1,"381":2}}],["until",{"2":{"92":1,"172":1,"288":1,"366":1,"448":1}}],["unknown",{"2":{"80":1,"407":1}}],["unsanitized",{"2":{"407":1}}],["unsafe",{"2":{"290":1}}],["unsupported",{"2":{"80":1}}],["unstoppable",{"2":{"50":1}}],["underwent",{"2":{"425":1}}],["underlying",{"2":{"352":1,"396":1,"398":1}}],["understand",{"2":{"291":1,"324":1}}],["understands",{"2":{"159":1}}],["understanding",{"0":{"324":1},"2":{"150":1}}],["under",{"2":{"77":1,"130":1,"132":1,"133":3,"139":1,"144":1,"155":2,"163":2,"179":2,"339":1,"340":1,"391":1}}],["undefined",{"2":{"66":1,"72":1,"80":5,"115":1,"442":1}}],["unwanted",{"2":{"66":1}}],["uniswap",{"2":{"216":1}}],["universal",{"2":{"96":1,"189":1,"190":1,"191":1,"192":1,"245":1,"368":1,"373":1}}],["unit",{"2":{"50":1,"62":1}}],["unityactivity",{"2":{"139":2}}],["unitythemeselector",{"2":{"139":2}}],["unityplayer",{"2":{"139":2}}],["unityplayeractivity",{"2":{"139":2}}],["unitypackage",{"2":{"131":2}}],["unity3d",{"2":{"139":3}}],["unity",{"0":{"29":1,"48":1},"2":{"29":1,"48":1,"90":3,"126":3,"127":1,"129":2,"130":3,"131":3,"139":4,"141":1,"142":1,"152":2,"153":1,"154":3,"157":1,"158":2,"187":1,"190":1,"197":1,"290":3,"364":3}}],["unique",{"0":{"41":1},"2":{"35":1,"123":1,"132":1,"331":1,"400":1}}],["unverified",{"2":{"30":1}}],["unreal",{"0":{"29":1,"48":1,"173":1,"179":1},"2":{"29":1,"48":1,"160":3,"161":1,"169":1,"173":1,"179":5,"187":1,"190":1,"197":1}}],["u",{"2":{"28":1,"47":1}}],["uri",{"0":{"339":1},"2":{"61":2,"62":4}}],["uris",{"2":{"4":1}}],["url",{"0":{"334":1},"2":{"4":2,"7":2,"50":2,"57":1,"62":1,"76":2,"84":1,"85":2,"110":1,"127":1,"129":2,"132":1,"135":2,"136":2,"137":2,"139":3,"174":1,"206":1,"302":2,"334":1,"338":1,"339":2,"346":1}}],["upgradeability",{"2":{"353":1}}],["upgraded",{"2":{"352":1}}],["upi",{"2":{"347":1,"379":1}}],["upon",{"2":{"230":1,"252":1,"272":1,"468":1}}],["ups",{"2":{"190":1}}],["uproject",{"2":{"165":1}}],["updating",{"0":{"342":1},"2":{"81":1,"130":1,"131":1,"397":1,"401":1,"413":1}}],["updateimagehash",{"0":{"406":1},"1":{"407":1,"409":1,"410":1,"411":1,"412":1,"413":1},"2":{"406":1,"408":2,"413":1,"414":2}}],["updateimplementation",{"2":{"398":3,"408":1,"413":1}}],["updateconfiguration",{"0":{"398":1},"1":{"399":1}}],["updated",{"2":{"216":1,"392":1,"405":1,"408":1,"413":3,"414":2,"415":1,"416":2}}],["updates",{"0":{"414":1},"2":{"57":1,"155":1,"394":1,"406":1,"430":1,"432":1}}],["update",{"0":{"77":1,"78":1,"338":1,"396":1,"408":1},"1":{"78":1,"79":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2},"2":{"2":1,"3":1,"4":1,"74":1,"77":2,"78":1,"130":1,"165":1,"332":1,"342":1,"398":1,"408":3,"410":1,"442":1}}],["uptime",{"2":{"33":1}}],["uploaded",{"2":{"334":1,"340":1}}],["uploading",{"2":{"11":1}}],["upload",{"0":{"333":1},"2":{"4":6,"332":1,"333":2}}],["up",{"0":{"100":1,"101":1,"332":1,"335":1,"440":1,"441":1},"1":{"441":1,"442":1},"2":{"3":1,"22":1,"25":1,"30":1,"31":1,"33":1,"36":1,"38":1,"40":1,"127":1,"135":1,"139":1,"172":1,"173":1,"176":1,"179":1,"272":1,"335":1,"340":1,"440":1,"442":1}}],["usual",{"2":{"441":2}}],["usually",{"2":{"150":1,"340":1}}],["us",{"2":{"150":1,"159":1,"187":1,"220":1,"357":1,"459":1}}],["usable",{"2":{"8":1,"440":1}}],["usage",{"0":{"5":1,"49":1,"51":1,"249":1,"259":1,"269":1,"276":1,"284":1},"1":{"50":1,"51":1,"52":1,"53":1,"54":1,"277":1,"278":1},"2":{"45":1,"243":1,"355":1,"392":1}}],["usdc",{"2":{"8":1,"66":4,"211":1,"353":1}}],["using",{"0":{"18":1,"67":1,"74":1,"84":1,"124":1,"224":1,"247":1,"254":1,"255":1,"257":1,"264":1,"265":1,"267":1,"274":1,"283":1,"288":1,"289":1,"462":1},"1":{"68":1,"69":1,"70":1,"71":1,"72":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"284":1,"285":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1},"2":{"3":1,"6":1,"7":1,"23":1,"24":1,"27":2,"30":1,"32":1,"37":1,"39":1,"41":1,"42":1,"43":1,"46":3,"55":1,"56":1,"58":3,"66":1,"73":1,"77":2,"80":1,"83":2,"91":1,"92":1,"102":1,"103":1,"105":1,"119":1,"122":1,"124":1,"127":1,"130":1,"131":1,"133":1,"144":2,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"155":2,"168":1,"172":1,"174":2,"175":1,"193":2,"194":1,"216":2,"219":1,"220":1,"222":1,"228":1,"243":2,"247":1,"248":1,"253":1,"254":1,"255":3,"256":1,"257":1,"263":1,"264":3,"265":1,"267":1,"283":1,"287":2,"289":4,"293":1,"301":1,"302":3,"353":1,"355":1,"358":1,"365":1,"366":1,"369":1,"377":1,"380":1,"381":1,"384":1,"394":1,"399":1,"401":1,"407":1,"408":1,"438":1,"440":1,"441":2,"442":1,"444":1,"447":1,"452":1,"454":1,"458":1,"459":1,"460":1,"466":1}}],["useismounted",{"2":{"288":2}}],["useeffect",{"2":{"288":1,"442":3}}],["useweb3react",{"2":{"278":2}}],["usequencewallet",{"0":{"174":1},"2":{"172":6,"174":4}}],["usecheckoutmodal",{"2":{"118":3}}],["useopenwalletmodal",{"2":{"103":3}}],["useopenconnectmodal",{"2":{"102":3}}],["useaccount",{"2":{"102":3}}],["userid",{"2":{"443":2}}],["useraddress",{"2":{"225":1,"228":1,"385":3,"463":1,"466":1}}],["userwallet",{"2":{"172":1}}],["user",{"2":{"74":1,"92":1,"102":2,"134":3,"135":1,"141":1,"168":1,"187":2,"193":1,"194":5,"196":1,"204":1,"207":2,"208":3,"209":1,"216":9,"218":1,"219":6,"220":1,"223":4,"227":1,"229":1,"355":1,"357":3,"358":4,"359":2,"366":1,"380":2,"381":4,"383":2,"384":4,"385":3,"439":3,"441":6,"442":1,"443":1,"447":2,"449":2,"450":1,"457":1,"458":6,"459":1,"461":4,"465":1,"467":1}}],["users",{"0":{"217":1,"456":1},"1":{"218":1,"219":1,"220":1,"457":1,"458":1,"459":1},"2":{"8":2,"65":1,"95":1,"96":2,"131":1,"135":1,"155":1,"167":1,"187":1,"190":4,"191":3,"193":8,"194":3,"206":1,"210":2,"211":1,"213":3,"219":2,"222":1,"223":2,"244":1,"245":2,"284":1,"290":1,"303":1,"347":3,"359":1,"372":1,"373":2,"377":1,"379":3,"380":1,"382":1,"383":1,"384":3,"386":1,"445":1,"446":1,"447":1,"458":2,"460":1,"461":2}}],["usefulness",{"2":{"148":1}}],["useful",{"2":{"49":1,"107":1,"130":2,"143":1,"154":1,"213":1,"223":1,"461":1}}],["usestate",{"2":{"442":4}}],["usesessionhash",{"2":{"442":5}}],["uses",{"2":{"33":1,"61":1,"62":1,"132":1,"135":1,"187":1,"255":3,"264":3,"384":1,"396":1}}],["usedisconnect",{"2":{"102":1}}],["used",{"0":{"287":1},"2":{"3":1,"64":1,"66":1,"72":1,"75":1,"92":1,"107":1,"109":1,"130":1,"145":1,"147":1,"149":1,"164":1,"167":1,"199":1,"247":1,"274":1,"283":1,"288":1,"290":1,"294":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"313":1,"314":1,"316":1,"317":1,"318":1,"319":1,"366":1,"384":1,"392":1,"395":1,"409":1,"410":1,"429":1,"430":1,"432":1,"433":1,"436":1,"438":1,"441":2,"442":5}}],["use",{"0":{"80":1,"288":1,"289":1},"1":{"81":1,"82":1,"83":1,"84":1},"2":{"1":1,"4":4,"6":1,"26":1,"33":1,"39":2,"41":2,"45":1,"61":3,"63":3,"65":1,"66":3,"73":1,"74":1,"75":1,"77":1,"80":1,"104":1,"118":1,"123":2,"124":1,"131":1,"133":2,"139":1,"142":1,"143":1,"144":2,"145":1,"146":1,"147":1,"148":1,"149":1,"150":2,"151":1,"153":1,"154":3,"155":1,"158":1,"163":1,"164":1,"165":2,"169":2,"172":1,"173":1,"174":2,"175":1,"177":1,"180":1,"194":2,"204":1,"212":1,"219":1,"229":1,"237":1,"240":1,"243":1,"254":1,"255":1,"264":1,"265":1,"284":1,"288":1,"289":4,"294":1,"301":1,"302":2,"303":1,"321":1,"323":5,"325":4,"326":1,"327":2,"328":1,"333":1,"340":1,"350":1,"381":1,"386":1,"409":1,"442":1,"448":1,"451":1,"458":1,"467":1,"475":1,"478":1}}],["effectively",{"2":{"382":1}}],["efforts",{"2":{"155":1}}],["effortlessly",{"2":{"95":1,"96":1,"244":1,"245":1,"372":1,"373":1}}],["ecdsa",{"2":{"349":1}}],["ecosystem",{"2":{"59":1,"125":1}}],["equal",{"2":{"299":1,"300":1,"431":1}}],["equally",{"2":{"235":1,"473":1}}],["equivalent",{"2":{"93":1,"238":1,"476":1}}],["ephemeral",{"2":{"222":1,"223":1,"226":1,"460":1,"461":1,"464":1}}],["eye",{"2":{"175":1}}],["eyes",{"2":{"61":1}}],["estimate",{"2":{"311":1}}],["estimategas",{"0":{"311":1},"2":{"311":1}}],["established",{"2":{"447":1}}],["establish",{"2":{"134":1}}],["establishing",{"2":{"133":1}}],["esocialsignintype",{"2":{"167":1}}],["essentially",{"2":{"152":1,"154":1,"339":1}}],["essentials",{"2":{"129":1,"131":1}}],["edit",{"2":{"131":1,"136":1,"137":1,"139":1,"158":1}}],["editor",{"2":{"129":1,"135":1}}],["emitted",{"2":{"454":1}}],["empower",{"2":{"131":1}}],["emailauth",{"2":{"168":1}}],["emailcode",{"2":{"167":1,"168":1}}],["emailin",{"2":{"167":1,"168":1}}],["emaillogin",{"2":{"167":1,"168":1}}],["emailed",{"2":{"134":1}}],["email",{"0":{"134":1,"168":1,"441":1,"446":1},"2":{"112":1,"134":1,"141":1,"167":1,"168":3,"204":1,"208":3,"209":1,"357":1,"358":1,"381":2,"384":2,"440":1,"441":13,"446":1,"447":1,"448":2,"449":1}}],["embedded",{"0":{"17":1,"101":1,"103":1,"355":1},"1":{"356":1,"357":1,"358":1,"359":1},"2":{"87":1,"88":1,"90":2,"91":3,"92":1,"96":2,"98":1,"99":1,"101":1,"103":1,"115":1,"126":2,"133":2,"245":2,"331":1,"355":2,"356":1,"361":1,"362":1,"364":2,"365":3,"366":1,"373":2,"439":1,"441":1,"445":1,"455":1}}],["elsewhere",{"2":{"287":1}}],["else",{"2":{"80":2,"167":1,"228":1,"230":1,"357":1,"455":1,"466":1,"468":1}}],["elements",{"2":{"133":1}}],["element",{"2":{"62":1,"136":1,"137":1,"442":2}}],["eoas",{"2":{"348":1,"349":1,"352":1}}],["eoawallet",{"2":{"293":2}}],["eoa",{"0":{"80":1},"1":{"81":1,"82":1,"83":1,"84":1},"2":{"66":7,"72":2,"74":1,"77":5,"80":1,"81":1,"85":1,"94":1,"239":1,"293":1,"294":1,"389":1,"434":1,"477":1}}],["eip1271",{"2":{"220":1,"240":1,"459":1,"478":1}}],["eip1155",{"2":{"59":1}}],["eip712",{"2":{"200":1,"219":4,"458":4}}],["eip721",{"2":{"59":1}}],["eips",{"2":{"61":4,"62":2}}],["eip",{"2":{"61":3,"62":2,"220":1,"389":1,"407":1,"459":1}}],["either",{"2":{"51":1,"58":1,"61":1,"63":2,"77":1,"84":1,"124":1,"141":1,"150":1,"151":1,"169":1,"172":1,"174":1,"235":1,"299":1,"300":1,"358":1,"380":1,"397":1,"434":1,"452":1,"453":1,"473":1}}],["evm",{"2":{"26":1,"33":1,"55":1,"143":1,"144":1,"150":2,"194":1,"290":2,"293":1,"324":1,"355":1}}],["ever",{"2":{"172":1,"322":1,"438":1}}],["everywhere",{"2":{"193":1}}],["every",{"2":{"33":2,"222":1,"387":1,"389":1,"392":1,"396":1,"400":1,"460":1}}],["everything",{"2":{"4":1,"30":1,"290":1}}],["event",{"2":{"141":1,"153":1,"164":1,"179":1,"194":1}}],["events",{"2":{"33":1,"141":1,"142":2,"153":1,"154":3,"181":1,"184":1,"451":1}}],["even",{"2":{"8":1,"23":1,"24":1,"33":1,"37":1,"41":1,"130":1,"187":1,"235":1,"324":1,"380":1,"384":1,"399":1,"407":1,"473":1}}],["ealiest",{"2":{"305":1,"308":1,"310":1,"312":1,"314":1}}],["earliest",{"2":{"304":2}}],["earlier",{"2":{"130":1,"339":1}}],["earring",{"2":{"61":1}}],["each",{"0":{"191":1},"2":{"23":1,"73":1,"151":2,"167":1,"173":1,"179":1,"223":1,"299":1,"300":1,"331":1,"332":3,"355":2,"356":1,"380":2,"433":1,"436":3,"461":1}}],["easier",{"2":{"159":1}}],["easily",{"2":{"8":1,"33":2,"50":1,"116":1,"131":1,"144":2,"146":1,"148":1,"219":1,"240":1,"283":1,"293":1,"294":1,"330":1,"458":1,"478":1}}],["easy",{"2":{"1":1,"33":2,"37":1,"59":1,"133":1,"151":1,"175":1,"190":1,"235":1,"350":1,"473":1}}],["ethtransaction",{"2":{"297":1,"298":1,"299":2,"300":2,"321":1,"323":4,"327":2}}],["ethwallet",{"2":{"293":4,"294":1,"299":2,"300":2}}],["ethauth",{"2":{"199":1,"200":1,"201":1,"219":1,"220":7,"458":1,"459":7}}],["ethauthproofstring",{"2":{"80":2}}],["ethauthproof",{"0":{"80":1,"84":1},"1":{"81":1,"82":1,"83":1,"84":1},"2":{"74":1,"84":1}}],["ethkit",{"0":{"94":1,"239":1,"477":1},"2":{"94":2,"239":2,"477":2}}],["eth",{"0":{"31":1,"32":1},"1":{"32":1},"2":{"143":3,"194":1,"321":1}}],["ether",{"2":{"420":1}}],["etherscan",{"2":{"150":1}}],["ethers",{"0":{"214":1,"412":1,"413":1},"2":{"7":7,"27":3,"66":4,"72":2,"73":6,"77":7,"80":2,"85":8,"94":1,"99":3,"193":1,"220":3,"225":2,"226":3,"230":1,"232":2,"233":2,"234":2,"235":3,"239":1,"241":5,"242":2,"248":2,"254":3,"258":2,"265":3,"268":2,"275":1,"370":4,"371":2,"393":3,"395":7,"400":4,"408":4,"414":2,"437":4,"459":3,"463":2,"464":3,"468":1,"470":2,"471":2,"472":2,"473":3,"477":1}}],["ethereum",{"0":{"32":1,"215":1,"419":1},"2":{"2":1,"8":2,"26":1,"33":4,"45":1,"49":2,"50":1,"61":2,"62":1,"66":1,"72":1,"94":1,"193":3,"194":1,"239":1,"240":1,"241":1,"243":1,"290":1,"303":1,"348":1,"349":1,"355":1,"377":1,"419":1,"477":1,"478":1}}],["etc",{"0":{"31":1,"32":1},"1":{"32":1},"2":{"8":1,"43":1,"56":1,"57":1,"252":1,"253":1,"263":1,"331":1,"357":1,"358":1,"440":1}}],["err",{"2":{"23":3,"24":3,"28":1,"32":3,"37":3,"39":3,"41":3,"43":1,"47":1,"56":1,"57":2,"80":7,"85":2,"220":2,"459":2}}],["errors",{"2":{"172":1,"287":1}}],["error",{"0":{"287":1},"2":{"7":1,"66":2,"77":1,"150":1,"167":1,"175":2,"179":1,"442":6,"455":3}}],["erc1271",{"2":{"421":1,"434":1}}],["erc1155data",{"2":{"235":2,"473":2}}],["erc1155contractaddress",{"2":{"234":2,"235":1,"472":2,"473":1}}],["erc1155interface",{"2":{"234":5,"235":2,"472":5,"473":2}}],["erc1155tokenaddress",{"2":{"148":1,"151":1,"234":1,"472":1}}],["erc1155s",{"2":{"130":1}}],["erc1155",{"0":{"23":1,"24":1,"39":1,"43":1,"56":1,"62":1,"77":1,"149":1},"1":{"78":1,"79":1},"2":{"4":1,"24":1,"30":1,"33":3,"35":1,"37":1,"39":1,"41":2,"42":2,"49":1,"50":1,"54":4,"55":3,"61":2,"62":2,"63":1,"74":1,"80":1,"81":1,"148":5,"149":9,"327":1,"328":1}}],["erc21",{"2":{"147":1}}],["erc20contract",{"2":{"323":6,"325":4}}],["erc20data",{"2":{"235":2,"473":2}}],["erc20tokenaddress",{"2":{"144":1,"151":2}}],["erc20interface",{"2":{"73":2,"232":5,"235":2,"470":5,"473":2}}],["erc20",{"0":{"23":1,"39":1,"41":1,"43":1,"64":1,"145":1},"2":{"30":1,"33":3,"35":2,"37":1,"39":1,"41":2,"42":2,"49":1,"54":2,"64":3,"144":5,"145":9,"150":1,"151":1,"322":1,"323":2,"325":2,"327":8,"328":1,"353":1}}],["erc",{"0":{"232":1,"233":1,"234":1,"419":1,"420":1,"470":1,"471":1,"472":1},"2":{"61":1,"62":1,"66":1,"232":3,"233":3,"234":3,"336":1,"338":1,"418":1,"419":1,"420":1,"470":3,"471":3,"472":3}}],["erc721data",{"2":{"235":2,"473":2}}],["erc721contractaddress",{"2":{"233":2,"235":1,"471":2,"473":1}}],["erc721tokenaddress",{"2":{"66":1,"72":1,"146":1,"151":1,"233":1,"471":1}}],["erc721interface",{"2":{"66":2,"72":2,"233":5,"235":2,"471":5,"473":2}}],["erc721",{"0":{"23":1,"24":1,"39":1,"43":1,"56":1,"61":1,"147":1},"2":{"4":1,"23":2,"24":1,"30":1,"33":3,"37":1,"39":1,"41":2,"42":2,"49":1,"54":4,"55":3,"61":1,"63":1,"80":1,"81":1,"146":3,"147":8,"327":1,"328":1}}],["e",{"2":{"4":1,"66":1,"72":1,"120":1,"139":1,"145":1,"147":1,"149":1,"155":1,"223":1,"253":1,"263":1,"322":1,"353":1,"357":1,"461":1}}],["enum",{"2":{"385":1}}],["ensuring",{"2":{"187":1,"436":1}}],["ensures",{"2":{"72":1}}],["ensure",{"2":{"4":1,"7":1,"8":1,"129":1,"174":2,"179":1,"219":1,"384":2,"407":1,"432":1,"458":1}}],["engines",{"2":{"187":1,"190":1}}],["enclave",{"2":{"357":1}}],["encrypted",{"2":{"357":1}}],["encrypt",{"2":{"164":1}}],["encryption",{"2":{"164":1}}],["encourage",{"2":{"157":1,"328":1}}],["encodepacked",{"2":{"435":1,"436":1}}],["encodetypeddatadigest",{"2":{"420":2}}],["encode",{"2":{"150":1,"232":2,"233":2,"234":2,"393":5,"400":1,"420":1,"421":1,"437":2,"470":2,"471":2,"472":2}}],["encoded",{"2":{"150":1,"419":2,"420":1,"421":1}}],["encodefunctiondata",{"2":{"66":1,"72":1,"73":2,"85":1,"232":3,"233":3,"234":3,"235":3,"408":2,"414":1,"470":3,"471":3,"472":3,"473":3}}],["encoding",{"0":{"418":1},"1":{"419":1,"420":1,"421":1},"2":{"150":2,"322":1}}],["encoding=",{"2":{"139":2}}],["enabling",{"2":{"96":1,"245":1,"289":1,"357":1,"373":1}}],["enable",{"2":{"135":1,"139":1,"165":1}}],["enabled",{"2":{"23":1,"24":1,"37":1,"41":1,"241":1}}],["enables",{"2":{"6":1,"116":1,"355":1}}],["enjoy",{"2":{"96":1,"125":1,"190":1,"245":1,"373":1}}],["env",{"2":{"80":20,"85":11,"92":2,"366":2,"440":2,"441":2,"442":2,"443":2,"444":2,"454":2,"455":2}}],["environment",{"0":{"75":1,"81":1},"1":{"76":1},"2":{"74":1,"75":1,"80":5,"81":1,"82":1}}],["entire",{"2":{"150":1,"289":1,"322":1,"333":1}}],["entirely",{"2":{"64":1,"157":1}}],["entered",{"2":{"134":1}}],["enter",{"2":{"75":1,"76":1,"129":1,"134":1,"136":1,"137":1,"340":1}}],["enforce",{"2":{"66":3,"358":1}}],["enqueuetokensforrefresh",{"2":{"57":6}}],["endingblocknumber",{"2":{"308":1}}],["endpoint",{"2":{"4":2,"6":1,"7":2,"26":2,"49":1,"50":1,"52":1,"54":1,"83":1,"342":2}}],["endpointssequence",{"2":{"49":1}}],["endpoints",{"0":{"34":1,"52":1},"2":{"2":3,"6":1,"8":1,"26":3,"49":3,"58":1}}],["end",{"2":{"4":2}}],["examine",{"2":{"150":1}}],["examples",{"0":{"256":1,"266":1,"351":1,"354":1},"2":{"26":1,"27":1,"28":1,"52":1,"194":1}}],["example",{"0":{"50":1,"104":1,"273":1,"282":1,"285":1,"386":1,"390":1},"2":{"1":1,"4":3,"23":1,"24":1,"26":1,"30":1,"32":1,"35":1,"37":1,"39":2,"41":2,"43":1,"50":2,"52":2,"56":1,"61":2,"62":1,"67":1,"72":2,"73":1,"85":1,"104":1,"120":1,"121":1,"123":2,"142":1,"143":2,"145":1,"147":1,"149":1,"150":1,"151":1,"153":1,"165":1,"187":1,"194":1,"196":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"216":1,"219":1,"220":1,"231":1,"240":1,"243":1,"247":1,"255":2,"256":1,"257":1,"264":2,"267":1,"273":1,"283":1,"285":1,"288":3,"289":4,"323":3,"324":1,"325":3,"327":3,"358":1,"381":1,"385":1,"390":1,"441":1,"458":1,"459":1,"469":1,"478":1}}],["exists",{"2":{"165":1}}],["exist",{"2":{"139":2,"435":1,"440":1}}],["existing",{"2":{"8":1,"77":1,"123":1,"135":1,"190":1,"191":1}}],["excellent",{"2":{"193":1}}],["exception",{"2":{"303":1,"324":1}}],["exceptions",{"2":{"290":3}}],["except",{"2":{"135":1,"441":1}}],["exclude",{"2":{"150":1}}],["excluding",{"2":{"127":1}}],["external",{"2":{"357":1,"398":1,"406":1,"436":2}}],["externally",{"0":{"349":1},"1":{"350":1,"351":1},"2":{"348":1,"349":1,"411":1}}],["extension",{"0":{"215":1,"378":1},"2":{"64":1,"193":2,"214":1,"215":1,"378":1}}],["extensions",{"2":{"50":1,"194":1}}],["extend",{"2":{"63":1,"131":1,"409":1}}],["extra",{"2":{"240":2,"290":1,"478":2}}],["extremely",{"2":{"133":1,"151":1}}],["executing",{"2":{"413":2,"453":1}}],["executioncontext",{"2":{"80":2}}],["executed",{"2":{"65":1,"73":2,"232":1,"233":1,"234":1,"454":1,"455":2,"470":1,"471":1,"472":1}}],["expires",{"2":{"455":1}}],["expiresat",{"2":{"443":2}}],["expiry",{"0":{"199":1},"2":{"199":2,"385":2}}],["express",{"2":{"436":1}}],["explicitly",{"2":{"289":1}}],["explanation",{"2":{"255":2,"264":2}}],["explain",{"2":{"177":1}}],["explorer",{"2":{"150":1}}],["explore",{"2":{"96":1,"245":1,"373":1}}],["expose",{"2":{"152":1}}],["exposes",{"2":{"142":1}}],["exposed",{"2":{"3":1}}],["exported=",{"2":{"139":1}}],["export",{"2":{"80":2,"123":1,"277":1,"288":1,"289":1,"424":1,"437":1,"442":3}}],["expanding",{"2":{"125":1}}],["expand",{"2":{"77":1,"136":1,"137":1,"179":1,"339":1,"340":1}}],["experimental",{"2":{"287":1,"289":1}}],["experiment",{"2":{"158":1}}],["experience",{"2":{"74":1,"95":1,"96":1,"105":1,"187":4,"190":2,"191":1,"193":1,"219":1,"223":1,"244":1,"245":1,"290":1,"372":1,"373":1,"384":1,"458":1,"461":1}}],["experiences",{"2":{"0":1,"190":2,"357":1,"386":1}}],["expects",{"2":{"324":1}}],["expect",{"2":{"154":1,"155":1}}],["expected",{"2":{"66":1,"301":1}}],["blueprintcallable",{"2":{"167":5}}],["blueprint",{"2":{"165":2}}],["blob",{"2":{"61":2,"62":1,"289":1}}],["blockcount",{"2":{"312":2}}],["blockchains",{"2":{"290":1}}],["blockchain",{"0":{"142":1,"152":1},"1":{"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1},"2":{"25":1,"30":1,"33":2,"35":1,"96":1,"142":3,"152":1,"187":1,"190":2,"194":1,"241":1,"245":1,"355":1,"373":1,"380":1}}],["blockrange",{"0":{"308":1},"2":{"308":2}}],["blockhash",{"2":{"306":1,"319":1}}],["blockbyhash",{"0":{"306":1},"2":{"306":1}}],["blockbynumber",{"0":{"305":1},"2":{"305":1}}],["blocknative",{"2":{"267":1}}],["blocknumbers",{"2":{"308":1}}],["blocknumber",{"0":{"307":1},"2":{"74":1,"304":5,"305":2,"307":2,"308":1,"310":3,"312":2,"314":3}}],["blocking",{"2":{"194":2}}],["blocks",{"2":{"30":1,"290":2,"308":1,"312":1}}],["block",{"2":{"7":4,"85":1,"150":1,"194":1,"304":3,"305":4,"306":4,"307":1,"308":2,"319":2,"454":1}}],["bp",{"2":{"165":1,"172":1}}],["bd",{"2":{"160":1}}],["biginteger",{"2":{"314":1,"324":1}}],["bigintegar",{"2":{"304":2,"311":1,"314":1,"316":1,"317":1,"319":1,"325":6,"327":1}}],["bignumber",{"2":{"73":2}}],["bit",{"2":{"179":1}}],["binaries",{"2":{"179":1}}],["binary",{"2":{"150":1,"433":1}}],["bindufunction",{"2":{"167":1}}],["bind",{"2":{"165":1,"167":3}}],["bin",{"2":{"75":1}}],["b",{"0":{"69":1},"2":{"129":1,"132":2,"139":1,"165":1,"436":2}}],["breaches",{"2":{"421":1}}],["breaking",{"2":{"126":3,"160":3,"274":1}}],["breaks",{"2":{"61":1}}],["brave",{"2":{"443":1}}],["branded",{"2":{"358":1}}],["branding",{"2":{"187":1}}],["brackets",{"2":{"322":1}}],["broken",{"2":{"173":1}}],["broadcast",{"2":{"167":1}}],["browsable",{"2":{"139":2}}],["browse",{"2":{"85":1,"139":1}}],["browsers",{"2":{"194":3,"376":1}}],["browser",{"0":{"378":1},"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1,"43":1,"51":1,"56":1,"57":2,"76":1,"169":1,"187":2,"193":3,"194":1,"237":1,"287":1,"289":4,"377":1,"382":1,"385":1,"475":1}}],["brown",{"2":{"61":1}}],["bring",{"2":{"159":1}}],["bsc",{"0":{"32":1}}],["bnb",{"0":{"32":1}}],["bob",{"2":{"420":1}}],["box",{"2":{"179":1}}],["bounded",{"2":{"388":1}}],["bounds",{"2":{"352":1}}],["bound",{"2":{"167":1}}],["bool",{"2":{"167":1,"324":2,"385":2,"402":1,"421":1}}],["boolean",{"2":{"23":2,"24":2,"37":2,"41":2,"80":1}}],["bonus",{"0":{"328":1},"2":{"155":1}}],["bow",{"2":{"62":1}}],["bored",{"2":{"61":2}}],["body",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1,"43":1,"56":1,"57":2,"80":3,"175":2,"385":2}}],["both",{"2":{"4":1,"23":1,"24":1,"26":1,"32":1,"37":1,"39":1,"41":1,"43":1,"49":1,"56":1,"57":2,"59":1,"61":1,"63":5,"189":1,"191":1,"356":1,"357":1,"381":1,"385":1,"413":2}}],["bottom",{"2":{"0":1,"108":3}}],["bundling",{"2":{"235":1,"473":1}}],["bundle",{"2":{"232":1,"233":1,"234":1,"410":1,"413":3,"470":1,"471":1,"472":1}}],["bunch",{"2":{"8":1,"193":1}}],["buy",{"2":{"184":1}}],["bug",{"2":{"139":1,"289":1}}],["bugfixes",{"2":{"126":1,"160":1}}],["built",{"2":{"26":1,"33":1,"93":1,"94":1,"95":1,"126":1,"157":1,"160":1,"165":1,"172":1,"179":1,"193":1,"238":1,"239":1,"244":1,"372":1,"476":1,"477":1}}],["builds",{"2":{"126":1,"127":1,"160":1}}],["building",{"0":{"65":1,"236":1,"474":1},"1":{"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"237":1,"238":1,"239":1,"240":1,"475":1,"476":1,"477":1,"478":1},"2":{"187":1,"188":1,"190":1,"240":1,"243":1,"478":1}}],["builder",{"0":{"18":1,"67":1,"77":1,"180":1,"329":1,"335":1},"1":{"68":1,"69":1,"70":1,"71":1,"72":1,"78":1,"79":1,"181":1,"182":1,"183":1,"184":1,"185":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1},"2":{"2":1,"3":1,"7":1,"11":1,"22":3,"23":1,"25":3,"27":1,"30":1,"31":3,"33":3,"36":3,"38":3,"40":3,"43":1,"46":1,"56":1,"57":1,"72":1,"74":2,"77":2,"107":1,"132":2,"144":3,"146":2,"148":2,"154":1,"163":1,"180":1,"181":1,"182":1,"192":1,"302":1,"330":1,"335":1,"336":1}}],["build",{"2":{"1":1,"30":1,"50":1,"67":1,"74":1,"80":1,"81":2,"129":2,"131":1,"133":1,"139":1,"179":4,"180":1,"187":2,"222":1,"243":1,"290":1,"331":1,"376":1,"377":1,"386":1,"460":1}}],["burn",{"0":{"16":1},"2":{"151":1}}],["bump",{"2":{"8":1}}],["button",{"2":{"77":1,"84":1,"102":2,"103":2,"118":2,"284":1}}],["but",{"2":{"5":1,"30":2,"33":1,"39":2,"41":2,"49":2,"51":1,"59":1,"61":1,"64":1,"72":2,"92":1,"93":1,"94":1,"131":1,"142":1,"150":1,"155":1,"158":1,"193":2,"220":1,"238":1,"239":1,"241":1,"243":1,"303":1,"328":1,"357":1,"358":1,"359":1,"366":1,"392":1,"405":1,"411":1,"436":2,"454":1,"459":1,"476":1,"477":1}}],["banner",{"2":{"194":2,"206":3}}],["bannerurl",{"0":{"206":1},"2":{"194":2,"206":1}}],["bar",{"2":{"132":1,"158":1}}],["basis",{"2":{"123":1}}],["basics",{"2":{"331":1}}],["basic",{"2":{"74":1,"100":1,"143":2,"145":1,"147":1,"149":1,"158":1}}],["bash",{"2":{"75":1}}],["based",{"0":{"168":1,"169":1,"170":1},"2":{"150":1,"168":2,"169":2,"172":1,"187":3,"254":1,"264":3,"265":1,"266":2,"287":1,"288":1,"290":1,"445":1}}],["baseuri",{"2":{"58":1}}],["baseuris",{"2":{"4":1}}],["basecardid",{"2":{"50":1,"62":1}}],["base",{"0":{"339":1},"2":{"4":1,"338":1,"339":1}}],["batching",{"0":{"422":1},"2":{"73":1,"151":1,"232":1,"233":1,"234":1,"470":1,"471":1,"472":1}}],["batch",{"0":{"151":1,"235":1,"473":1},"2":{"54":2,"73":3,"151":3}}],["batched",{"2":{"8":1,"50":1,"73":1,"151":1,"299":1,"300":1}}],["balancequery",{"2":{"325":3}}],["balanceof",{"2":{"325":2,"327":1}}],["balanceat",{"0":{"304":1},"2":{"303":1,"304":2}}],["balance",{"0":{"32":1},"2":{"32":3,"304":5,"325":3,"327":1}}],["balances",{"0":{"11":1,"24":1,"31":1},"1":{"32":1},"2":{"23":2,"24":1,"33":1}}],["back",{"2":{"50":1,"182":1,"216":1,"381":1}}],["background",{"2":{"23":1,"24":1,"28":1,"32":1,"37":1,"39":1,"41":1,"43":1,"47":1,"56":1,"57":2,"61":1}}],["backends",{"0":{"236":1,"474":1},"1":{"237":1,"238":1,"239":1,"240":1,"475":1,"476":1,"477":1,"478":1},"2":{"8":1,"25":1,"93":1,"94":1,"237":1,"238":1,"239":1,"475":1,"476":1,"477":1}}],["backend",{"0":{"240":1,"478":1},"2":{"3":1,"26":1,"165":2,"167":1,"168":1,"187":1,"240":3,"287":1,"359":1,"478":3}}],["backup",{"2":{"0":1,"350":1}}],["byte",{"2":{"324":1,"421":1}}],["bytecode",{"2":{"154":5,"310":1}}],["bytes4",{"2":{"421":4}}],["bytes1",{"2":{"395":1}}],["bytesn",{"2":{"324":1}}],["bytes",{"2":{"85":1,"234":2,"235":1,"324":2,"340":1,"395":1,"421":3,"472":2,"473":1}}],["bytes32",{"2":{"77":1,"393":1,"395":3,"400":1,"402":1,"406":1,"416":1,"421":3,"434":1,"437":6}}],["by",{"2":{"4":1,"6":1,"8":1,"23":2,"30":2,"50":1,"57":1,"61":1,"64":3,"65":1,"66":4,"67":1,"72":3,"74":1,"75":1,"77":4,"78":1,"81":1,"82":1,"83":1,"96":1,"105":1,"107":1,"115":1,"124":1,"125":2,"130":2,"131":1,"132":1,"133":2,"139":6,"143":1,"145":2,"147":2,"148":1,"149":2,"150":1,"151":1,"152":1,"158":1,"163":1,"172":1,"174":1,"177":1,"182":1,"185":1,"188":1,"194":3,"205":1,"210":1,"211":1,"213":1,"216":2,"219":1,"223":1,"243":1,"245":1,"251":1,"261":1,"281":1,"284":1,"288":1,"289":2,"292":1,"302":1,"303":2,"304":1,"306":1,"308":1,"318":1,"319":1,"352":1,"357":3,"358":3,"359":1,"373":1,"380":1,"381":1,"383":1,"384":1,"385":2,"387":1,"388":1,"395":2,"397":2,"399":1,"400":1,"401":1,"407":1,"408":1,"409":1,"410":1,"414":1,"415":1,"421":1,"425":1,"432":1,"434":1,"438":3,"441":2,"442":1,"447":1,"452":1,"454":1,"455":1,"458":1,"461":1}}],["beautifully",{"2":{"376":1,"377":1}}],["beautify",{"2":{"157":1}}],["beauty",{"2":{"193":1}}],["beyond",{"2":{"182":1,"409":1}}],["being",{"2":{"151":1,"164":2,"165":1,"287":1,"385":1,"411":1}}],["bespoke",{"2":{"151":1}}],["best",{"2":{"8":1,"84":1,"191":1,"194":2,"206":1,"240":1,"290":1,"478":1}}],["beneficial",{"2":{"151":1}}],["benefit",{"2":{"74":1,"125":1}}],["benefits",{"0":{"191":1},"2":{"6":1,"8":1,"193":1}}],["behalf",{"2":{"223":1,"461":1}}],["behavior",{"2":{"429":1}}],["behaviour",{"2":{"132":1,"398":1,"405":1}}],["behaves",{"2":{"216":1}}],["behind",{"2":{"33":1,"321":1}}],["becomes",{"2":{"380":1}}],["become",{"2":{"131":1}}],["because",{"2":{"130":1,"131":1,"352":1,"359":1,"396":1}}],["belong",{"2":{"434":1}}],["below",{"2":{"2":1,"4":2,"23":1,"25":1,"26":2,"27":1,"28":1,"42":1,"49":1,"50":1,"53":1,"55":1,"59":1,"61":1,"67":1,"83":1,"100":1,"101":1,"117":1,"173":1,"179":1,"195":1,"243":2,"256":1,"288":1,"289":1,"407":1,"442":1}}],["bells",{"2":{"290":1}}],["believers",{"2":{"148":1}}],["believe",{"2":{"130":1}}],["begin",{"2":{"442":1}}],["beginning",{"2":{"67":1}}],["began",{"2":{"130":1}}],["better",{"2":{"150":1,"159":2,"175":1}}],["beta",{"2":{"91":1,"160":1,"365":1}}],["between",{"0":{"187":1,"190":1},"2":{"73":1,"133":1,"194":1,"431":1}}],["before",{"2":{"67":2,"80":1,"151":1,"163":1,"174":1,"179":1,"288":2,"413":2,"454":1,"455":2}}],["been",{"2":{"30":1,"172":1,"357":1,"392":1,"441":1,"451":2,"452":1}}],["be",{"2":{"1":1,"3":4,"4":1,"8":1,"23":2,"24":2,"30":4,"37":2,"41":2,"49":1,"52":1,"57":1,"63":1,"65":2,"66":7,"72":1,"73":3,"74":2,"75":1,"77":1,"78":1,"82":1,"84":1,"91":1,"92":1,"107":1,"110":1,"111":1,"112":1,"113":3,"114":3,"115":3,"126":1,"130":3,"131":2,"132":1,"141":1,"142":1,"144":1,"145":1,"147":1,"149":1,"150":3,"155":2,"158":1,"160":1,"163":2,"164":2,"165":3,"167":3,"168":1,"172":2,"174":3,"175":1,"177":1,"179":1,"187":2,"194":1,"196":1,"198":2,"201":1,"204":1,"205":1,"207":1,"208":1,"209":1,"210":1,"211":1,"213":2,"216":2,"219":1,"223":1,"230":1,"235":2,"242":1,"248":1,"251":1,"252":1,"253":1,"257":1,"261":1,"263":1,"267":1,"274":1,"275":1,"277":1,"278":1,"281":1,"283":1,"287":1,"288":2,"289":9,"290":1,"291":1,"294":1,"299":3,"300":3,"301":1,"303":2,"305":1,"308":1,"310":1,"312":1,"314":1,"324":1,"327":1,"339":2,"340":1,"347":3,"352":1,"355":2,"356":1,"358":2,"359":3,"365":1,"366":1,"371":1,"379":3,"380":2,"382":1,"383":1,"384":5,"388":1,"389":1,"394":1,"395":1,"397":2,"399":2,"401":1,"403":1,"405":1,"407":4,"410":1,"411":1,"413":5,"414":1,"415":2,"416":2,"419":1,"420":1,"421":1,"430":1,"432":1,"433":1,"436":2,"438":1,"440":1,"441":3,"444":2,"447":1,"450":1,"452":1,"454":1,"455":4,"458":1,"461":1,"468":1,"473":2}}],["gnosis",{"2":{"354":1}}],["guestmodule",{"0":{"423":1},"2":{"424":1}}],["guess",{"2":{"331":1}}],["guarantee",{"2":{"357":1,"447":1}}],["guarantees",{"2":{"355":1}}],["guard",{"0":{"358":1,"383":1},"2":{"62":1,"358":4,"359":2,"381":2,"383":2,"384":1,"454":1}}],["gui",{"2":{"168":2,"172":3}}],["guides",{"2":{"152":1,"188":1}}],["guide",{"2":{"74":1,"75":1,"77":1,"78":1,"79":1,"97":1,"98":1,"122":1,"123":1,"177":1,"188":1,"246":1,"330":1,"374":1}}],["g",{"2":{"66":1,"120":1,"145":1,"147":1,"149":1,"155":1,"223":1,"253":1,"263":1,"322":1,"353":1,"357":1,"461":1}}],["got",{"2":{"339":1}}],["goerli",{"2":{"253":1,"263":1}}],["goes",{"2":{"150":1}}],["good",{"2":{"123":1}}],["googlelogin",{"2":{"442":3}}],["googleoauthprovider",{"2":{"442":3}}],["googleclientid",{"2":{"177":1}}],["google",{"0":{"177":1,"442":1},"2":{"96":1,"113":1,"124":2,"135":1,"177":1,"194":1,"207":2,"209":1,"245":1,"358":1,"373":1,"384":1,"440":1,"442":8,"443":4,"447":1}}],["golang",{"2":{"93":1,"238":1,"476":1}}],["goldcardid",{"2":{"50":1}}],["go",{"0":{"28":1,"47":1,"93":1,"238":1,"476":1},"2":{"23":1,"24":1,"26":2,"28":3,"32":1,"37":1,"39":1,"41":2,"43":1,"47":3,"51":1,"53":1,"56":1,"57":2,"93":6,"94":2,"131":1,"165":1,"173":1,"220":3,"238":6,"239":2,"240":1,"322":1,"445":1,"459":3,"476":6,"477":2,"478":1}}],["git",{"2":{"75":1,"129":3}}],["github",{"2":{"23":1,"24":1,"28":2,"30":1,"32":1,"37":1,"39":1,"41":1,"43":1,"47":2,"56":1,"57":2,"61":2,"62":1,"93":1,"104":1,"129":1,"238":1,"247":1,"257":1,"267":1,"283":1,"285":1,"288":1,"289":2,"476":1}}],["gives",{"2":{"165":1}}],["give",{"0":{"7":1},"2":{"62":1,"158":2,"174":1,"187":1,"455":1}}],["given",{"2":{"3":1,"132":1,"163":1,"297":2,"298":2,"299":2,"300":2,"301":1,"304":2,"310":1,"311":1,"314":2,"315":1,"400":1,"404":1,"408":1,"410":1}}],["greater",{"2":{"431":1}}],["great",{"2":{"141":1,"142":1,"153":1,"154":1,"190":1}}],["grin",{"2":{"61":1}}],["grantrole",{"2":{"77":1}}],["grade",{"2":{"50":1}}],["grab",{"2":{"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1}}],["groupname",{"2":{"259":1}}],["groups",{"0":{"221":1}}],["group",{"2":{"8":1}}],["geared",{"2":{"190":1}}],["genericfailure",{"2":{"172":1}}],["generated",{"2":{"75":1,"76":1,"77":2,"84":1,"223":1,"293":1,"331":1,"381":2,"384":2,"441":2,"453":1,"461":1}}],["generate",{"0":{"226":1,"464":1},"2":{"73":2,"77":2,"84":2,"177":2,"293":1,"384":1,"432":1}}],["generating",{"2":{"11":1,"77":1}}],["general",{"2":{"52":1,"131":1,"142":1,"154":1,"179":1,"290":2}}],["getelementbyid",{"2":{"442":1}}],["getetherbalance",{"2":{"32":5}}],["getimagehash",{"2":{"415":1}}],["getfunction",{"2":{"408":2,"414":1}}],["getuseractivities",{"0":{"385":1},"1":{"386":1},"2":{"385":4,"386":1}}],["getchainid",{"2":{"228":1,"466":1}}],["getcomponentinchildren",{"2":{"133":1}}],["getcontractinfo",{"2":{"43":1,"47":1,"54":1}}],["getcontractinfobatch",{"2":{"43":5,"54":1}}],["getcollection",{"2":{"4":1}}],["getprovider",{"2":{"228":1,"466":1}}],["getaddress",{"0":{"296":1},"2":{"218":1,"225":1,"226":1,"233":1,"234":1,"296":1,"304":2,"314":2,"323":2,"327":1,"395":1,"457":1,"463":1,"464":1,"471":1,"472":1}}],["getwallet",{"2":{"194":5,"218":1,"219":1,"457":1,"458":1}}],["getvalid",{"2":{"174":1}}],["getloginurl",{"2":{"167":1}}],["getlatestblock",{"2":{"7":2}}],["getsessionhash",{"2":{"440":1,"441":1,"442":2}}],["getstorageat",{"2":{"400":1}}],["getstoredcredentials",{"2":{"174":2}}],["getstoredkey",{"2":{"164":1}}],["getsigner",{"2":{"66":2,"72":1,"73":2,"77":1,"85":1,"225":1,"231":1,"232":2,"233":2,"234":2,"235":2,"463":1,"469":1,"470":2,"471":2,"472":2,"473":2}}],["getkitconnectwallets",{"2":{"124":2}}],["getdefaultconnectors",{"2":{"100":2,"101":2,"124":1}}],["gettoporders",{"2":{"346":1}}],["gettokenrefreshstatus",{"2":{"57":5}}],["gettokenmetadatabatch",{"2":{"54":1}}],["gettokenmetadata",{"2":{"54":1,"56":6}}],["gettokensupplies",{"2":{"41":7}}],["gettokenbalances",{"2":{"23":9,"24":7,"27":1,"28":1,"32":2}}],["gettransactionhistory",{"2":{"37":7,"39":7}}],["getting",{"0":{"35":1,"89":1,"98":1,"188":1,"192":1,"363":1},"1":{"90":1,"91":1,"92":1,"99":1,"364":1,"365":1,"366":1},"2":{"97":1,"187":1,"246":1,"374":1}}],["getblocknumber",{"2":{"80":3,"85":3}}],["getblock",{"2":{"7":1}}],["get",{"0":{"334":1},"2":{"0":1,"4":1,"7":1,"22":1,"25":1,"28":1,"30":1,"31":1,"33":1,"36":1,"38":1,"40":1,"47":1,"52":3,"66":2,"72":2,"74":1,"80":4,"82":1,"85":2,"88":1,"99":1,"130":1,"150":1,"160":2,"169":1,"174":1,"179":1,"188":2,"192":2,"218":1,"301":1,"304":4,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"312":1,"313":1,"314":1,"316":1,"317":1,"318":1,"319":1,"342":1,"345":1,"362":1,"369":1,"376":1,"377":1,"440":2,"457":1}}],["gain",{"2":{"359":2}}],["gather",{"2":{"331":1,"333":1}}],["gate",{"2":{"158":1}}],["gateway",{"0":{"6":1},"1":{"7":1},"2":{"6":1,"302":1}}],["gaming",{"2":{"190":1}}],["gameobject",{"2":{"133":1,"158":1}}],["game",{"0":{"9":1,"15":1,"16":1},"2":{"26":2,"33":1,"35":1,"50":1,"74":1,"130":5,"160":2,"186":1,"187":6,"189":1,"190":4,"191":1,"192":1,"227":1,"241":1,"243":1,"336":1,"465":1}}],["games",{"2":{"0":1,"25":1,"33":1,"126":1,"148":1,"160":1,"190":2}}],["gasused",{"2":{"455":1}}],["gaslist",{"2":{"388":1}}],["gaslimit",{"0":{"413":1},"2":{"321":1,"323":1,"408":2,"413":2,"414":1,"455":1}}],["gaslimitestimator",{"2":{"321":1}}],["gasless",{"0":{"74":1},"1":{"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"191":1}}],["gastipcap",{"2":{"317":1}}],["gasprice",{"2":{"316":1,"321":1,"323":1}}],["gas",{"0":{"67":1,"70":1,"71":1},"1":{"68":1,"69":1,"70":1,"71":1,"72":1},"2":{"8":7,"11":1,"66":3,"72":2,"74":1,"143":3,"151":1,"304":1,"311":2,"312":1,"316":1,"317":1,"321":1,"392":1,"413":1}}],["gt",{"2":{"3":2,"7":2,"52":10,"63":2,"66":6,"72":2,"76":2,"77":2,"80":7,"83":2,"84":4,"85":5,"100":9,"101":21,"102":6,"103":4,"105":3,"117":10,"118":4,"120":1,"123":2,"124":8,"127":3,"129":2,"131":1,"132":4,"133":1,"136":2,"137":2,"139":42,"155":1,"158":3,"163":1,"167":10,"172":1,"174":1,"175":2,"179":3,"194":1,"220":2,"241":1,"242":4,"248":1,"278":2,"288":4,"289":6,"308":2,"324":6,"325":5,"333":1,"342":3,"370":1,"371":4,"385":1,"421":1,"436":1,"442":16,"450":1,"451":1,"452":1,"459":2}}],["due",{"2":{"158":1,"179":1,"274":1,"288":1,"447":1}}],["during",{"2":{"132":1,"163":1,"179":1,"392":1,"401":1,"432":2,"438":2}}],["dropsession",{"2":{"444":1}}],["dropdown",{"2":{"3":1}}],["drawer",{"2":{"165":1}}],["drag",{"2":{"131":1,"133":1,"179":1}}],["ddos",{"0":{"80":1},"1":{"81":1,"82":1,"83":1,"84":1},"2":{"74":1}}],["digest",{"2":{"435":1,"437":1}}],["digit",{"2":{"134":1}}],["diligence",{"0":{"427":1},"2":{"425":1}}],["dive",{"2":{"97":1,"246":1,"374":1}}],["difficult",{"2":{"290":1}}],["difficulty",{"2":{"74":1}}],["differs",{"2":{"255":1,"264":1,"396":1}}],["differing",{"2":{"173":1}}],["difference",{"2":{"233":1,"234":1,"471":1,"472":1}}],["differences",{"0":{"187":1,"190":1},"2":{"59":1}}],["different",{"2":{"173":1,"194":1,"232":1,"233":1,"234":1,"243":1,"348":1,"356":1,"358":1,"470":1,"471":1,"472":1}}],["dictionary",{"2":{"62":1,"63":1}}],["dice",{"2":{"62":1}}],["die",{"2":{"62":1}}],["discuss",{"2":{"447":1}}],["discouraged",{"2":{"287":1}}],["disconnectweb3react",{"2":{"278":1}}],["disconnect",{"2":{"202":1,"216":1}}],["discord",{"2":{"96":1,"135":1,"207":1,"220":1,"245":1,"373":1,"459":1}}],["disk",{"2":{"167":1,"173":1}}],["disabled",{"2":{"133":1}}],["displayedassets",{"0":{"115":1}}],["displayed",{"2":{"113":1,"114":1,"115":4,"172":1,"216":1,"281":1,"347":1,"379":1}}],["displaying",{"2":{"98":1}}],["dispatched",{"2":{"73":1}}],["dispatch",{"2":{"8":1,"65":1,"66":2,"73":1,"231":1,"469":1}}],["dispatching",{"2":{"8":1}}],["dist",{"2":{"242":1,"371":1}}],["distribution",{"0":{"242":1,"371":1},"2":{"242":1,"371":1,"436":1}}],["district",{"2":{"61":1}}],["distractions",{"2":{"190":1}}],["distinct",{"2":{"73":2,"183":1,"445":1}}],["directive",{"2":{"289":4}}],["direct",{"2":{"195":1,"358":1,"408":1}}],["directory",{"0":{"288":1,"289":1},"2":{"30":2,"75":1,"80":1,"165":1,"287":2,"289":2}}],["directly",{"2":{"26":1,"29":1,"33":1,"42":2,"48":1,"49":1,"55":2,"142":1,"153":1,"154":1,"223":1,"241":1,"323":1,"347":1,"358":1,"370":1,"379":1,"392":2,"416":1,"441":1,"442":1,"461":1}}],["d",{"2":{"23":2,"24":2,"26":1,"27":1,"28":1,"32":2,"37":2,"39":2,"41":1,"43":1,"50":2,"53":1,"56":1,"57":2,"83":1,"84":1,"150":1,"220":1,"240":2,"243":1,"385":1,"455":1,"459":1,"478":2}}],["dangerous",{"2":{"398":1,"413":1}}],["days",{"2":{"182":1}}],["dark",{"2":{"107":1,"194":1}}],["dashboard",{"2":{"75":1,"358":1}}],["damage",{"2":{"50":1,"359":1}}],["datatypes",{"2":{"324":2}}],["data2",{"2":{"232":2,"233":2,"234":2,"470":2,"471":2,"472":2}}],["data1",{"2":{"232":2,"233":2,"234":2,"470":2,"471":2,"472":2}}],["databeat",{"2":{"181":2}}],["database",{"2":{"142":2,"181":2}}],["data",{"0":{"324":1,"419":1,"420":1},"2":{"25":1,"30":2,"33":2,"57":1,"62":1,"63":3,"66":2,"72":2,"73":2,"85":3,"139":4,"143":1,"167":1,"181":1,"182":2,"232":4,"233":4,"234":6,"235":4,"323":1,"325":1,"340":1,"346":1,"357":1,"385":1,"408":2,"414":1,"419":1,"420":2,"421":1,"454":3,"455":2,"470":4,"471":4,"472":6,"473":4}}],["dapps",{"2":{"8":1,"195":1,"216":1,"243":1,"256":1,"377":1}}],["dapp",{"0":{"68":1,"69":1,"84":1,"194":1,"214":1,"215":1},"2":{"8":1,"26":1,"33":1,"35":1,"77":1,"83":1,"84":1,"193":3,"194":9,"196":1,"198":1,"200":1,"206":1,"214":2,"216":6,"219":2,"220":1,"240":1,"241":1,"243":3,"247":2,"257":2,"267":2,"283":2,"285":1,"289":1,"370":1,"377":1,"458":2,"459":1,"478":1}}],["daicontractaddress",{"2":{"232":3,"235":1,"470":3,"473":1}}],["daily",{"2":{"180":1}}],["dai",{"2":{"8":1,"66":1,"450":2}}],["debit",{"2":{"347":1,"379":1}}],["debugging",{"2":{"290":1}}],["deactivate",{"2":{"278":1}}],["deactivated",{"2":{"278":1}}],["deactivation",{"0":{"278":1}}],["deal",{"2":{"150":1}}],["derive",{"2":{"226":1,"464":1}}],["denoted",{"2":{"150":1}}],["deep",{"2":{"135":2,"139":3}}],["delightful",{"2":{"194":1}}],["delivering",{"2":{"190":1}}],["delivery",{"2":{"8":1}}],["del",{"2":{"167":3}}],["delegatecall",{"0":{"409":1},"2":{"408":2,"409":2,"414":1}}],["delegates",{"2":{"167":2}}],["delegate",{"2":{"165":1,"167":1,"325":1}}],["delete",{"2":{"80":1,"179":3}}],["delayed",{"2":{"150":1}}],["delayedencodedata",{"2":{"150":2,"151":1}}],["delayedencode",{"0":{"150":1},"2":{"150":4,"151":1}}],["departments",{"2":{"436":1}}],["department",{"2":{"436":2}}],["deprecated",{"2":{"379":1}}],["depth",{"2":{"252":1,"262":1}}],["depends",{"2":{"288":1}}],["depending",{"2":{"255":1,"264":1,"338":1}}],["depend",{"2":{"241":1,"287":1,"370":1}}],["dependent",{"2":{"167":1}}],["dependencies",{"2":{"99":1,"241":1,"370":1}}],["dependency",{"2":{"73":1,"241":1,"370":1}}],["dependant",{"2":{"158":1}}],["deploycontract",{"2":{"154":4}}],["deploymentresult",{"2":{"326":2}}],["deployment",{"0":{"154":1,"423":1},"2":{"75":1,"154":1,"397":1,"438":1}}],["deploying",{"0":{"326":1},"2":{"11":1,"57":1,"151":1,"154":2}}],["deployedwalletcontext",{"2":{"220":1,"459":1}}],["deployedcontractaddress",{"2":{"154":1}}],["deployed",{"2":{"8":1,"67":2,"80":2,"81":1,"322":1,"338":1,"416":2,"438":1}}],["deploy",{"0":{"9":1,"13":1,"14":1,"19":1,"75":1,"76":1,"77":1,"83":1,"336":1},"1":{"76":1,"78":1,"79":1},"2":{"4":2,"6":1,"11":1,"74":2,"75":1,"76":1,"77":1,"82":1,"83":1,"85":1,"144":1,"146":1,"148":1,"154":2,"326":2,"335":1,"336":1,"438":1}}],["defi",{"2":{"196":1}}],["defines",{"2":{"398":1,"406":1,"429":1}}],["define",{"2":{"358":1,"429":1,"441":1}}],["defined",{"2":{"63":2,"167":1,"253":1,"263":1,"292":1,"302":1,"327":1,"328":1,"387":1,"395":2,"400":1,"408":1,"409":1,"411":1}}],["definition",{"2":{"150":1}}],["defense",{"2":{"130":2,"358":1}}],["defaultabicoder",{"2":{"393":1,"400":2}}],["defaultpurchaseamount",{"0":{"212":1},"2":{"212":1}}],["defaultfundingcurrency",{"0":{"211":1},"2":{"194":2,"211":1,"213":2}}],["defaulting",{"2":{"143":1}}],["defaultnetwork",{"0":{"253":1,"263":1},"2":{"124":1,"194":1,"249":1,"259":1}}],["defaulttheme",{"0":{"107":1},"2":{"107":1}}],["defaultchainid",{"2":{"100":1,"101":1}}],["defaults",{"2":{"92":1,"158":1,"314":1,"366":1,"384":1,"440":1,"441":1,"442":1,"443":1,"444":1,"454":1,"455":1}}],["default",{"2":{"23":2,"24":1,"30":1,"37":1,"41":1,"65":1,"80":1,"133":1,"139":3,"155":1,"172":1,"182":1,"199":1,"203":1,"210":1,"211":1,"212":2,"213":2,"253":2,"262":1,"263":2,"271":1,"280":1,"284":1,"288":1,"289":1,"304":2,"327":1,"384":1,"442":1}}],["demand",{"0":{"423":1},"2":{"193":2,"214":1,"355":1}}],["demos",{"2":{"188":1,"192":1}}],["demo",{"0":{"87":1,"344":1,"361":1,"368":1},"2":{"87":1,"96":1,"100":1,"101":1,"130":3,"158":2,"194":2,"214":1,"243":1,"245":1,"247":1,"249":1,"256":4,"257":1,"259":1,"266":3,"267":1,"273":1,"277":1,"282":1,"283":1,"285":2,"289":1,"344":1,"361":1,"368":1,"373":1,"442":2}}],["demonstrated",{"2":{"288":1}}],["demonstrates",{"2":{"220":1,"459":1}}],["demonstrate",{"2":{"49":1}}],["demonstrating",{"2":{"4":1}}],["demystify",{"2":{"59":1}}],["decoding",{"2":{"322":1}}],["decode",{"2":{"400":2}}],["decodeproof",{"2":{"220":1,"459":1}}],["decoded",{"2":{"37":1}}],["declare",{"2":{"289":1}}],["declared",{"2":{"289":1,"413":1}}],["declaration",{"2":{"289":1}}],["decline",{"2":{"75":1}}],["decentralized",{"2":{"223":1,"461":1}}],["decrypt",{"2":{"164":1}}],["decimalnormalizer",{"2":{"143":2,"144":1,"145":1,"150":2,"151":2,"321":1,"327":2}}],["decimals",{"2":{"50":1,"61":1,"62":1,"64":1,"143":3,"144":4}}],["desc",{"2":{"346":1}}],["described",{"2":{"64":1,"195":1,"288":1,"289":1}}],["describe",{"2":{"59":1}}],["description",{"2":{"50":3,"61":2,"62":1,"252":1,"262":1,"331":2,"332":2}}],["destinations",{"2":{"179":1}}],["desktop",{"0":{"169":1},"2":{"169":2,"172":1,"193":1}}],["desired",{"2":{"158":1}}],["design",{"2":{"151":1,"353":1}}],["designed",{"2":{"1":1,"30":1,"181":1,"193":1}}],["determining",{"2":{"321":1}}],["determined",{"2":{"198":1}}],["determine",{"2":{"115":1,"323":1}}],["determines",{"2":{"107":1,"108":1,"112":1,"113":1,"114":1,"394":1,"430":1,"450":1}}],["detect",{"2":{"102":1}}],["detects",{"2":{"33":1}}],["detail",{"2":{"64":1}}],["details",{"0":{"10":1,"337":1},"2":{"37":1,"39":1,"41":3,"61":1,"62":1,"77":1,"123":1,"216":1,"252":1,"337":1,"340":1,"358":1}}],["devices",{"2":{"377":1,"382":1}}],["device",{"2":{"227":1,"380":1,"381":1,"444":1,"465":1}}],["deviate",{"2":{"59":1}}],["developing",{"2":{"290":1}}],["developer",{"2":{"347":1,"379":1}}],["developers",{"2":{"105":1,"116":1,"193":1,"386":1}}],["developed",{"2":{"193":1,"243":1}}],["development",{"2":{"75":1,"186":1,"187":1,"192":1,"241":1,"358":1}}],["dev",{"2":{"0":1,"75":2,"76":1,"83":1,"84":1,"94":1,"239":1,"346":1,"385":2,"421":1,"477":1}}],["dom",{"2":{"442":1}}],["doing",{"2":{"327":1}}],["doubt",{"2":{"150":1}}],["don",{"2":{"150":1,"158":1,"159":1,"180":1,"216":1,"235":1,"323":1,"392":1,"394":1,"439":1,"447":1,"473":1}}],["done",{"2":{"3":1,"77":1,"78":1,"91":1,"141":2,"152":1,"154":1,"168":1,"169":1,"175":1,"216":1,"365":1,"381":1,"455":1}}],["download",{"2":{"131":1}}],["down",{"2":{"75":1,"113":1,"114":1,"136":1,"137":1,"322":1}}],["downside",{"2":{"30":1}}],["do",{"0":{"288":1,"289":1},"2":{"50":1,"61":1,"64":1,"73":1,"77":2,"84":1,"129":1,"131":2,"132":1,"141":1,"142":2,"153":1,"154":2,"159":1,"164":2,"172":1,"180":1,"219":2,"220":3,"243":1,"288":1,"322":2,"332":1,"352":1,"458":2,"459":3}}],["documented",{"2":{"152":1}}],["document",{"2":{"150":1,"442":1}}],["documentation",{"2":{"1":1,"2":1,"8":1,"33":1,"90":1,"100":1,"130":2,"143":1,"144":1,"146":1,"148":1,"303":1,"304":1,"364":1}}],["docs",{"2":{"27":1,"28":1,"44":2,"61":2,"80":1,"81":1,"133":1,"139":1,"152":1,"177":1,"178":1,"243":1}}],["doesn",{"2":{"8":1,"127":1,"139":2,"172":1,"396":1,"407":1,"408":1,"412":1,"413":1,"440":1}}],["does",{"0":{"287":1},"2":{"0":1,"135":1,"143":1,"358":1,"438":1,"446":1}}],["lv7xncqh",{"2":{"62":1}}],["loss",{"2":{"398":1}}],["lost",{"2":{"381":3,"383":1}}],["longer",{"2":{"385":1}}],["long",{"2":{"194":1,"340":1,"441":1}}],["locking",{"2":{"213":1}}],["lockfundingcurrencytodefault",{"0":{"213":1},"2":{"194":2}}],["locate",{"2":{"132":1,"133":1,"158":1}}],["located",{"2":{"50":1,"132":1}}],["location",{"2":{"108":1}}],["localhost",{"2":{"400":1}}],["localstorage",{"2":{"226":1,"464":1}}],["locally",{"2":{"77":1}}],["local",{"2":{"75":4,"77":1,"84":1,"223":1,"226":1,"230":1,"419":1,"420":1,"461":1,"464":1,"468":1}}],["lots",{"2":{"175":2}}],["loading",{"2":{"230":1,"442":1,"468":1}}],["load",{"2":{"132":2}}],["love",{"2":{"125":1}}],["look",{"2":{"80":1,"97":1,"101":1,"150":1,"182":1,"219":1,"241":1,"246":1,"323":1,"325":1,"331":1,"332":1,"339":2,"370":1,"374":1,"458":1}}],["looking",{"2":{"63":1}}],["lookup",{"2":{"50":1}}],["logs",{"2":{"442":1,"454":3}}],["logic",{"2":{"352":1}}],["logically",{"2":{"291":1}}],["loginpanel",{"2":{"133":5}}],["logins",{"2":{"96":1,"190":1,"245":1,"373":1,"381":1,"441":2,"448":2}}],["login",{"0":{"195":1,"381":1,"446":1,"447":1},"1":{"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"382":1,"383":1,"384":1},"2":{"75":3,"83":1,"135":1,"141":1,"165":1,"167":5,"190":1,"191":1,"357":3,"359":1,"380":1,"381":2,"384":1,"442":5,"445":1,"448":1}}],["logging",{"2":{"206":1,"446":1,"447":1}}],["logged",{"2":{"75":1}}],["logtemp",{"2":{"167":1}}],["logos",{"2":{"187":1}}],["logolight",{"2":{"123":2}}],["logodark",{"2":{"123":2}}],["logourl",{"0":{"110":1}}],["logouri",{"2":{"50":1}}],["logo",{"2":{"50":1,"110":1}}],["log",{"2":{"7":1,"23":2,"24":2,"32":2,"37":2,"39":2,"41":2,"43":1,"56":1,"57":2,"66":3,"72":2,"77":1,"80":1,"120":1,"167":1,"194":2,"218":1,"220":2,"228":2,"230":2,"231":1,"232":2,"233":2,"234":2,"235":2,"385":1,"400":1,"440":1,"441":1,"442":1,"443":1,"447":1,"448":1,"451":1,"452":1,"454":1,"455":1,"457":1,"459":2,"466":2,"468":2,"469":1,"470":2,"471":2,"472":2,"473":2}}],["len",{"2":{"419":1}}],["length",{"2":{"299":2,"300":2}}],["lemur",{"2":{"339":1}}],["left",{"2":{"105":1,"108":3,"179":2,"437":1}}],["leaf",{"2":{"433":2,"434":1,"435":1,"436":1,"437":1}}],["lead",{"2":{"398":1}}],["leading",{"2":{"96":1,"245":1,"373":1}}],["least",{"2":{"381":1}}],["leaked",{"2":{"359":1}}],["leave",{"2":{"187":1}}],["leaving",{"2":{"187":1}}],["learning",{"2":{"104":1}}],["learn",{"2":{"42":2,"45":1,"55":2,"144":1,"146":1,"148":1,"150":1,"347":1,"379":1}}],["leverage",{"0":{"191":1},"2":{"190":1,"191":1}}],["leveraged",{"2":{"187":1}}],["leverages",{"2":{"134":1}}],["leveraging",{"2":{"88":1,"188":1,"345":1,"362":1,"368":1}}],["levels",{"2":{"436":1}}],["level",{"0":{"44":1,"430":1},"1":{"431":1,"432":1,"433":1,"434":1,"435":1,"436":1},"2":{"4":4,"42":3,"44":1,"45":1,"50":3,"52":2,"66":1,"182":1,"193":1}}],["let",{"2":{"50":2,"150":1,"393":1}}],["layout",{"0":{"388":1,"389":1},"1":{"389":1,"390":2,"391":2,"392":1,"393":1}}],["label",{"2":{"186":1,"187":3,"188":1}}],["landscape",{"2":{"172":1}}],["languages",{"0":{"240":1,"478":1}}],["language",{"2":{"26":1,"53":1,"220":1,"240":1,"459":1,"478":1}}],["launched",{"2":{"187":1}}],["launcher",{"2":{"139":2}}],["launching",{"2":{"187":1}}],["launch",{"2":{"165":1,"342":1}}],["later",{"2":{"127":1,"161":1,"274":1,"323":1,"325":1,"327":1}}],["latestblock",{"2":{"7":2}}],["latest",{"2":{"7":5,"28":1,"47":1,"131":1,"242":1,"248":2,"304":3,"305":1,"308":1,"310":1,"312":1,"314":3,"371":1}}],["lastest",{"2":{"256":1}}],["last",{"2":{"67":1,"75":1,"179":1,"182":1}}],["lt",{"0":{"254":1,"265":1},"2":{"7":2,"52":10,"63":2,"66":2,"72":1,"76":2,"77":1,"80":4,"83":2,"84":4,"85":3,"100":8,"101":19,"102":4,"103":2,"105":3,"117":9,"118":2,"124":8,"139":38,"167":1,"175":2,"194":1,"219":4,"220":1,"241":1,"242":4,"254":1,"256":1,"265":1,"288":3,"289":5,"308":2,"325":5,"342":3,"370":1,"371":4,"434":2,"442":11,"458":4,"459":1}}],["little",{"2":{"330":1}}],["literally",{"2":{"187":1}}],["live",{"2":{"247":2,"257":2,"267":2,"283":2}}],["lives",{"2":{"130":1}}],["libs",{"2":{"424":1}}],["libraries",{"2":{"243":2,"256":1,"264":3,"266":2,"287":4,"288":1}}],["library",{"0":{"92":1,"288":1,"289":1,"366":1},"2":{"7":1,"92":1,"95":1,"126":1,"145":1,"147":1,"149":1,"240":1,"244":1,"288":1,"289":2,"290":3,"291":1,"294":1,"324":1,"366":1,"372":1,"419":1,"420":1,"478":1}}],["lib",{"2":{"242":1,"371":1}}],["limitation",{"2":{"288":2}}],["limited",{"2":{"223":1,"359":1,"436":1,"461":1}}],["limit",{"2":{"194":1,"209":1}}],["limits",{"2":{"5":2,"358":1}}],["lightweight",{"2":{"290":1}}],["light",{"2":{"105":1,"107":1,"194":1,"205":1,"432":1}}],["linux",{"2":{"137":2}}],["links",{"2":{"176":1}}],["linking",{"2":{"135":1,"139":3}}],["linked",{"2":{"77":1}}],["link",{"2":{"50":1,"67":1,"90":1,"135":1,"364":1,"455":1}}],["linear",{"2":{"436":1}}],["line",{"2":{"0":1,"57":1,"82":2,"358":1}}],["likewise",{"2":{"235":1,"473":1}}],["like",{"2":{"23":1,"24":1,"26":1,"27":1,"28":1,"30":1,"32":1,"37":1,"39":1,"50":3,"53":1,"59":1,"75":1,"80":1,"83":1,"94":1,"96":1,"101":1,"150":1,"167":5,"191":2,"193":2,"194":2,"219":1,"220":1,"239":1,"240":2,"241":1,"245":1,"264":1,"323":1,"325":1,"331":2,"332":1,"339":1,"355":1,"370":1,"373":1,"380":1,"436":1,"447":1,"451":1,"458":1,"459":1,"477":1,"478":2}}],["listsessions",{"2":{"443":1,"444":1}}],["listing",{"2":{"385":1}}],["listen",{"0":{"39":1,"451":1},"2":{"33":1}}],["list",{"0":{"23":1,"443":1},"2":{"23":1,"24":1,"26":1,"27":1,"28":1,"34":1,"37":5,"41":1,"113":1,"114":1,"115":2,"121":1,"124":1,"179":1,"210":1,"249":1,"259":1,"308":2,"387":1,"415":1,"443":1}}],["ll",{"2":{"0":1,"23":1,"26":1,"62":1,"74":1,"78":1,"82":1,"91":1,"92":1,"132":1,"141":1,"145":3,"147":3,"149":3,"154":2,"155":1,"165":2,"167":1,"168":1,"172":1,"173":1,"219":1,"304":1,"323":5,"325":3,"331":1,"365":1,"366":1,"458":1}}],["nitro",{"2":{"357":1,"441":1}}],["nil",{"2":{"23":3,"24":2,"28":3,"32":3,"37":2,"39":2,"41":2,"57":1}}],["npx",{"2":{"289":1}}],["npm",{"2":{"27":1,"46":2,"74":1,"99":1,"117":1,"193":1,"241":2,"248":2,"254":1,"258":2,"265":1,"268":2,"275":2,"370":2}}],["n",{"2":{"62":3,"136":1,"137":1,"324":1,"419":1,"435":1,"436":2,"437":2}}],["nuget",{"2":{"131":1}}],["null",{"2":{"50":1,"61":1,"62":1,"288":1,"454":1,"455":1}}],["numbers",{"2":{"143":2}}],["number",{"2":{"43":1,"49":1,"50":1,"56":1,"57":1,"80":3,"85":3,"115":1,"180":1,"184":1,"185":1,"199":1,"201":1,"223":1,"253":1,"263":1,"280":1,"295":1,"303":1,"305":1,"307":1,"319":1,"323":1,"340":1,"358":1,"385":4,"436":1,"461":1}}],["navigating",{"2":{"158":1}}],["navigate",{"2":{"3":1,"77":1,"132":1,"139":1,"335":1,"338":1,"442":2}}],["nametypedescription",{"2":{"399":1,"403":1,"404":1,"407":1}}],["nametyperangedescription",{"2":{"389":1}}],["nametyperangedescriptionthresholduint161",{"2":{"388":1}}],["named",{"2":{"331":1}}],["namely",{"2":{"186":1}}],["name=",{"2":{"139":14}}],["names",{"2":{"75":1,"150":2,"341":1}}],["name",{"2":{"43":1,"50":3,"56":1,"57":1,"61":3,"62":3,"64":1,"80":1,"81":1,"111":1,"123":2,"131":1,"139":1,"150":1,"158":1,"179":1,"194":3,"196":1,"205":1,"219":1,"241":2,"252":1,"262":1,"272":1,"322":1,"331":2,"332":2,"334":1,"336":1,"342":1,"370":2,"420":4,"454":1,"455":1,"458":1}}],["nativereceipt",{"2":{"454":1}}],["native",{"0":{"31":1,"32":1,"242":1,"371":1},"1":{"32":1},"2":{"66":1,"152":1,"190":2,"191":1,"232":1,"233":1,"234":1,"235":1,"356":1,"470":1,"471":1,"472":1,"473":1}}],["nobody",{"2":{"159":1,"357":1}}],["none",{"2":{"230":1,"304":1,"468":1}}],["non",{"2":{"126":1,"141":1,"146":1,"150":1,"160":1,"168":1,"189":1,"191":1,"355":1,"384":1,"416":3,"436":1}}],["nonce=",{"2":{"442":1}}],["nonceat",{"0":{"314":1},"2":{"314":2}}],["nonce",{"2":{"73":4,"201":1,"314":4,"321":1,"323":1,"440":1}}],["noncespace",{"2":{"73":2}}],["nonces",{"2":{"8":1}}],["no",{"0":{"222":1,"460":1},"2":{"61":1,"73":1,"75":1,"115":1,"126":1,"133":1,"138":1,"150":1,"155":1,"164":1,"187":1,"190":1,"193":1,"304":1,"358":1,"385":1,"408":1,"409":1,"436":1}}],["nodeurl",{"2":{"85":4}}],["nodejs",{"0":{"66":1,"67":1,"237":1,"475":1},"1":{"68":1,"69":1,"70":1,"71":1,"72":1},"2":{"72":1,"237":1,"475":1}}],["nodes",{"2":{"7":1,"77":1,"85":2,"303":1}}],["node",{"0":{"6":1,"27":1,"46":1},"1":{"7":1},"2":{"6":1,"23":1,"24":1,"26":1,"27":2,"32":1,"33":1,"37":1,"39":1,"41":1,"43":1,"46":2,"51":1,"53":1,"56":1,"57":2,"75":1,"82":1,"302":1,"385":1,"437":13}}],["now",{"2":{"4":1,"22":1,"31":1,"33":1,"36":1,"38":1,"40":1,"67":1,"73":1,"80":1,"83":1,"179":1,"333":1,"338":1,"342":1}}],["normally",{"2":{"289":1}}],["normalizeasbiginteger",{"2":{"145":1,"151":1,"327":2}}],["normalize",{"2":{"143":2,"144":1,"150":2,"151":1,"321":1}}],["normal",{"2":{"3":1,"432":1}}],["notable",{"2":{"233":1,"234":1,"471":1,"472":1}}],["nothing",{"2":{"167":1,"216":1}}],["noted",{"2":{"82":1,"84":1}}],["notes",{"0":{"30":1}}],["note",{"2":{"27":1,"46":1,"61":1,"64":1,"92":1,"129":1,"130":1,"131":3,"133":1,"135":1,"139":2,"143":1,"144":1,"148":1,"158":1,"172":2,"194":1,"219":1,"230":1,"231":1,"274":1,"301":1,"303":1,"304":1,"305":1,"308":1,"310":1,"312":1,"314":1,"323":1,"366":1,"425":1,"440":1,"458":1,"468":1,"469":1}}],["notice",{"2":{"23":1,"155":1,"323":1,"421":1,"435":1}}],["not",{"2":{"0":1,"3":3,"6":1,"30":1,"62":1,"64":1,"66":4,"67":1,"72":1,"73":1,"74":1,"84":1,"132":1,"133":1,"135":1,"143":2,"144":2,"145":1,"147":1,"149":1,"150":1,"164":1,"167":1,"172":1,"212":1,"220":1,"228":1,"290":1,"301":1,"303":1,"322":1,"327":1,"352":1,"358":2,"407":2,"413":1,"416":1,"438":1,"446":1,"450":1,"455":1,"459":1,"466":1}}],["nfts",{"2":{"33":1,"35":1,"146":1}}],["nftbalances",{"2":{"24":4}}],["nft",{"0":{"20":1,"233":1,"471":1},"2":{"2":1,"4":2,"24":1,"25":1,"33":3,"45":1,"49":1,"233":2,"338":1,"358":1,"385":1,"471":2}}],["never",{"2":{"187":1,"392":2,"437":1,"455":1}}],["nesting",{"2":{"175":1,"436":1}}],["nested",{"0":{"422":1,"436":1},"2":{"175":1,"435":2,"436":3,"437":3}}],["necessary",{"2":{"99":1,"169":1}}],["neon",{"2":{"61":1}}],["nethereum",{"2":{"126":1,"290":1}}],["net",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1,"50":4,"62":1}}],["networkid",{"0":{"313":1},"2":{"313":2}}],["networks",{"0":{"34":1},"2":{"8":1,"26":2,"33":2,"34":1,"39":1,"41":1,"50":1,"52":1,"80":1,"85":1}}],["network",{"0":{"31":1,"32":1,"271":1},"1":{"32":1},"2":{"7":2,"8":1,"39":2,"41":2,"50":4,"52":4,"66":2,"72":2,"77":1,"80":3,"84":1,"92":1,"143":1,"150":2,"151":1,"231":1,"252":1,"253":2,"262":1,"263":2,"269":1,"271":1,"315":1,"321":1,"335":1,"366":1,"384":2,"440":1,"441":1,"442":1,"443":1,"444":1,"454":2,"455":5,"469":1}}],["nextjs",{"0":{"255":1,"264":1,"286":1,"288":1},"1":{"287":1,"288":1,"289":1},"2":{"255":2,"256":2,"264":2,"266":2,"287":3,"288":1,"289":6}}],["next",{"0":{"97":1,"246":1,"287":1,"288":1,"289":1,"374":1},"2":{"3":1,"66":1,"75":1,"78":1,"124":1,"130":1,"132":1,"134":1,"168":1,"287":2,"289":2,"304":1,"332":1}}],["needs",{"2":{"159":1,"187":1,"216":1,"408":1,"416":1}}],["needing",{"2":{"73":1}}],["needed",{"2":{"66":1,"123":1,"131":1,"141":1,"188":1,"192":1,"223":1,"241":1,"381":1,"429":1,"430":1,"461":1}}],["need",{"2":{"1":1,"3":1,"33":1,"66":1,"74":1,"78":1,"91":1,"92":1,"124":1,"130":1,"132":1,"145":1,"147":1,"149":1,"150":1,"154":1,"158":1,"163":1,"165":2,"167":1,"172":1,"177":1,"178":1,"180":1,"216":1,"243":1,"290":1,"303":1,"322":1,"327":1,"331":1,"357":1,"365":1,"366":1,"380":1,"409":1,"411":1,"439":2,"441":1,"447":1}}],["newimagehash",{"2":{"408":1,"414":1}}],["newindexer",{"2":{"23":1,"24":1,"28":1,"32":1,"37":1,"39":1,"41":1}}],["newestblock",{"2":{"312":2}}],["newer",{"2":{"27":1,"46":1,"130":1}}],["newobject",{"2":{"167":1}}],["newlydeployedcontractaddress",{"2":{"154":1,"326":1}}],["newly",{"2":{"132":1,"158":1,"323":1}}],["newtonsoft",{"2":{"131":2}}],["newmetadata",{"2":{"43":1,"47":1,"56":1,"57":2}}],["new",{"0":{"69":1},"2":{"0":1,"3":1,"7":1,"23":1,"24":1,"27":1,"32":1,"37":1,"39":1,"41":1,"43":1,"46":1,"56":1,"57":3,"66":6,"72":2,"77":3,"80":12,"85":4,"92":2,"100":1,"101":1,"126":1,"136":1,"137":1,"139":2,"141":1,"143":2,"144":2,"145":4,"146":2,"147":4,"148":4,"149":4,"150":7,"151":12,"152":1,"158":1,"160":1,"179":2,"187":1,"191":1,"193":1,"220":4,"225":1,"226":2,"230":1,"232":2,"233":2,"234":2,"235":3,"249":1,"277":1,"289":1,"293":2,"294":1,"302":1,"312":1,"322":1,"323":4,"325":2,"327":2,"334":1,"335":1,"366":2,"384":1,"399":1,"400":1,"407":1,"436":1,"440":1,"441":1,"442":1,"443":1,"444":1,"454":1,"455":1,"459":4,"463":1,"464":2,"468":1,"470":2,"471":2,"472":2,"473":3}}],["myetherwallet",{"2":{"351":1}}],["mypinata",{"2":{"339":1}}],["mypage",{"2":{"100":3,"101":3}}],["myapp",{"2":{"289":1}}],["mytokenaddress",{"2":{"145":2,"147":2,"149":2}}],["mytoken",{"2":{"145":3,"147":3,"149":3}}],["my",{"0":{"287":1},"2":{"123":2,"124":3,"196":1,"241":1,"269":1,"370":1}}],["mycustomlogolight",{"2":{"123":1}}],["mycustomlogodark",{"2":{"123":1}}],["mycustomconnectoroptions",{"2":{"123":1}}],["mycustomconnector",{"2":{"123":2,"124":1}}],["mycomponent",{"2":{"103":1,"118":1}}],["myreactcomponent",{"2":{"102":1}}],["mkdir",{"2":{"75":1}}],["md",{"2":{"61":2,"62":1}}],["mimics",{"2":{"405":1}}],["mitm",{"2":{"359":1}}],["might",{"2":{"342":1,"440":1,"447":1}}],["migrated",{"2":{"66":1}}],["migration",{"0":{"417":1},"2":{"66":4}}],["mistakes",{"2":{"342":1}}],["miss",{"2":{"175":1}}],["missing",{"2":{"82":1}}],["missed",{"2":{"25":1}}],["millions",{"2":{"191":1}}],["mix",{"2":{"187":1,"235":1,"473":1}}],["mixed",{"2":{"61":1}}],["middle",{"2":{"108":2}}],["middleware",{"2":{"80":1}}],["minimum",{"2":{"331":1}}],["minimize",{"2":{"187":1}}],["min",{"2":{"242":2,"371":2}}],["minor",{"2":{"126":2,"160":2}}],["minutes",{"2":{"74":1,"187":1,"449":1}}],["minted",{"2":{"341":2}}],["minter",{"0":{"14":1,"19":1},"2":{"74":1,"77":4}}],["mints",{"2":{"74":1,"338":1}}],["mint",{"0":{"15":1,"18":1,"74":1,"85":1},"1":{"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"74":1,"77":1,"85":4,"144":1,"145":2,"146":1,"148":1,"149":2,"150":3,"327":1,"338":1,"339":1,"340":3,"342":1}}],["minting",{"0":{"340":1},"2":{"11":1,"120":1,"342":1}}],["mined",{"2":{"8":1,"30":1}}],["mind",{"2":{"3":1}}],["much",{"2":{"130":1,"434":1}}],["mutable",{"2":{"130":1}}],["mumbai",{"2":{"92":1,"342":1,"366":1,"440":1,"441":1,"442":1,"443":1,"444":1,"454":1,"455":1}}],["multisignature",{"2":{"380":1}}],["multisig",{"2":{"356":1}}],["multisigs",{"2":{"356":1}}],["multi",{"2":{"33":1,"80":1,"81":1,"148":1,"433":1}}],["multiple",{"2":{"0":1,"6":1,"66":1,"73":1,"148":2,"151":1,"158":1,"189":1,"193":1,"216":1,"232":2,"233":2,"234":2,"235":1,"353":1,"380":2,"436":1,"470":2,"471":2,"472":2,"473":1}}],["must",{"2":{"23":1,"52":1,"77":2,"113":1,"114":1,"132":1,"135":1,"142":1,"155":1,"164":2,"277":1,"287":1,"288":1,"289":1,"359":1,"395":1,"401":1,"421":1,"454":1}}],["move",{"0":{"337":1},"2":{"304":1}}],["mounted",{"2":{"288":2}}],["mouth",{"2":{"61":1}}],["moonpay",{"2":{"194":2,"210":1,"347":1,"379":1}}],["mobile",{"0":{"170":1,"377":1},"2":{"172":2,"193":2,"194":1,"243":1,"377":2}}],["moments",{"2":{"179":1}}],["moment",{"2":{"160":1}}],["mocks",{"2":{"155":1}}],["mocked",{"2":{"80":3,"84":1,"85":1}}],["monobehaviour",{"2":{"133":1,"158":1}}],["mono",{"2":{"127":2}}],["money",{"2":{"6":1}}],["more",{"0":{"159":1},"2":{"23":1,"50":2,"61":1,"64":1,"66":1,"72":1,"73":1,"90":1,"96":1,"123":1,"129":1,"131":1,"133":1,"139":2,"143":1,"159":1,"188":1,"190":1,"194":1,"216":1,"219":1,"245":1,"252":1,"255":1,"262":1,"264":1,"289":1,"347":1,"353":1,"364":1,"373":1,"379":1,"380":2,"385":2,"458":1}}],["most",{"2":{"23":1,"51":1,"131":1,"143":2,"194":1,"295":1,"303":1,"307":1,"349":1}}],["modifier",{"2":{"399":1,"407":1}}],["modification",{"2":{"231":1,"469":1}}],["modify",{"2":{"58":1,"131":1,"327":1,"338":1,"339":1}}],["moduleauth",{"2":{"401":1}}],["module",{"2":{"117":1,"268":1,"357":1,"396":1,"397":1,"401":2,"405":1,"409":1}}],["modules",{"0":{"396":1},"1":{"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1},"2":{"75":1,"82":1,"396":3,"397":1,"401":1,"409":1}}],["modular",{"2":{"33":3,"99":1,"241":1}}],["modern",{"2":{"193":1,"376":1}}],["moderately",{"2":{"380":1}}],["moderate",{"2":{"5":1}}],["modes",{"2":{"172":1}}],["mode",{"2":{"131":1,"133":1,"158":1,"172":2}}],["model",{"0":{"359":1},"2":{"8":1,"359":1}}],["modals",{"2":{"108":1,"190":1}}],["modal",{"0":{"102":1,"103":1,"109":1,"118":1,"119":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"120":1,"121":1},"2":{"3":1,"98":1,"102":2,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"119":1}}],["march",{"2":{"428":1}}],["marked",{"2":{"413":1}}],["marketplaces",{"0":{"186":1},"1":{"187":1,"188":1},"2":{"63":1}}],["marketplace",{"0":{"1":1,"17":1,"184":1},"2":{"1":4,"120":1,"184":2,"186":3,"187":8,"188":4,"344":1,"345":1,"346":2,"385":5}}],["mail",{"2":{"420":1}}],["mainmoduleinterface",{"2":{"408":2,"414":2}}],["mainmoduleupgradable",{"2":{"405":1,"408":3,"413":1,"414":1,"415":1,"416":1,"424":1}}],["mainmoduleupgradeable",{"0":{"405":1,"417":1},"1":{"406":1,"407":1},"2":{"438":1}}],["mainmodule",{"2":{"394":1,"395":2,"396":1,"401":2,"405":1,"408":3,"424":1,"438":4}}],["maintaining",{"2":{"193":1,"223":1,"461":1}}],["main",{"2":{"115":3,"139":3,"291":1,"442":3}}],["mainnet",{"2":{"26":2,"27":1,"43":1,"56":1,"57":1,"61":1,"66":2,"72":2,"77":1,"100":2,"101":2,"194":1,"220":1,"253":1,"263":1,"459":1}}],["malicious",{"2":{"380":1,"383":1,"384":1}}],["max",{"2":{"317":1}}],["making",{"2":{"151":1,"155":1,"167":1,"290":1,"384":1}}],["makes",{"2":{"33":2,"77":1,"357":1}}],["make",{"2":{"26":1,"27":1,"28":1,"35":1,"39":1,"41":1,"51":1,"66":2,"75":1,"80":4,"82":1,"123":1,"131":1,"133":1,"139":1,"142":1,"144":1,"157":1,"169":1,"172":3,"174":3,"175":1,"179":1,"216":1,"303":1,"322":1,"342":1}}],["match",{"2":{"187":1,"235":1,"473":1}}],["material",{"2":{"151":1}}],["matic",{"0":{"31":1,"32":1},"1":{"32":1},"2":{"32":2,"66":1,"143":3,"194":1}}],["magicvalue",{"2":{"421":1}}],["magic",{"2":{"151":1,"421":3}}],["macbook",{"2":{"440":1,"442":1,"443":2,"444":1}}],["machine",{"2":{"129":1,"352":1}}],["macos",{"0":{"137":1},"2":{"127":1,"129":1,"176":1,"179":1}}],["mac",{"2":{"127":1,"137":3,"161":1,"167":2,"179":1}}],["made",{"2":{"126":1,"130":1,"154":1,"160":1,"167":3,"181":1,"290":1}}],["major",{"2":{"126":2,"160":2}}],["mapped",{"2":{"324":1}}],["mappings",{"0":{"324":1}}],["map",{"2":{"63":2}}],["master",{"2":{"61":2,"62":1,"289":1}}],["mandatory",{"2":{"190":1}}],["manifest",{"2":{"139":5}}],["manual",{"0":{"131":1},"2":{"139":1}}],["manually",{"0":{"18":1},"2":{"132":1,"449":1}}],["many",{"2":{"63":1,"144":1,"219":1,"240":1,"243":1,"429":1,"458":1,"478":1}}],["mana",{"2":{"62":1}}],["managing",{"0":{"4":1}}],["manages",{"2":{"167":1}}],["manager",{"0":{"129":1,"158":1},"1":{"130":1},"2":{"129":4,"130":1,"131":5,"158":1}}],["management",{"0":{"380":1,"439":1},"1":{"381":1,"382":1,"383":1,"384":1,"440":1,"441":1,"442":1,"443":1,"444":1},"2":{"11":1,"355":1,"357":1,"439":1}}],["managed",{"2":{"2":1,"4":1,"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1,"452":1}}],["manage",{"0":{"329":1},"1":{"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1},"2":{"2":1,"8":1,"96":1,"173":1,"245":1,"330":1,"373":1}}],["may",{"2":{"8":1,"26":1,"33":1,"39":1,"41":1,"66":1,"130":1,"150":1,"158":2,"194":1,"241":1,"243":2,"275":1,"287":1,"289":1,"290":1,"294":1,"299":1,"300":1,"327":2,"348":1,"370":1,"389":1,"398":1,"407":1,"427":1,"433":1,"451":1}}],["merkle",{"2":{"433":1,"437":1}}],["mechanism",{"2":{"430":1}}],["measures",{"2":{"193":1}}],["meaning",{"2":{"429":1}}],["meant",{"2":{"158":1,"358":1}}],["means",{"2":{"30":1,"84":1,"193":1,"358":1,"359":1,"377":1,"381":1,"399":1,"407":1,"408":1,"439":1}}],["memory",{"2":{"175":1}}],["members",{"2":{"0":1}}],["menu",{"2":{"136":1,"137":1,"216":1}}],["mentioned",{"2":{"52":1,"80":1}}],["message",{"0":{"217":1,"227":1,"229":1,"456":1,"465":1,"467":1},"1":{"218":1,"219":1,"220":1,"457":1,"458":1,"459":1},"2":{"130":1,"153":2,"219":4,"223":1,"227":1,"229":3,"230":1,"301":4,"402":1,"419":5,"420":1,"450":1,"455":2,"458":4,"461":1,"465":1,"467":3,"468":1}}],["messages",{"0":{"153":1},"2":{"66":1,"220":1,"222":1,"223":1,"418":1,"419":1,"459":1,"460":1,"461":1}}],["media",{"2":{"78":1}}],["me",{"2":{"62":1,"259":1}}],["metric",{"2":{"182":3}}],["metrics",{"2":{"180":1,"181":1,"182":1}}],["metatxhash",{"2":{"454":1}}],["metatransactionids",{"2":{"37":1}}],["metamask",{"2":{"96":1,"114":1,"123":1,"124":1,"191":1,"193":2,"214":1,"243":1,"245":1,"247":1,"257":1,"267":1,"351":1,"373":1}}],["metal",{"2":{"62":1}}],["meta",{"2":{"8":3,"37":1,"139":2,"240":1,"241":1,"353":1,"358":1,"370":1,"478":1}}],["metadataclient",{"2":{"43":2,"56":2,"57":4}}],["metadatawhen",{"2":{"42":1,"55":1}}],["metadataoptions",{"2":{"23":1,"24":1,"28":3,"30":3,"37":1,"41":1}}],["metadatafield",{"2":{"4":1}}],["metadata",{"0":{"2":1,"4":1,"23":1,"24":1,"30":1,"42":1,"43":1,"44":1,"45":1,"49":1,"54":1,"55":1,"56":1,"57":1,"59":1,"60":1,"77":1,"78":1,"329":1,"331":1,"333":1,"339":1,"342":1},"1":{"3":1,"4":1,"5":1,"43":1,"44":1,"46":1,"47":1,"48":1,"50":1,"51":1,"52":1,"53":1,"54":1,"56":1,"57":1,"58":2,"59":1,"60":1,"61":2,"62":2,"63":2,"64":2,"78":1,"79":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1},"2":{"2":5,"3":1,"4":18,"5":1,"11":2,"23":2,"24":2,"30":3,"33":2,"35":1,"37":2,"41":3,"42":4,"43":8,"44":1,"45":5,"46":5,"47":2,"48":1,"49":9,"50":10,"51":1,"52":8,"53":4,"54":7,"55":6,"56":10,"57":21,"58":6,"59":3,"61":6,"62":4,"63":2,"64":1,"74":1,"78":1,"330":1,"331":1,"332":1,"333":1,"338":1,"339":1,"342":4}}],["methods",{"0":{"54":1,"175":1,"295":1,"303":1},"1":{"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1},"2":{"30":1,"54":1,"64":1,"80":1,"85":1,"133":1,"145":1,"147":1,"149":1,"290":1,"295":1,"303":2,"328":2,"338":1,"409":1,"411":1,"453":1}}],["method",{"2":{"4":1,"23":2,"24":1,"32":1,"37":1,"39":1,"41":1,"43":1,"56":1,"57":2,"61":2,"62":2,"77":1,"80":1,"133":1,"142":1,"144":1,"145":1,"147":1,"149":1,"150":4,"153":1,"154":1,"155":1,"194":1,"220":1,"287":1,"288":1,"289":1,"301":1,"322":1,"323":2,"325":1,"385":1,"399":2,"407":2,"408":1,"414":1,"415":2,"416":1,"421":1,"445":1,"446":1,"448":1,"449":4,"459":1}}],["otp",{"2":{"358":1,"441":4}}],["otherrainbowkitwallets",{"2":{"259":1}}],["otherconnectors",{"2":{"249":1}}],["others",{"2":{"125":1,"172":1}}],["otherwise",{"2":{"77":1,"304":1,"419":1,"420":1,"421":1,"449":2}}],["other",{"0":{"240":1,"478":1},"2":{"8":1,"99":1,"123":1,"124":1,"133":1,"136":1,"137":1,"174":1,"190":2,"213":1,"220":1,"240":1,"243":1,"249":1,"251":1,"259":1,"261":1,"277":1,"278":1,"340":1,"358":2,"396":1,"399":1,"407":1,"436":1,"459":1,"478":1}}],["oauth",{"2":{"358":1,"442":4}}],["omit",{"2":{"301":1}}],["omitted",{"2":{"30":2,"198":1}}],["older",{"0":{"254":1,"265":1},"2":{"254":1,"255":1,"256":2,"264":1,"265":1,"266":1}}],["oldsilver",{"2":{"50":1}}],["os",{"2":{"216":2}}],["occure",{"2":{"184":1}}],["oidc",{"2":{"133":1,"135":1}}],["o",{"2":{"66":2}}],["okay",{"2":{"61":1}}],["ogimage",{"2":{"50":1}}],["opcode",{"2":{"395":1}}],["operated",{"2":{"357":1}}],["operate",{"2":{"356":1}}],["operation",{"2":{"398":1,"410":1,"413":1,"432":1,"440":1}}],["operations",{"2":{"253":1,"263":1}}],["operational",{"2":{"92":1,"366":1}}],["openwithoptions",{"2":{"194":2}}],["openwalletintent",{"2":{"194":1}}],["openwallet",{"2":{"194":3}}],["opened",{"2":{"155":1,"440":1,"441":1}}],["openidauthentication",{"2":{"127":1}}],["opening",{"0":{"118":1},"2":{"130":1,"151":1,"198":1}}],["openning",{"2":{"66":2}}],["open",{"2":{"66":2,"72":1,"77":2,"94":1,"103":2,"118":1,"129":1,"133":2,"136":1,"137":1,"155":1,"179":2,"194":2,"203":1,"211":1,"239":1,"243":1,"334":1,"385":1,"441":2,"442":1,"477":1}}],["opensea",{"2":{"30":1,"44":2,"61":3,"64":1}}],["option",{"2":{"30":1,"49":1,"66":2,"84":1,"182":1,"193":2,"195":1,"208":1,"213":1,"216":1,"289":1,"327":1}}],["optionality",{"2":{"191":1}}],["optionally",{"2":{"37":5,"143":1,"145":1,"147":1,"149":1,"194":1,"242":1,"371":1}}],["optional",{"0":{"252":1,"253":1,"262":1,"263":1,"271":1,"272":1,"281":1},"2":{"23":4,"24":4,"37":4,"41":4,"66":2,"72":1,"101":1,"144":1,"167":1,"201":1,"301":1}}],["options",{"0":{"105":1,"106":1,"187":1,"190":1,"195":1,"252":1,"253":1,"279":1},"1":{"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"280":1,"281":1},"2":{"7":1,"23":1,"24":1,"30":1,"37":1,"41":1,"66":2,"72":1,"80":1,"97":1,"105":2,"113":2,"114":2,"123":2,"186":1,"187":2,"189":1,"191":1,"194":2,"209":1,"246":1,"249":1,"252":1,"262":2,"277":2,"347":2,"374":1,"379":2,"380":1}}],["optimal",{"2":{"8":1}}],["obvious",{"2":{"150":1}}],["objectdark",{"2":{"107":1}}],["objects",{"2":{"63":1,"148":1}}],["object",{"0":{"82":1},"2":{"23":1,"24":1,"37":2,"39":1,"41":1,"62":2,"63":1,"67":1,"82":1,"85":1,"107":2,"109":1,"118":1,"119":1,"129":2,"131":1,"142":1,"145":1,"147":1,"149":1,"150":1,"153":1,"154":1,"158":3,"169":1,"195":1,"219":2,"301":1,"302":1,"322":2,"323":3,"454":2,"455":1,"458":2}}],["obtained",{"2":{"441":1,"442":1}}],["obtain",{"2":{"3":1,"133":1,"142":1,"153":1,"154":1,"441":2,"442":2}}],["obtaining",{"0":{"3":1},"2":{"2":1}}],["outlined",{"2":{"85":1}}],["out",{"2":{"80":1,"85":1,"87":1,"96":1,"97":1,"120":1,"130":2,"141":1,"142":1,"153":1,"154":1,"158":1,"159":1,"187":1,"188":1,"190":1,"192":1,"194":1,"220":1,"243":1,"245":1,"246":1,"344":1,"361":1,"368":1,"373":1,"374":1,"419":1,"420":1,"459":1}}],["outside",{"2":{"11":1,"145":1,"147":1,"149":1,"194":1}}],["ours",{"2":{"172":1}}],["our",{"2":{"2":1,"3":2,"4":1,"6":1,"7":1,"22":1,"23":1,"25":1,"30":1,"31":1,"33":1,"36":1,"38":1,"40":1,"43":1,"50":1,"56":1,"57":2,"64":1,"66":1,"87":2,"88":1,"94":1,"95":1,"96":1,"97":1,"126":1,"127":1,"130":3,"131":1,"133":2,"135":1,"144":2,"145":1,"146":2,"147":1,"148":2,"149":1,"151":1,"152":1,"158":2,"159":1,"180":1,"181":1,"186":2,"187":3,"188":2,"189":2,"190":2,"191":3,"192":2,"239":1,"243":3,"244":1,"245":1,"246":1,"289":1,"290":1,"302":1,"303":1,"322":1,"323":2,"325":2,"327":1,"344":1,"345":1,"361":2,"362":1,"368":1,"372":1,"373":1,"374":1,"385":1,"477":1}}],["ownable",{"0":{"328":1},"2":{"328":4}}],["ownership",{"2":{"66":1,"84":1}}],["owner",{"2":{"66":1,"355":1}}],["owned",{"0":{"349":1},"1":{"350":1,"351":1},"2":{"23":1,"115":1,"348":1,"349":1,"383":1}}],["own",{"2":{"6":1,"50":1,"96":1,"123":1,"126":1,"155":1,"157":1,"159":1,"165":1,"169":1,"187":2,"245":1,"290":1,"302":1,"327":1,"342":1,"373":1,"380":1,"436":2}}],["override",{"2":{"107":1,"398":1,"402":1,"406":1,"421":1}}],["overwritten",{"2":{"107":1,"131":1}}],["overview",{"0":{"116":1,"182":1,"186":1,"189":1,"356":1},"1":{"183":1,"184":1,"185":1,"187":1,"188":1,"190":1,"191":1,"192":1,"357":1,"358":1},"2":{"25":1,"182":1}}],["over",{"2":{"6":1,"165":1,"175":1,"332":1,"341":1,"383":1,"384":1}}],["orchestration",{"2":{"187":1}}],["origin",{"0":{"198":1},"2":{"80":1,"198":1}}],["originaddress",{"2":{"50":1}}],["orgs",{"2":{"65":1,"74":1}}],["organizations",{"2":{"33":1}}],["or",{"0":{"29":1,"43":1,"48":1,"56":1,"214":1},"2":{"4":4,"7":1,"8":2,"23":1,"24":1,"26":2,"27":3,"30":1,"32":1,"33":1,"35":1,"37":1,"39":1,"41":2,"42":1,"43":4,"46":2,"49":1,"50":2,"51":1,"52":1,"53":1,"54":4,"55":2,"56":4,"57":7,"58":1,"61":1,"63":2,"66":4,"72":1,"74":2,"77":4,"78":1,"80":3,"81":1,"84":1,"97":1,"99":2,"107":1,"117":2,"120":1,"123":1,"124":1,"127":1,"129":3,"131":1,"133":1,"135":1,"139":2,"141":1,"142":1,"143":2,"150":3,"151":1,"153":1,"154":3,"159":1,"161":1,"164":1,"167":1,"169":1,"172":2,"174":1,"180":1,"187":2,"190":3,"191":1,"193":1,"194":1,"206":1,"213":1,"220":2,"222":1,"223":1,"228":1,"230":1,"235":1,"237":1,"240":2,"241":2,"243":3,"246":1,"248":1,"254":1,"255":1,"258":1,"264":3,"265":1,"268":1,"299":2,"300":2,"305":1,"308":1,"310":1,"312":1,"314":1,"321":1,"322":1,"323":2,"324":1,"325":1,"327":1,"340":1,"348":1,"355":1,"357":1,"358":1,"359":2,"370":2,"374":1,"376":1,"377":1,"380":1,"381":3,"384":3,"385":2,"386":1,"389":1,"397":1,"401":1,"416":1,"431":2,"433":1,"434":1,"436":2,"447":1,"450":2,"452":2,"453":1,"454":1,"455":1,"459":2,"460":1,"461":1,"466":1,"468":1,"473":1,"475":1,"478":2}}],["ordering",{"2":{"430":1}}],["orderid",{"2":{"385":1}}],["orderbook",{"2":{"385":1}}],["orderbookorder",{"2":{"385":1}}],["orderbookcontractaddress",{"2":{"346":1,"385":4}}],["orderstatus",{"2":{"385":2}}],["orders",{"2":{"385":4}}],["ordersummaryitems",{"0":{"121":1},"2":{"119":1,"121":2}}],["order",{"0":{"121":1},"2":{"0":1,"2":1,"3":1,"4":1,"23":1,"66":1,"73":1,"74":1,"75":1,"77":1,"79":1,"80":1,"113":1,"114":1,"121":1,"130":1,"135":1,"150":1,"165":1,"173":1,"177":1,"320":1,"321":1,"323":1,"356":1,"385":8,"395":1,"432":1,"440":1}}],["onvalidationrequired",{"0":{"450":1},"2":{"450":2,"451":2,"452":3}}],["onmeta",{"2":{"347":1,"379":1}}],["onmigration",{"2":{"66":1}}],["onboard",{"0":{"267":1},"1":{"268":1,"269":1,"270":1,"271":1,"272":1,"273":1},"2":{"193":1,"243":1,"267":3,"268":2,"269":3,"273":1}}],["onboarding",{"2":{"95":1,"96":1,"132":1,"163":1,"193":1,"244":1,"245":1,"372":1,"373":1}}],["onfailuretest",{"2":{"175":1}}],["onresponse",{"2":{"175":1}}],["onramp",{"0":{"21":1}}],["ondeploycontractfailedhandler",{"2":{"154":2}}],["ondeploycontractfailed",{"2":{"154":2}}],["ondeploycontractcompletehandler",{"2":{"154":2}}],["ondeploycontractcomplete",{"2":{"154":2}}],["onsessionstatechanged",{"2":{"442":2}}],["onsendtransactionfailedhandler",{"2":{"142":2}}],["onsendtransactionfailed",{"2":{"142":2,"154":1}}],["onsendtransactioncompletehandler",{"2":{"142":2}}],["onsendtransactioncomplete",{"2":{"142":2,"154":1}}],["onsuccess=",{"2":{"442":1}}],["onsuccess",{"2":{"172":1}}],["onsignmessagecompletehandler",{"2":{"153":2}}],["onsignmessagecomplete",{"2":{"153":2}}],["onwaaswalletcreatedhander",{"2":{"142":1,"153":1,"154":1}}],["onwaaswalletcreatedhandler",{"2":{"141":3}}],["onwaaswalletcreated",{"2":{"141":2}}],["onlyself",{"2":{"398":1,"399":1,"406":1,"407":1}}],["only",{"0":{"289":1},"2":{"23":1,"24":1,"37":1,"41":1,"77":2,"91":1,"99":1,"115":1,"127":2,"131":2,"141":1,"151":1,"160":1,"167":1,"207":1,"213":1,"230":1,"231":2,"233":1,"234":1,"241":1,"287":1,"288":1,"299":1,"300":1,"322":1,"327":1,"347":1,"355":1,"358":3,"365":1,"370":1,"379":1,"380":2,"384":1,"397":1,"399":1,"401":1,"407":1,"431":1,"436":1,"443":1,"455":1,"468":1,"469":2,"471":1,"472":1}}],["onclick=",{"2":{"102":1,"103":1,"118":1}}],["onclick",{"2":{"102":2,"103":2,"118":2,"194":1}}],["onchainreader",{"2":{"220":1,"459":1}}],["onchain",{"2":{"11":1,"58":1}}],["once",{"2":{"3":1,"66":1,"75":1,"85":1,"91":1,"102":1,"134":1,"135":1,"141":1,"165":2,"172":1,"174":1,"179":1,"187":1,"194":1,"216":1,"288":1,"294":1,"299":1,"300":1,"337":1,"365":1,"381":1,"414":1,"441":1,"449":1}}],["on",{"0":{"19":1,"20":1,"21":1,"30":1,"32":4,"169":1,"170":1,"332":1,"335":1,"347":1,"379":1,"423":1},"2":{"3":2,"8":1,"23":2,"24":2,"25":1,"26":2,"30":2,"32":2,"33":2,"37":2,"39":4,"41":3,"43":1,"49":1,"50":2,"55":1,"61":3,"62":2,"64":1,"66":1,"73":1,"74":1,"75":1,"83":1,"84":1,"90":1,"95":1,"108":1,"123":2,"124":1,"127":1,"129":5,"130":2,"131":1,"132":1,"133":1,"134":2,"135":1,"143":1,"144":1,"150":5,"155":1,"157":1,"158":1,"160":1,"164":1,"167":2,"173":4,"175":1,"179":7,"182":1,"187":1,"190":2,"191":1,"193":5,"194":3,"196":1,"213":1,"214":1,"220":4,"223":1,"228":1,"230":1,"232":1,"233":1,"234":1,"237":1,"240":1,"241":2,"243":1,"244":1,"254":1,"255":3,"264":3,"265":1,"287":4,"288":2,"289":1,"290":2,"304":3,"327":1,"328":1,"331":1,"333":1,"334":2,"335":2,"336":1,"337":1,"338":2,"339":1,"347":5,"349":1,"355":1,"357":1,"359":1,"364":1,"370":2,"372":1,"376":1,"377":2,"379":5,"380":2,"385":1,"392":1,"396":1,"400":1,"401":1,"409":1,"411":1,"413":1,"421":1,"436":1,"445":1,"455":2,"459":4,"461":1,"466":1,"468":1,"470":1,"471":1,"472":1,"475":1,"478":1}}],["ones",{"2":{"187":1}}],["one",{"0":{"446":1},"2":{"0":1,"4":1,"23":1,"30":1,"50":1,"52":1,"66":3,"72":1,"75":1,"77":3,"139":1,"143":1,"151":1,"154":1,"172":1,"175":1,"179":1,"182":1,"205":1,"216":1,"232":1,"233":1,"234":1,"243":1,"288":1,"289":1,"299":1,"300":1,"338":1,"356":1,"380":1,"381":1,"397":1,"402":1,"415":1,"441":1,"446":1,"447":1,"470":1,"471":1,"472":1}}],["official",{"2":{"113":1,"114":1,"122":1,"123":1,"288":1}}],["off",{"2":{"62":1}}],["offered",{"2":{"152":1}}],["offer",{"2":{"51":1,"187":1,"193":1,"243":1,"357":1,"385":1}}],["offers",{"2":{"1":1,"2":1,"8":1,"26":1,"45":1,"49":1,"53":1,"189":1,"355":1}}],["often",{"2":{"59":1,"148":1}}],["of",{"0":{"11":1,"23":1,"24":1,"43":1,"191":1,"235":1,"254":1,"265":1,"288":1,"391":1,"473":1},"2":{"0":3,"4":3,"6":1,"8":7,"23":4,"24":5,"26":3,"27":2,"28":2,"29":1,"30":3,"32":1,"33":3,"34":1,"35":2,"37":7,"39":5,"41":5,"43":3,"48":1,"49":2,"50":4,"52":3,"53":2,"54":6,"56":3,"57":2,"61":4,"62":1,"63":3,"64":1,"66":3,"72":1,"73":2,"74":1,"75":1,"77":2,"80":2,"84":1,"87":1,"92":1,"93":2,"94":2,"95":2,"96":2,"108":1,"110":1,"111":1,"113":1,"114":1,"115":1,"121":1,"123":2,"124":2,"125":1,"130":4,"131":1,"132":1,"142":2,"143":4,"145":3,"146":1,"147":3,"148":1,"149":3,"150":4,"151":4,"152":3,"154":1,"155":2,"156":1,"158":1,"159":1,"165":1,"167":4,"169":1,"172":1,"173":3,"174":2,"175":4,"180":1,"182":1,"183":1,"184":1,"185":1,"186":2,"187":1,"188":2,"190":2,"191":3,"193":7,"194":1,"196":1,"198":1,"205":2,"206":1,"210":1,"211":1,"214":1,"216":1,"219":1,"223":1,"232":1,"233":1,"234":1,"238":2,"239":2,"241":2,"243":3,"244":2,"245":2,"248":2,"249":1,"252":1,"254":3,"255":1,"256":3,"259":1,"262":2,"264":1,"265":3,"272":1,"273":2,"274":1,"281":1,"287":1,"288":3,"289":5,"291":1,"292":2,"294":1,"295":2,"299":2,"300":2,"301":1,"302":1,"303":3,"304":2,"311":1,"319":1,"322":1,"323":2,"325":1,"327":5,"332":1,"334":2,"335":1,"338":3,"340":1,"349":2,"352":2,"355":3,"356":4,"358":4,"359":3,"361":1,"366":1,"370":1,"372":2,"373":2,"380":3,"381":2,"382":1,"383":1,"384":2,"385":12,"386":1,"387":1,"388":2,"389":3,"390":1,"391":4,"392":2,"393":1,"394":2,"395":2,"396":3,"398":3,"399":2,"400":1,"401":5,"402":1,"403":1,"405":1,"407":5,"408":2,"412":1,"413":3,"415":1,"416":1,"418":1,"419":1,"420":1,"425":1,"429":4,"431":2,"433":1,"435":2,"436":4,"437":1,"438":8,"439":1,"440":1,"443":1,"444":1,"447":1,"448":1,"454":2,"458":1,"461":1,"470":1,"471":1,"472":1,"476":2,"477":2}}],["i32",{"2":{"385":2}}],["ignored",{"2":{"194":1,"207":1,"208":1,"209":1,"391":1}}],["iwallet",{"2":{"155":1,"292":2,"293":2,"294":2,"295":1}}],["iindexer",{"2":{"152":2}}],["icon",{"2":{"129":1,"131":1,"179":1}}],["icons",{"2":{"50":1}}],["ipfs",{"2":{"61":2,"330":1,"331":1,"332":3,"339":1}}],["ios",{"0":{"136":1,"178":1},"2":{"127":1,"129":1,"136":2,"161":1,"176":1,"178":1,"179":1}}],["io",{"2":{"44":1,"61":1,"220":1,"242":1,"371":1,"459":1}}],["identifier",{"2":{"332":1,"455":1}}],["identity",{"2":{"219":1,"220":1,"358":1,"359":1,"446":1,"447":1,"458":1,"459":1}}],["ideas",{"2":{"159":2}}],["ideal",{"2":{"131":1,"187":2}}],["idea",{"2":{"8":1}}],["idtokenin",{"2":{"167":1,"169":1}}],["idtoken",{"2":{"133":1,"134":1,"135":1,"141":1,"440":2,"441":6,"442":2,"443":1,"444":1,"454":1,"455":1}}],["id",{"2":{"43":1,"50":3,"52":1,"56":1,"57":3,"58":1,"61":1,"62":2,"64":1,"66":1,"72":1,"100":2,"101":2,"113":1,"114":1,"123":2,"124":1,"167":1,"169":2,"177":6,"234":2,"235":1,"252":1,"262":1,"280":1,"301":3,"309":1,"313":1,"331":1,"338":1,"339":2,"340":1,"342":1,"358":1,"385":1,"442":1,"443":2,"444":2,"454":1,"472":2,"473":1}}],["ids",{"0":{"24":1},"2":{"37":1,"50":2,"56":1,"57":1,"148":1,"385":2}}],["idsyou",{"2":{"23":1}}],["iethclient",{"2":{"302":2,"303":1}}],["ie",{"0":{"31":1},"1":{"32":1},"2":{"4":1,"8":1,"43":1,"56":1,"57":1,"202":1}}],["i",{"0":{"191":1,"288":1,"289":1},"2":{"4":1,"62":2,"72":1,"139":1}}],["immediately",{"2":{"73":1}}],["imperative",{"2":{"413":1}}],["improved",{"2":{"380":1}}],["improperly",{"2":{"290":1}}],["implicit",{"2":{"135":1}}],["implementing",{"2":{"328":1}}],["implemented",{"2":{"74":1,"145":1,"147":1,"149":1,"164":1,"167":1,"303":1,"348":1,"352":1,"401":1,"438":1}}],["implements",{"2":{"72":1,"165":1}}],["implementationaddressaddress",{"2":{"399":1}}],["implementations",{"2":{"292":1}}],["implementation",{"0":{"386":1,"397":1,"400":1},"1":{"398":1,"399":1,"400":1},"2":{"26":1,"53":1,"74":1,"85":1,"152":1,"164":1,"169":2,"396":1,"398":4,"399":1,"400":4,"408":1,"438":3}}],["implement",{"0":{"82":1},"2":{"26":1,"53":1,"85":1,"133":1,"350":1,"352":2,"401":1,"439":1}}],["important",{"0":{"291":1},"2":{"132":1,"133":1,"156":1,"295":1,"324":1}}],["importantly",{"2":{"3":1}}],["imported",{"2":{"132":2,"158":1,"249":1,"259":1,"289":1}}],["importing",{"2":{"130":1}}],["import",{"2":{"7":2,"23":2,"24":2,"27":1,"28":1,"32":2,"37":2,"39":2,"41":2,"43":2,"46":1,"47":1,"56":2,"57":4,"66":2,"72":1,"77":2,"80":2,"85":2,"92":1,"100":6,"101":8,"102":2,"103":1,"117":1,"118":1,"124":1,"129":4,"130":2,"131":3,"194":2,"219":1,"220":5,"225":2,"249":1,"259":2,"269":1,"277":1,"278":2,"288":2,"289":2,"366":1,"385":1,"400":1,"419":1,"420":2,"440":1,"441":1,"442":8,"443":1,"444":1,"454":1,"455":1,"458":1,"459":5,"463":2}}],["imagehashbytes32hash",{"2":{"403":1,"407":1}}],["imagehash",{"0":{"392":1,"437":1},"1":{"393":1,"395":1},"2":{"392":2,"393":1,"394":1,"395":1,"402":3,"404":1,"406":2,"407":3,"413":3,"416":4,"436":1,"437":3,"438":4}}],["images",{"0":{"331":1},"2":{"11":1,"50":1,"331":1,"332":1,"341":1}}],["image",{"0":{"393":1},"2":{"4":7,"50":1,"61":1,"62":1,"194":2,"206":3,"331":1,"332":1}}],["iterate",{"2":{"419":2,"420":2,"421":1}}],["item",{"0":{"329":1},"1":{"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1},"2":{"179":2,"331":1,"336":1}}],["items",{"2":{"24":1,"330":1}}],["itself",{"2":{"233":1,"234":1,"384":1,"399":1,"400":1,"407":1,"411":2,"441":1,"471":1,"472":1}}],["its",{"2":{"124":1,"148":1,"194":1,"219":1,"289":1,"436":2,"458":1}}],["it",{"0":{"7":1,"156":1,"181":1},"2":{"3":3,"25":1,"30":2,"33":4,"49":1,"50":1,"61":2,"62":1,"66":3,"77":2,"80":2,"82":1,"83":1,"84":3,"92":1,"94":1,"124":1,"130":3,"131":3,"132":1,"133":3,"139":3,"141":1,"144":1,"150":5,"151":1,"155":1,"157":2,"158":2,"165":5,"167":1,"168":2,"172":2,"175":1,"179":2,"181":1,"193":1,"194":1,"219":1,"222":1,"226":1,"239":1,"241":1,"243":1,"247":1,"253":1,"255":1,"257":1,"263":1,"264":1,"267":1,"283":1,"289":1,"291":1,"294":1,"297":1,"298":1,"304":1,"321":1,"322":3,"323":1,"324":1,"325":2,"327":1,"332":2,"337":1,"338":1,"339":3,"340":3,"342":1,"352":1,"357":2,"358":5,"359":3,"366":1,"376":1,"377":1,"385":2,"389":1,"396":3,"397":1,"399":1,"407":2,"410":1,"413":3,"414":1,"415":1,"431":1,"436":3,"438":1,"440":1,"449":2,"450":2,"454":1,"455":2,"458":1,"460":1,"464":1,"477":1}}],["isthis",{"2":{"443":2}}],["issenttransactionresponse",{"2":{"454":3,"455":2}}],["issessionvalid",{"2":{"448":2}}],["issignedin",{"2":{"442":1}}],["issignerleaf",{"2":{"437":1}}],["issubdigestleaf",{"2":{"437":1}}],["issued",{"2":{"455":1}}],["issuer",{"2":{"443":2}}],["issue",{"2":{"287":1}}],["islisting",{"2":{"346":1,"385":1}}],["ismounted",{"2":{"288":2}}],["isbound",{"2":{"167":1}}],["isnestedleaf",{"2":{"437":1}}],["isn",{"2":{"131":1,"158":1}}],["isconnected",{"2":{"102":2}}],["isvalidsignature",{"2":{"421":3}}],["isvalidbooltrue",{"2":{"404":1}}],["isvalidimage",{"0":{"402":1},"1":{"403":1,"404":1},"2":{"402":1}}],["isvalidmessagesignature",{"2":{"228":1,"466":1}}],["isvalidethauthproof",{"2":{"80":1}}],["isvalid",{"2":{"80":2,"228":2,"402":1,"421":2,"448":2,"466":2}}],["is",{"2":{"1":1,"2":1,"3":3,"4":4,"5":1,"8":1,"22":1,"23":1,"24":1,"25":2,"26":3,"29":1,"30":3,"31":1,"33":4,"35":2,"36":1,"37":1,"38":1,"39":1,"40":1,"41":2,"48":1,"49":2,"50":2,"51":1,"52":1,"61":5,"62":2,"63":5,"66":2,"72":2,"73":2,"74":1,"75":1,"77":2,"80":6,"84":2,"91":2,"92":1,"93":4,"94":1,"95":1,"99":1,"100":1,"109":1,"123":1,"130":4,"131":2,"132":2,"133":3,"135":1,"139":1,"141":2,"142":3,"143":4,"144":3,"146":1,"148":1,"150":2,"151":2,"152":3,"153":2,"154":4,"155":3,"156":1,"157":1,"158":1,"160":1,"165":1,"167":9,"168":2,"173":1,"174":2,"175":1,"179":2,"187":3,"190":3,"193":6,"194":2,"199":2,"201":1,"203":1,"207":1,"208":1,"209":1,"212":1,"216":6,"219":3,"220":3,"222":2,"232":1,"233":3,"234":3,"235":1,"237":1,"238":4,"239":1,"240":2,"241":2,"243":1,"244":1,"247":1,"248":1,"249":1,"251":1,"252":1,"254":1,"256":3,"257":1,"258":1,"259":1,"261":1,"262":1,"265":1,"266":3,"267":1,"268":1,"273":1,"274":1,"282":1,"283":1,"284":2,"285":1,"287":4,"288":5,"289":5,"290":2,"292":1,"293":2,"294":2,"299":5,"300":5,"301":1,"302":1,"304":4,"309":1,"313":1,"321":1,"322":3,"324":1,"327":2,"337":1,"338":1,"340":2,"342":1,"348":1,"357":3,"358":2,"359":4,"365":2,"366":1,"370":1,"372":1,"380":2,"381":3,"383":1,"384":3,"385":4,"391":1,"392":4,"396":1,"400":1,"401":2,"402":2,"405":1,"406":1,"407":4,"408":4,"409":2,"410":1,"411":1,"412":2,"413":4,"414":1,"415":1,"416":3,"419":2,"420":2,"421":5,"429":1,"431":2,"432":2,"433":1,"434":2,"435":4,"436":7,"437":6,"438":1,"440":1,"441":3,"442":7,"446":1,"448":1,"449":1,"450":4,"452":1,"454":1,"455":3,"458":3,"459":3,"460":2,"470":1,"471":3,"472":3,"473":1,"475":1,"476":4,"477":1,"478":2}}],["iframe",{"2":{"11":1}}],["if",{"2":{"0":1,"4":1,"5":1,"23":1,"24":1,"26":1,"27":1,"30":1,"37":1,"41":1,"46":1,"50":1,"53":1,"62":1,"63":1,"66":7,"67":1,"72":3,"73":2,"80":9,"82":1,"83":1,"85":1,"97":1,"115":1,"123":2,"129":2,"130":1,"131":4,"132":1,"139":2,"141":2,"142":2,"144":2,"145":1,"147":1,"149":1,"150":3,"153":2,"154":2,"165":2,"167":2,"174":1,"175":2,"179":1,"187":1,"191":1,"193":3,"194":4,"207":1,"208":1,"209":1,"212":1,"213":1,"216":2,"220":3,"223":1,"228":1,"230":2,"231":1,"240":3,"241":1,"243":2,"246":1,"248":1,"254":1,"265":1,"288":1,"299":4,"300":4,"301":2,"302":1,"304":1,"322":1,"323":2,"324":2,"325":2,"326":1,"339":1,"342":1,"352":1,"359":1,"370":1,"374":1,"380":1,"381":2,"383":2,"384":2,"385":3,"399":1,"402":1,"404":1,"407":1,"410":1,"413":1,"415":1,"416":1,"419":1,"420":1,"421":3,"431":1,"435":1,"436":1,"437":3,"438":1,"440":1,"442":1,"447":1,"449":2,"450":2,"454":2,"455":2,"459":3,"461":1,"466":1,"468":2,"469":1,"478":3}}],["inaccessible",{"2":{"436":1}}],["inactive",{"2":{"359":1}}],["inner",{"2":{"436":1}}],["individual",{"2":{"380":1}}],["indicating",{"2":{"289":1}}],["index",{"2":{"80":1,"454":1}}],["indexing",{"2":{"33":1}}],["indexeddb",{"2":{"382":2}}],["indexeable",{"2":{"57":1}}],["indexes",{"2":{"33":2}}],["indexer",{"0":{"25":1,"33":1},"1":{"26":1,"27":1,"28":1,"29":1,"34":1,"35":1},"2":{"22":1,"23":12,"24":12,"25":4,"26":9,"27":6,"28":5,"29":1,"30":3,"31":1,"32":12,"33":8,"36":1,"37":13,"38":1,"39":15,"40":1,"41":14,"42":2,"49":1,"55":2,"57":1,"126":1,"152":3,"160":1}}],["independently",{"2":{"357":1,"358":1,"359":1}}],["independent",{"2":{"8":1,"73":1,"380":2,"425":1,"432":1}}],["inherit",{"2":{"288":1,"328":1}}],["inherits",{"2":{"165":1}}],["incorrect",{"2":{"407":1}}],["increase",{"2":{"193":1}}],["increment",{"2":{"126":3,"160":3}}],["including",{"0":{"41":1},"2":{"35":2,"124":1,"148":1,"252":1,"262":1,"321":1,"385":1}}],["includes",{"2":{"37":1,"66":1,"193":1,"443":1,"454":1}}],["includecontracts",{"2":{"23":1,"24":1,"30":1,"37":1,"41":1}}],["includedpaymentproviders",{"0":{"210":1},"2":{"194":2,"210":1}}],["included",{"2":{"23":2,"24":2,"37":2,"41":2,"303":1,"454":1}}],["includemetadata",{"2":{"23":3,"24":3,"28":2,"32":1,"37":3,"39":2,"41":3,"42":1,"55":1}}],["include",{"2":{"4":1,"30":1,"50":1,"59":1,"67":1,"107":1,"108":1,"143":1,"144":1,"151":1,"323":1,"407":1}}],["input",{"2":{"112":1,"143":1,"172":1,"407":1}}],["inputted",{"2":{"77":1}}],["inline",{"2":{"112":1}}],["involve",{"2":{"453":1}}],["involves",{"2":{"154":1}}],["invoking",{"0":{"103":1}}],["invoke",{"2":{"102":1}}],["invalid",{"2":{"83":1,"230":1,"391":1,"398":1,"431":1,"468":1}}],["investigate",{"2":{"0":1}}],["initiateauth",{"2":{"441":1}}],["initiated",{"2":{"216":1}}],["initiating",{"2":{"281":1}}],["initialization",{"0":{"277":1},"2":{"438":2}}],["initializes",{"2":{"289":1}}],["initialized",{"2":{"123":1,"277":1,"278":1,"289":1}}],["initialize",{"0":{"225":1,"463":1},"2":{"66":1,"75":2,"408":1}}],["initial",{"0":{"394":1,"438":1},"1":{"395":1},"2":{"172":1,"187":1,"394":1,"396":1,"397":1,"432":1,"438":5}}],["initwallet",{"2":{"194":2}}],["init",{"2":{"75":3}}],["infinity",{"2":{"435":2}}],["infura",{"2":{"220":2,"459":2}}],["infer",{"2":{"64":1}}],["informed",{"2":{"384":1}}],["informs",{"2":{"289":1}}],["information",{"2":{"23":1,"26":1,"33":1,"50":1,"61":1,"64":1,"90":1,"164":3,"188":1,"289":1,"364":1,"383":1}}],["info",{"2":{"43":1,"61":1,"65":1,"67":1,"74":1,"75":1,"139":2,"194":1,"384":1,"401":1}}],["infrastructure",{"2":{"6":2,"33":1,"93":1,"190":1,"238":1,"476":1}}],["insightful",{"2":{"181":1}}],["insights",{"2":{"180":1}}],["inside",{"2":{"8":1,"29":1,"48":1}}],["insecurely",{"2":{"164":1}}],["inspector",{"2":{"158":2}}],["instead",{"2":{"61":1,"124":1,"139":1,"219":1,"254":1,"265":1,"302":1,"323":1,"380":1,"392":2,"408":1,"437":1,"439":1,"458":1}}],["instructions",{"0":{"58":1},"2":{"25":1,"177":1}}],["instantiating",{"2":{"194":1}}],["instantiate",{"2":{"85":1}}],["instances",{"2":{"451":1}}],["instance",{"2":{"23":1,"92":1,"152":1,"194":2,"366":1,"441":2}}],["installing",{"0":{"99":1},"2":{"98":1,"131":1}}],["installed",{"2":{"75":1,"129":1,"193":1,"242":1,"248":2,"258":1,"275":1,"371":1}}],["installation",{"0":{"25":1,"26":1,"27":1,"28":1,"29":1,"46":1,"47":1,"48":1,"90":1,"128":1,"162":1,"248":1,"258":1,"268":1,"275":1,"364":1},"1":{"26":1,"27":2,"28":2,"29":2,"129":1,"130":1,"131":1,"163":1,"164":1},"2":{"46":1}}],["install",{"0":{"241":1,"370":1},"1":{"242":1,"371":1},"2":{"7":2,"27":2,"46":2,"75":1,"80":2,"85":2,"90":2,"99":5,"101":1,"117":3,"130":1,"193":1,"194":2,"215":1,"241":2,"248":1,"254":2,"258":1,"265":2,"268":1,"275":1,"364":2,"370":2,"378":1}}],["int256",{"2":{"324":1}}],["int",{"2":{"144":1,"312":1,"324":1}}],["introduction",{"0":{"126":1,"160":1,"290":1,"330":1},"1":{"127":1,"161":1,"291":1}}],["introduced",{"2":{"30":1}}],["introducing",{"2":{"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1}}],["into",{"0":{"244":1,"372":1},"1":{"245":1,"373":1},"2":{"6":1,"25":1,"75":1,"76":1,"80":1,"95":1,"97":2,"130":1,"131":1,"139":1,"150":1,"151":1,"154":1,"165":2,"172":1,"173":1,"189":1,"190":1,"206":1,"241":1,"244":1,"246":2,"255":1,"264":1,"289":1,"299":1,"300":1,"304":1,"324":1,"333":1,"370":1,"372":1,"374":2,"437":2}}],["intend",{"2":{"384":1}}],["intent",{"2":{"139":19,"194":3,"358":1}}],["integers",{"2":{"324":1}}],["integer",{"2":{"212":1,"313":1,"324":2}}],["integrity",{"2":{"198":1,"219":1,"458":1}}],["integration",{"0":{"117":1,"167":1,"171":1,"287":1},"1":{"118":1,"119":1,"120":1,"121":1,"172":1,"173":1,"174":1,"175":1},"2":{"96":1,"125":1,"126":1,"160":1,"188":1,"190":1,"192":1,"195":1,"245":1,"273":1,"373":1}}],["integrations",{"2":{"23":1,"43":1,"51":1,"56":1,"57":2,"191":1,"385":1}}],["integrating",{"2":{"8":1,"95":1,"194":1,"244":1,"347":1,"372":1,"379":1}}],["integrates",{"2":{"191":1}}],["integrated",{"2":{"29":1,"48":1,"49":1,"126":1,"210":1,"211":1}}],["integrate",{"0":{"12":1,"17":1,"20":1,"21":1,"244":1,"372":1},"1":{"245":1,"373":1},"2":{"0":1,"25":1,"26":1,"53":1,"96":1,"97":1,"117":1,"122":1,"189":1,"240":1,"245":1,"246":1,"355":1,"373":1,"374":1,"377":1,"478":1}}],["interchangeably",{"2":{"294":1}}],["intercepted",{"2":{"172":1}}],["interpret",{"2":{"223":1,"461":1}}],["interoperability",{"2":{"193":1}}],["internally",{"2":{"402":1,"437":1}}],["internal",{"2":{"181":1,"357":1,"402":1,"436":3}}],["intermediate",{"2":{"179":1}}],["interfacing",{"2":{"99":1}}],["interfaces",{"2":{"386":1}}],["interface",{"2":{"8":1,"51":2,"53":1,"66":1,"72":1,"80":1,"85":2,"152":1,"216":1,"232":2,"233":2,"234":2,"235":3,"292":2,"294":1,"295":1,"302":1,"303":1,"328":1,"401":3,"470":2,"471":2,"472":2,"473":3}}],["interacting",{"2":{"120":1,"143":1,"150":1,"324":1,"327":1,"436":1}}],["interactions",{"0":{"145":1,"147":1,"149":1},"2":{"145":1,"147":1,"149":1,"223":1,"461":1}}],["interaction",{"2":{"74":1,"229":1,"467":1}}],["interact",{"2":{"1":1,"84":1,"92":1,"328":1,"357":1,"366":1,"439":1}}],["in",{"0":{"9":1,"15":1,"16":1,"23":1,"40":1,"41":1,"82":1,"109":1,"122":1,"134":1,"135":1,"180":1,"329":1,"440":1,"441":1},"1":{"41":1,"110":1,"111":1,"112":1,"113":1,"114":1,"123":1,"136":1,"137":1,"138":1,"139":1,"140":1,"181":1,"182":1,"183":1,"184":1,"185":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"441":1,"442":1},"2":{"0":3,"2":1,"3":5,"4":6,"8":3,"23":5,"24":3,"25":1,"26":1,"28":1,"30":2,"32":3,"33":4,"35":3,"37":4,"39":3,"41":5,"43":2,"46":1,"47":1,"49":1,"50":3,"52":1,"56":2,"57":6,"59":3,"61":3,"63":5,"64":2,"66":2,"67":1,"73":5,"74":2,"75":7,"76":1,"77":6,"79":1,"80":6,"81":2,"85":1,"93":3,"95":1,"98":2,"102":2,"107":1,"109":1,"110":2,"111":2,"112":2,"113":4,"114":3,"115":4,"117":1,"121":1,"123":1,"124":1,"126":1,"127":3,"129":4,"130":2,"131":6,"132":5,"133":1,"134":2,"135":5,"136":2,"137":2,"139":7,"141":3,"142":1,"143":2,"144":1,"146":1,"148":4,"150":6,"151":2,"153":1,"154":4,"155":3,"158":7,"160":4,"163":2,"164":3,"165":6,"167":6,"168":1,"172":2,"173":2,"175":1,"177":2,"179":5,"180":1,"181":4,"182":2,"186":1,"187":5,"189":1,"190":1,"191":3,"192":1,"194":2,"199":2,"204":2,"207":2,"208":2,"209":2,"210":1,"211":1,"216":1,"219":3,"220":3,"222":1,"223":2,"226":1,"230":1,"232":1,"233":2,"234":2,"235":1,"237":1,"238":3,"240":2,"243":1,"244":1,"252":1,"262":1,"272":1,"284":1,"287":2,"288":4,"289":7,"290":7,"292":2,"299":1,"300":1,"301":1,"302":2,"303":2,"304":2,"305":1,"307":1,"308":2,"309":1,"310":2,"312":1,"313":1,"314":1,"319":1,"320":1,"321":1,"322":1,"323":3,"324":1,"330":1,"331":1,"332":1,"335":1,"340":1,"342":1,"344":1,"347":1,"350":1,"356":1,"357":1,"358":1,"359":4,"372":1,"379":1,"381":1,"382":2,"383":1,"384":1,"385":5,"386":1,"395":1,"398":1,"401":1,"402":1,"407":1,"409":1,"410":1,"416":2,"420":1,"425":1,"429":1,"432":1,"436":1,"440":3,"441":2,"442":1,"446":1,"447":2,"454":1,"458":3,"459":3,"460":1,"461":2,"464":1,"468":1,"470":1,"471":2,"472":2,"473":1,"475":1,"476":3,"478":2}}],["ffailurecallback",{"2":{"175":1}}],["fsequenceerror",{"2":{"175":2}}],["fstoredcredentials",{"2":{"174":1}}],["fstring",{"2":{"167":4,"168":1,"169":1,"174":1,"175":2}}],["fscriptdelegate",{"2":{"167":1}}],["fcredentials",{"2":{"165":1,"167":2,"174":2}}],["fly",{"2":{"331":1}}],["flexible",{"2":{"193":1,"353":1}}],["flexibility",{"2":{"131":1}}],["flagged",{"2":{"410":1}}],["flag",{"2":{"174":1,"202":1}}],["floating",{"2":{"143":1}}],["flows",{"2":{"445":1}}],["flow",{"2":{"135":1,"216":1}}],["fmt",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1}}],["feb",{"2":{"426":1}}],["feehistoryresult",{"2":{"312":2}}],["feehistory",{"0":{"312":1},"2":{"312":2}}],["fee",{"2":{"66":1,"67":1,"317":1}}],["feeoption",{"2":{"66":1,"72":1}}],["fees",{"2":{"66":3,"72":1,"312":1,"353":1}}],["feel",{"2":{"50":1,"125":1,"131":1,"133":1,"155":1,"190":1,"243":1}}],["few",{"2":{"35":1,"96":1,"130":1,"156":1,"158":1,"173":1,"179":1,"245":1,"373":1}}],["fetching",{"2":{"23":1,"55":1,"155":1}}],["fetches",{"0":{"23":1},"2":{"37":1,"41":1}}],["fetch",{"0":{"11":1,"24":1,"32":1,"37":1,"39":1,"41":1,"43":1,"56":1},"2":{"7":2,"23":1,"35":4,"42":1,"52":2,"54":4,"55":1,"56":1,"57":1,"58":2,"80":1,"385":3}}],["feature",{"2":{"6":1,"117":1,"287":1,"289":2,"333":1}}],["features",{"0":{"96":1,"245":1,"373":1},"2":{"1":1,"8":1,"33":1,"126":1,"130":1,"160":1,"240":2,"478":2}}],["fashion",{"2":{"420":1}}],["fast",{"2":{"1":1,"2":1,"8":1,"33":1,"45":1,"49":1}}],["fauthenticatorconfig",{"2":{"177":1}}],["familiar",{"2":{"97":1,"150":1,"193":1,"246":1,"355":1,"374":1}}],["facet",{"2":{"356":1}}],["facebook",{"2":{"96":1,"113":1,"124":1,"135":1,"207":1,"245":1,"373":1,"440":1,"447":1}}],["facilitate",{"2":{"116":1}}],["factual",{"2":{"395":1,"401":1,"416":1}}],["factory",{"2":{"394":1,"395":2,"396":1,"397":1,"401":1,"408":2,"424":1,"438":1}}],["fact",{"2":{"33":1,"61":1,"93":1,"238":1,"380":1,"476":1}}],["fall",{"2":{"62":1}}],["false",{"0":{"409":1},"2":{"23":1,"24":1,"37":1,"41":1,"194":2,"213":1,"385":1,"408":2,"414":1,"442":1,"443":1,"448":1,"449":2,"450":1,"452":1,"455":1}}],["fate",{"2":{"62":1}}],["fatal",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1}}],["failing",{"2":{"455":1}}],["fails",{"2":{"179":1,"299":1,"300":1,"410":1,"455":2}}],["failedtransactionresponse",{"2":{"455":1}}],["failedtransactionreturn",{"2":{"142":1}}],["failed",{"0":{"455":1},"2":{"453":2,"454":1}}],["failedcontractdeploymentreturn",{"2":{"154":1}}],["failure",{"2":{"132":1,"164":1,"322":1}}],["failures",{"2":{"33":1}}],["fail",{"2":{"6":1,"151":1,"179":1,"290":1,"299":1,"300":1}}],["friendlyname",{"2":{"443":2}}],["freshly",{"2":{"338":1}}],["frequent",{"2":{"223":1,"461":1}}],["free",{"2":{"5":1,"8":1,"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1,"50":2,"125":1,"133":1,"155":1,"243":1}}],["framework",{"2":{"160":1,"190":1}}],["from",{"0":{"152":1,"221":1},"2":{"0":1,"1":1,"3":1,"4":1,"6":1,"7":2,"11":1,"23":4,"24":1,"26":1,"27":3,"30":2,"32":1,"33":6,"35":1,"37":1,"39":1,"41":1,"43":2,"46":3,"54":2,"56":2,"57":4,"59":1,"61":1,"66":3,"72":2,"73":2,"74":1,"75":1,"77":5,"80":5,"81":1,"83":1,"84":2,"85":5,"92":1,"100":6,"101":8,"102":3,"103":1,"115":1,"117":1,"118":1,"124":1,"125":1,"129":3,"134":1,"139":1,"141":1,"142":2,"144":1,"148":1,"150":2,"152":1,"153":2,"154":3,"163":1,"165":1,"167":1,"168":4,"174":2,"179":1,"181":1,"193":1,"194":2,"213":1,"216":4,"219":3,"220":5,"223":2,"225":2,"231":1,"233":2,"234":2,"235":2,"240":2,"249":1,"259":2,"269":1,"277":1,"278":3,"288":2,"289":1,"301":1,"302":1,"308":1,"323":1,"325":1,"328":1,"330":1,"331":1,"332":1,"339":1,"356":1,"357":1,"358":2,"359":1,"366":1,"376":1,"377":1,"380":1,"382":1,"383":1,"385":1,"396":1,"399":1,"400":1,"407":1,"419":1,"420":2,"440":1,"441":2,"442":10,"443":1,"444":2,"452":1,"454":1,"455":1,"458":3,"459":5,"461":2,"463":2,"469":1,"471":2,"472":2,"473":2,"478":2}}],["frontend",{"2":{"8":1,"359":2}}],["front",{"2":{"0":1}}],["fiat",{"0":{"347":1,"379":1}}],["fixedbyte",{"2":{"324":1}}],["fixed",{"2":{"324":1,"401":1}}],["fixing",{"2":{"287":1}}],["fit",{"2":{"131":2,"187":1,"291":1}}],["fields",{"2":{"63":2,"123":1,"454":1}}],["field",{"2":{"61":1,"63":2,"120":1,"121":1,"124":1,"136":1,"137":1,"177":1}}],["fill",{"2":{"132":1,"340":1}}],["filter",{"2":{"37":6,"39":5,"41":1,"139":9,"182":1,"385":1}}],["files",{"0":{"333":1},"2":{"130":2,"331":1,"332":3,"333":1,"334":1,"338":1}}],["file",{"2":{"4":1,"82":1,"131":1,"139":2,"163":1,"177":1,"179":2,"331":1,"332":1,"340":1,"442":1}}],["firm",{"2":{"148":1}}],["fires",{"2":{"174":1}}],["fired",{"2":{"167":1,"181":1}}],["fire",{"2":{"8":1,"168":2,"169":1}}],["first",{"0":{"408":1},"1":{"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1},"2":{"3":1,"50":1,"75":1,"77":2,"84":1,"124":1,"127":1,"139":1,"145":1,"147":1,"149":1,"154":1,"179":1,"194":1,"331":2,"381":1,"408":1,"413":2}}],["finishvalidatesession",{"2":{"449":2}}],["finishes",{"2":{"413":2}}],["finished",{"2":{"179":1,"216":1}}],["finalizeauth",{"2":{"441":1}}],["finalize",{"0":{"341":1}}],["finally",{"2":{"4":1,"63":1,"64":1,"76":1,"79":1,"84":1,"85":1,"168":1,"340":1}}],["fingerprints",{"2":{"177":1}}],["fine",{"2":{"63":1}}],["findobjectoftype",{"2":{"133":1}}],["finding",{"2":{"130":1}}],["findsupportednetwork",{"2":{"80":2,"85":4}}],["find",{"2":{"4":1,"26":1,"66":5,"72":1,"77":1,"165":1,"219":1,"415":1,"416":1,"458":1}}],["fom",{"2":{"385":1}}],["focused",{"2":{"190":1,"191":1}}],["focus",{"2":{"187":1,"190":1,"338":1}}],["fonts",{"2":{"187":1}}],["folder",{"0":{"334":1},"2":{"75":2,"76":1,"129":2,"130":2,"132":4,"165":7,"179":2,"287":3,"289":2,"333":4,"334":2,"339":1,"340":1}}],["follows",{"2":{"85":1,"126":1,"160":1,"216":1,"419":1,"434":1,"435":1,"436":1,"437":2}}],["following",{"2":{"4":1,"7":1,"66":1,"67":1,"72":1,"74":2,"77":2,"78":1,"82":1,"85":1,"139":1,"141":1,"158":1,"163":1,"172":1,"173":1,"176":1,"177":1,"178":1,"179":2,"220":1,"248":1,"254":1,"265":1,"330":1,"359":1,"413":1,"430":1,"436":1,"438":1,"439":1,"459":1}}],["follow",{"2":{"2":1,"26":1,"53":1,"67":1,"75":1,"77":1,"79":1,"83":1,"100":1,"117":1,"206":1,"386":1}}],["found",{"2":{"66":9,"130":1,"132":1,"155":2,"163":1,"165":1,"230":1,"288":1,"289":2,"303":1,"468":1}}],["force",{"2":{"202":1}}],["forward",{"2":{"165":2,"169":1}}],["forwarder",{"2":{"165":1}}],["formerly",{"2":{"425":1}}],["forms",{"2":{"348":1}}],["form",{"2":{"143":1,"155":1,"349":1}}],["formats",{"2":{"55":1,"59":1}}],["format",{"2":{"52":1,"59":1,"61":1,"63":2,"134":1,"143":1,"144":2,"150":4,"301":2,"304":2,"305":1,"307":1,"308":1,"309":1,"310":2,"312":1,"313":1,"314":1,"342":1}}],["forum",{"2":{"139":1}}],["foreach",{"2":{"100":1,"101":1}}],["forget",{"2":{"8":1,"158":1}}],["for",{"0":{"37":1,"39":1,"56":1,"77":1,"218":1,"240":1,"451":1,"457":1,"478":1},"1":{"78":1,"79":1},"2":{"0":1,"2":1,"3":1,"4":4,"5":1,"6":2,"8":4,"23":4,"24":2,"26":3,"27":3,"28":3,"30":1,"32":1,"33":2,"35":2,"37":4,"39":2,"41":3,"42":3,"43":2,"45":1,"49":4,"50":3,"51":3,"53":1,"55":5,"56":1,"57":3,"59":1,"61":5,"62":2,"63":1,"65":1,"66":7,"67":2,"72":3,"73":4,"74":1,"75":1,"77":1,"78":1,"80":1,"81":2,"85":1,"90":2,"93":1,"94":2,"95":1,"99":2,"100":3,"104":1,"107":2,"113":1,"114":1,"120":1,"123":3,"126":2,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"139":2,"141":1,"142":3,"143":2,"145":3,"147":3,"148":1,"149":3,"150":1,"151":2,"153":2,"154":2,"155":2,"160":1,"165":2,"167":2,"172":2,"176":1,"177":2,"178":1,"181":2,"182":3,"183":1,"186":1,"187":4,"188":3,"190":5,"191":3,"192":1,"193":4,"194":1,"197":1,"198":1,"199":1,"201":1,"212":1,"214":1,"216":2,"219":1,"220":3,"223":3,"237":1,"238":1,"239":2,"240":2,"241":2,"243":4,"244":1,"253":2,"255":2,"256":4,"262":1,"263":2,"264":2,"266":5,"274":1,"282":1,"285":1,"287":4,"289":1,"290":2,"293":1,"295":1,"296":1,"298":1,"300":1,"302":1,"303":1,"304":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"317":1,"320":1,"321":2,"322":2,"323":1,"324":2,"327":2,"328":3,"330":2,"331":1,"332":2,"333":1,"338":2,"339":2,"340":1,"342":1,"352":1,"355":1,"358":1,"364":2,"372":1,"380":1,"381":3,"384":2,"385":5,"388":1,"393":1,"395":1,"401":1,"407":3,"413":2,"415":1,"416":1,"419":1,"420":1,"421":1,"430":3,"435":2,"437":1,"440":1,"441":1,"443":1,"446":1,"448":2,"451":2,"452":1,"454":1,"458":1,"459":3,"461":3,"475":1,"476":1,"477":2,"478":2}}],["future",{"2":{"66":1}}],["fungible",{"2":{"144":1,"146":1,"148":1}}],["funding",{"2":{"212":1,"213":1}}],["funds",{"2":{"194":1,"398":1,"412":1}}],["fund",{"2":{"67":1}}],["funded",{"2":{"66":1}}],["func",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1}}],["functionnameasstring",{"2":{"150":2,"151":1}}],["functions",{"0":{"323":1},"2":{"142":1,"145":1,"147":1,"149":1,"154":1,"172":1,"228":1,"241":1,"255":1,"264":1,"466":1}}],["function",{"2":{"7":3,"66":1,"72":1,"80":1,"85":1,"100":1,"101":1,"123":1,"124":1,"141":1,"143":1,"150":5,"153":1,"164":2,"165":2,"219":1,"232":2,"233":2,"234":2,"235":3,"240":1,"289":1,"322":3,"323":1,"398":1,"402":2,"406":1,"408":1,"421":1,"437":4,"438":1,"442":5,"443":1,"458":1,"470":2,"471":2,"472":2,"473":3,"478":1}}],["functionality",{"2":{"152":1,"173":1,"216":1,"232":1,"233":1,"234":1,"243":1,"348":1,"352":1,"409":1,"470":1,"471":1,"472":1}}],["functional",{"2":{"1":1,"355":1,"442":1}}],["fur",{"2":{"61":1}}],["further",{"2":{"0":1,"194":1}}],["full",{"2":{"26":1,"34":1,"50":1,"53":1,"62":1,"73":1,"85":1,"113":1,"114":1,"126":1,"160":1,"202":1,"214":1,"288":1,"289":1,"454":1,"455":1}}],["fully",{"2":{"1":1,"152":1,"284":1,"322":1,"355":1,"436":1}}],["wyre",{"2":{"379":1}}],["w3c",{"2":{"193":1}}],["won",{"2":{"357":1}}],["wooden",{"2":{"339":1}}],["wouldn",{"2":{"359":1}}],["would",{"2":{"80":1,"85":1,"150":1,"154":1,"194":1,"251":1,"261":1,"323":1,"325":1,"383":1,"384":1}}],["world",{"2":{"75":1,"76":1,"95":1,"244":1,"372":1,"419":1}}],["worried",{"2":{"65":1,"74":1}}],["workflow",{"2":{"219":1,"458":1}}],["working",{"2":{"77":1,"141":1,"142":1,"153":1,"154":1,"288":1,"290":1,"291":1,"301":1}}],["works",{"0":{"156":1,"181":1},"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1,"43":1,"56":1,"57":2,"133":2,"150":1,"193":1,"194":3,"206":1,"237":1,"376":1,"377":1,"385":1,"436":1,"475":1}}],["workers",{"0":{"19":1},"2":{"76":1,"83":1,"84":1}}],["worker",{"2":{"11":1,"74":1,"75":1,"80":1,"83":1,"84":1}}],["work",{"2":{"4":1,"30":1,"50":1,"125":1,"127":1,"131":1,"132":1,"135":1,"155":1,"180":1,"193":4,"243":2,"304":1,"340":1,"441":1}}],["wrapping",{"2":{"174":1,"290":2}}],["wrappers",{"2":{"123":1,"131":1,"327":3}}],["wrapper",{"0":{"100":1,"101":1},"2":{"100":2,"101":1,"105":1,"145":1,"147":1,"149":1,"152":1,"154":1,"289":6,"327":1,"328":1}}],["wrap",{"2":{"100":1,"289":2}}],["wrangler=",{"2":{"75":1}}],["wrangler",{"0":{"75":1,"82":1},"1":{"76":1},"2":{"74":2,"75":8,"76":1,"81":1,"82":1,"83":1}}],["writing",{"2":{"175":1}}],["written",{"2":{"93":1,"191":1,"220":1,"237":1,"238":1,"240":1,"459":1,"475":1,"476":1,"478":1}}],["write",{"0":{"142":1},"1":{"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1},"2":{"3":2,"77":2,"131":1,"142":1,"338":1,"339":1,"341":1}}],["wrong",{"2":{"80":2,"213":2}}],["w",{"2":{"66":2}}],["wuelppex0pttvjabl8biuxpaaaaaaaaaa",{"2":{"57":2}}],["www",{"2":{"50":1,"62":1}}],["why",{"0":{"287":1,"348":1},"1":{"349":1,"350":1,"351":1,"352":1,"353":1,"354":1}}],["whose",{"2":{"385":1}}],["who",{"2":{"193":1,"359":1,"429":1,"447":1}}],["whole",{"2":{"143":1,"151":1,"299":1,"300":1,"410":1,"436":1,"437":1}}],["whistles",{"2":{"290":1}}],["white",{"2":{"186":1,"187":3,"188":1}}],["whitespace",{"2":{"150":1}}],["while",{"2":{"126":1,"154":1,"159":1,"160":1,"187":3,"193":1,"204":1,"216":1,"219":1,"223":1,"287":1,"290":1,"299":1,"300":1,"322":1,"355":1,"357":1,"377":1,"384":1,"408":1,"438":1,"458":1,"461":1}}],["which",{"2":{"4":1,"8":2,"23":1,"24":1,"30":3,"37":1,"41":1,"61":2,"62":2,"66":1,"73":1,"76":1,"77":1,"78":1,"94":1,"113":1,"114":1,"115":1,"142":1,"152":1,"153":1,"154":2,"158":2,"165":1,"169":1,"172":1,"189":1,"191":1,"193":1,"196":1,"214":1,"216":1,"219":2,"232":1,"233":1,"234":1,"237":1,"239":1,"241":1,"254":1,"255":2,"264":2,"265":1,"266":2,"272":1,"288":1,"289":4,"295":1,"299":1,"300":1,"321":1,"323":1,"328":1,"347":2,"348":1,"356":1,"377":1,"379":2,"399":1,"402":1,"407":1,"415":1,"435":1,"438":1,"458":2,"470":1,"471":1,"472":1,"475":1,"477":1}}],["whatever",{"2":{"169":1}}],["what",{"0":{"187":1,"190":1,"191":1},"2":{"35":2,"77":1,"289":1,"338":1,"352":1,"358":1,"409":1}}],["whether",{"2":{"112":1,"204":1,"213":1,"255":1,"264":1,"421":1,"447":1,"450":1}}],["where",{"2":{"52":1,"61":1,"77":1,"141":1,"143":1,"150":1,"154":1,"167":1,"172":1,"174":2,"175":2,"190":1,"206":1,"222":1,"240":1,"290":1,"324":1,"338":1,"433":1,"460":1,"478":1}}],["whereby",{"2":{"8":1}}],["whenever",{"2":{"328":1,"439":1}}],["when",{"0":{"287":1},"2":{"30":1,"57":1,"61":1,"62":1,"84":1,"124":1,"127":1,"130":2,"131":1,"132":1,"133":1,"142":1,"143":1,"145":1,"147":1,"149":1,"150":2,"151":1,"153":1,"154":1,"168":1,"174":1,"179":1,"180":1,"181":1,"194":2,"195":1,"206":1,"211":1,"219":1,"255":1,"264":1,"281":1,"288":1,"289":2,"290":4,"291":1,"304":1,"322":2,"323":1,"324":1,"327":1,"358":1,"381":1,"385":1,"408":1,"413":2,"421":1,"442":2,"447":1,"450":2,"452":1,"458":1}}],["warning",{"2":{"398":1,"413":1}}],["wagmiclient",{"2":{"289":2}}],["wagmiconfig",{"2":{"100":3,"101":4,"117":2,"124":3,"249":1,"289":2}}],["wagmiwrapper",{"2":{"289":6}}],["wagmiprovider",{"2":{"100":1,"101":1,"289":1}}],["wagmi",{"0":{"247":1,"254":1,"265":1},"1":{"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1},"2":{"95":1,"99":4,"100":5,"101":2,"102":2,"113":1,"114":1,"123":3,"124":1,"243":1,"244":1,"247":3,"248":5,"249":2,"254":4,"255":3,"256":5,"264":5,"265":4,"266":4,"287":2,"288":5,"289":4,"372":1}}],["waitfortransactionreceipt",{"0":{"320":1},"2":{"320":1}}],["waits",{"2":{"298":1,"300":1}}],["wait",{"2":{"73":1,"179":1,"288":2,"320":1,"323":1}}],["wants",{"2":{"383":1}}],["want",{"2":{"67":1,"73":1,"85":1,"130":1,"131":1,"141":1,"145":1,"147":1,"149":1,"150":3,"167":1,"179":1,"187":1,"191":1,"193":1,"204":1,"219":1,"231":1,"243":1,"304":2,"323":3,"326":1,"338":1,"342":1,"458":1,"469":1}}],["was",{"2":{"66":2,"72":1,"130":2,"384":1,"385":2,"421":1,"425":1,"454":2}}],["waasadapter",{"2":{"294":1}}],["waastowalletadapter",{"2":{"294":3,"299":2,"300":2}}],["waastenantkey",{"2":{"163":1}}],["waaswallet",{"2":{"141":4,"142":5,"143":1,"153":4,"154":9,"155":1,"294":3}}],["waaslogin",{"2":{"141":1}}],["waasconfigkey",{"2":{"92":1,"366":1,"440":1,"441":1,"442":1,"443":1,"444":1,"454":1,"455":1}}],["waas",{"0":{"12":1,"141":1},"2":{"90":1,"92":4,"130":1,"132":2,"133":1,"134":1,"141":2,"142":1,"143":1,"144":1,"145":3,"146":1,"147":3,"148":1,"149":3,"150":2,"151":1,"163":1,"364":1,"366":4,"439":1,"440":6,"441":6,"442":5,"443":5,"444":6,"448":1,"449":2,"450":1,"451":2,"452":1,"454":5,"455":5}}],["walletinterface",{"2":{"408":2}}],["walletcontext",{"2":{"424":1}}],["walletcontractbytecode",{"2":{"395":1}}],["walletconnectprojectid",{"2":{"100":1,"101":1}}],["walletconnect",{"0":{"216":1},"2":{"96":1,"193":1,"214":1,"216":4,"245":1,"373":1}}],["walletproxybytecode",{"2":{"395":1}}],["walletpanel",{"2":{"155":1}}],["walletauthoptions",{"0":{"114":1},"2":{"124":2}}],["walletaddress",{"2":{"80":2,"442":2}}],["wallets",{"0":{"183":1,"189":1,"244":1,"292":1,"348":1,"352":1,"372":1,"381":1},"1":{"190":1,"191":1,"192":1,"245":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"349":1,"350":1,"351":1,"352":1,"353":2,"354":1,"373":1,"382":1,"383":1,"384":1},"2":{"66":3,"94":1,"95":1,"96":1,"100":1,"113":1,"114":1,"122":1,"180":1,"183":1,"185":1,"191":1,"192":3,"193":1,"239":1,"243":1,"244":1,"245":1,"251":1,"259":2,"261":1,"269":1,"294":1,"348":2,"352":3,"355":3,"356":1,"357":1,"358":1,"359":5,"372":1,"373":1,"384":1,"392":1,"396":2,"397":1,"398":1,"401":1,"407":1,"408":1,"416":1,"418":1,"429":1,"432":1,"433":1,"436":2,"438":2,"477":1}}],["walleteoa",{"2":{"66":4,"72":2,"77":2,"85":2}}],["wallet",{"0":{"11":1,"23":1,"36":1,"37":1,"85":1,"101":1,"103":1,"155":1,"193":1,"195":1,"215":1,"218":1,"219":1,"220":1,"222":1,"225":1,"243":1,"287":1,"288":1,"289":1,"355":1,"376":1,"377":1,"378":1,"387":1,"394":1,"395":1,"396":1,"397":1,"401":1,"411":1,"416":1,"424":1,"429":1,"457":1,"458":1,"459":1,"460":1,"463":1},"1":{"37":1,"156":1,"157":1,"158":1,"159":1,"194":1,"195":1,"196":2,"197":2,"198":2,"199":2,"200":2,"201":2,"202":2,"203":2,"204":2,"205":2,"206":2,"207":2,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":1,"215":1,"216":1,"356":1,"357":1,"358":1,"359":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":2,"397":1,"398":2,"399":2,"400":2,"401":1,"402":2,"403":2,"404":2,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1},"2":{"23":2,"24":1,"32":2,"33":2,"35":3,"37":4,"65":1,"66":17,"67":1,"72":3,"73":1,"74":1,"77":12,"80":3,"81":1,"83":2,"84":3,"85":2,"87":1,"88":1,"90":2,"91":3,"92":2,"96":3,"98":1,"99":3,"100":1,"101":4,"103":3,"114":3,"115":1,"126":2,"133":3,"141":2,"142":3,"143":2,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":2,"151":3,"153":3,"154":4,"155":2,"160":2,"183":1,"189":3,"190":3,"191":4,"193":12,"194":19,"195":2,"196":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":3,"204":2,"205":2,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"216":2,"218":3,"219":6,"220":1,"222":1,"223":5,"225":6,"226":1,"227":1,"228":3,"229":1,"231":2,"232":3,"233":3,"234":3,"235":2,"240":1,"241":1,"243":2,"245":3,"247":2,"257":2,"262":1,"267":2,"271":1,"280":1,"281":1,"283":2,"284":3,"285":1,"287":3,"289":2,"292":1,"293":2,"296":2,"297":1,"298":1,"299":5,"300":5,"301":3,"304":3,"314":2,"321":2,"323":6,"326":1,"327":3,"340":1,"347":2,"348":1,"349":1,"355":5,"356":1,"357":2,"361":1,"362":1,"364":2,"365":3,"366":2,"368":1,"373":3,"377":2,"379":2,"380":8,"381":3,"384":1,"387":1,"389":1,"392":2,"394":4,"395":5,"396":1,"397":1,"398":3,"399":3,"400":5,"401":3,"402":3,"403":1,"404":1,"405":1,"406":2,"407":6,"408":6,"409":1,"410":2,"411":2,"413":3,"414":2,"415":3,"416":5,"419":6,"420":7,"421":2,"425":3,"429":3,"430":2,"432":2,"434":1,"436":2,"438":5,"439":1,"440":1,"441":1,"445":1,"455":3,"457":3,"458":6,"459":1,"460":1,"461":5,"463":6,"464":1,"465":1,"466":3,"467":1,"469":2,"470":3,"471":3,"472":3,"473":2,"478":1}}],["walk",{"2":{"4":1,"98":1,"122":1,"188":1}}],["ways",{"2":{"193":1,"358":1}}],["way",{"2":{"1":1,"66":3,"73":1,"125":1,"158":2,"223":1,"357":1,"401":1,"408":1,"436":2,"461":1}}],["width=",{"2":{"442":1}}],["width",{"2":{"172":1}}],["wip",{"2":{"167":2,"170":1}}],["wish",{"2":{"130":1,"142":1,"150":1,"153":1,"154":1,"165":2,"174":1,"325":1,"328":1,"447":1}}],["windows",{"2":{"137":2,"167":2,"176":1}}],["window",{"0":{"82":1},"2":{"82":1,"129":2,"131":2,"136":1,"137":1,"139":1,"194":1,"203":1}}],["will",{"2":{"3":3,"4":4,"8":2,"23":2,"30":4,"50":1,"61":1,"62":2,"63":1,"65":1,"66":9,"72":2,"74":1,"75":1,"77":2,"91":1,"96":1,"98":1,"101":1,"102":1,"112":1,"113":2,"114":2,"115":2,"122":1,"126":3,"129":3,"130":2,"131":5,"132":4,"133":2,"134":1,"141":1,"143":1,"150":1,"151":1,"152":1,"155":2,"160":3,"163":1,"164":2,"165":1,"168":2,"169":1,"172":4,"177":1,"179":1,"182":3,"190":1,"192":1,"193":3,"194":2,"196":1,"198":1,"200":1,"202":1,"203":1,"204":2,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"213":1,"216":1,"219":3,"231":1,"243":1,"245":1,"252":1,"253":1,"262":1,"263":1,"271":1,"272":1,"280":1,"281":1,"287":1,"288":1,"289":2,"293":1,"299":4,"300":4,"302":1,"303":1,"304":2,"321":2,"322":3,"323":1,"324":1,"334":1,"336":1,"339":4,"340":2,"347":2,"358":3,"365":1,"373":1,"377":1,"379":2,"384":2,"398":1,"399":1,"407":2,"410":1,"413":1,"419":2,"420":2,"421":1,"435":1,"436":1,"438":1,"441":3,"449":1,"453":1,"454":1,"455":4,"458":3,"469":1}}],["without",{"2":{"33":1,"65":1,"67":1,"72":1,"73":2,"74":1,"130":1,"142":1,"151":1,"153":1,"154":1,"193":1,"194":2,"222":1,"223":1,"229":2,"290":1,"407":1,"414":1,"453":1,"460":1,"461":1,"467":2}}],["within",{"2":{"4":1,"96":1,"100":1,"130":2,"142":1,"153":1,"154":1,"165":1,"179":1,"190":1,"193":1,"245":1,"352":1,"358":1,"373":1,"435":1,"436":1,"449":1}}],["with",{"0":{"12":1,"67":1,"75":1,"77":1,"98":1,"141":1,"194":1,"214":1,"215":1,"217":1,"221":1,"224":1,"229":1,"236":1,"287":1,"288":1,"289":1,"456":1,"462":1,"467":1,"474":1},"1":{"68":1,"69":1,"70":1,"71":1,"72":1,"76":1,"78":1,"79":1,"99":1,"218":1,"219":1,"220":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"237":1,"238":1,"239":1,"240":1,"457":1,"458":1,"459":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"475":1,"476":1,"477":1,"478":1},"2":{"0":2,"1":1,"4":2,"5":1,"6":1,"7":2,"8":2,"11":1,"22":1,"23":1,"25":1,"26":4,"30":4,"31":1,"33":3,"36":1,"38":1,"40":1,"43":1,"49":1,"51":1,"53":1,"56":1,"57":3,"59":1,"65":1,"66":2,"67":2,"73":1,"74":4,"75":2,"77":3,"78":1,"80":1,"83":1,"84":5,"85":1,"88":1,"90":1,"91":1,"92":1,"93":1,"95":2,"96":3,"97":1,"99":1,"100":1,"107":1,"120":2,"122":1,"123":1,"125":1,"126":1,"129":3,"130":4,"131":2,"132":3,"133":4,"134":2,"135":1,"139":4,"141":5,"142":3,"143":2,"145":5,"147":5,"149":5,"150":4,"153":2,"154":3,"158":2,"159":1,"160":1,"167":2,"168":2,"169":3,"172":2,"175":1,"181":1,"185":1,"187":2,"188":1,"190":4,"191":2,"192":1,"193":4,"194":1,"195":1,"205":1,"207":2,"208":2,"219":2,"220":2,"223":1,"227":1,"232":1,"233":1,"234":1,"238":1,"240":2,"241":1,"243":4,"244":2,"245":3,"246":1,"247":2,"248":1,"255":4,"256":2,"257":1,"264":4,"266":2,"267":1,"274":1,"283":2,"284":2,"287":2,"288":2,"289":6,"290":2,"291":1,"294":2,"301":1,"303":1,"304":1,"305":1,"323":1,"324":1,"327":2,"328":2,"330":1,"332":1,"339":1,"341":1,"342":1,"345":1,"347":1,"355":2,"357":2,"358":3,"359":2,"362":1,"364":1,"365":1,"366":1,"369":1,"370":1,"372":2,"373":3,"374":1,"376":1,"377":1,"379":1,"380":1,"381":3,"382":1,"385":2,"386":1,"387":1,"388":1,"389":1,"391":1,"398":1,"419":1,"421":2,"425":1,"432":1,"436":1,"438":1,"439":1,"440":2,"441":3,"442":1,"444":1,"445":1,"446":1,"449":2,"458":2,"459":2,"461":1,"465":1,"470":1,"471":1,"472":1,"476":1,"478":2}}],["weight",{"2":{"388":2,"389":2,"390":4,"391":4,"393":4,"407":1,"430":1,"434":3,"435":3,"436":10,"437":2}}],["weights",{"2":{"387":1,"402":1,"406":1,"430":1,"431":1,"433":1}}],["weighted",{"2":{"62":1}}],["weeds",{"2":{"304":1}}],["week",{"2":{"199":1}}],["were",{"2":{"223":1,"324":1,"359":1,"461":1}}],["went",{"2":{"80":2}}],["weth",{"2":{"66":1}}],["websocketprovider",{"2":{"289":1}}],["websocketpublicclient",{"2":{"249":1}}],["web2",{"2":{"191":2,"193":1}}],["webgl",{"0":{"140":1},"2":{"127":1,"135":1}}],["web",{"0":{"20":1,"21":1,"27":1,"46":1,"376":1},"2":{"26":1,"51":1,"53":1,"169":1,"177":3,"187":2,"193":3,"357":1,"376":1,"377":1}}],["webapps",{"2":{"25":1}}],["webapp",{"2":{"11":1,"23":1,"24":1,"26":1,"32":1,"37":1,"39":1,"41":1,"43":1,"50":2,"56":1,"57":2,"62":1,"385":1}}],["web3modal",{"0":{"283":1},"1":{"284":1,"285":1},"2":{"194":1,"214":1,"243":1,"283":3,"284":1,"285":2}}],["web3",{"0":{"214":1,"244":1,"267":1,"274":1,"372":1},"1":{"245":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"373":1},"2":{"0":1,"33":2,"82":1,"95":2,"96":2,"100":1,"114":1,"190":1,"191":1,"193":6,"241":1,"243":3,"244":2,"245":2,"267":3,"268":2,"269":1,"273":1,"274":3,"275":1,"277":2,"278":1,"282":1,"336":1,"372":2,"373":2,"377":1}}],["we",{"2":{"0":1,"26":1,"27":1,"30":2,"39":2,"41":2,"46":1,"49":2,"51":2,"53":1,"59":2,"61":1,"63":2,"64":1,"67":1,"80":4,"85":1,"90":1,"98":1,"126":1,"130":3,"131":3,"132":1,"133":2,"135":2,"141":1,"145":1,"147":1,"148":1,"149":1,"150":2,"152":1,"154":2,"155":2,"157":1,"158":2,"159":2,"160":1,"167":1,"173":1,"175":3,"188":1,"189":1,"190":1,"191":1,"193":1,"219":1,"288":2,"289":3,"290":1,"303":1,"323":2,"325":2,"327":1,"328":2,"357":1,"364":1,"384":1,"447":3,"458":1}}],["well",{"2":{"0":1,"26":1,"49":1,"50":1,"53":1,"59":1,"80":1,"150":1,"177":1,"186":1,"187":1,"190":1,"231":1,"240":1,"323":2,"325":2,"328":1,"384":1,"419":1,"420":1,"469":1,"478":1}}],["turn",{"2":{"289":1}}],["turned",{"2":{"287":1}}],["tfunction",{"2":{"175":2}}],["tfunctions",{"2":{"175":2}}],["typically",{"2":{"142":1,"219":1,"223":1,"458":1,"461":1}}],["typical",{"2":{"142":1}}],["typeddata",{"2":{"420":2}}],["typed",{"2":{"420":1}}],["typedefault",{"2":{"115":1}}],["typedefaultbooleantrue",{"2":{"112":1}}],["typedefaultstringundefined",{"2":{"110":1,"111":1}}],["typedefaultstringcenter",{"2":{"108":1}}],["typedefaultstring",{"2":{"107":1,"113":1,"114":1}}],["typescript",{"2":{"26":2,"53":1,"75":1,"90":2,"190":2,"191":1,"220":1,"237":1,"364":2,"459":1,"475":1}}],["types",{"2":{"4":1,"142":1,"322":1,"433":1}}],["type",{"0":{"324":1},"2":{"4":1,"23":2,"24":2,"32":2,"37":2,"39":2,"41":2,"43":2,"50":2,"56":2,"57":4,"61":8,"62":2,"63":2,"80":2,"83":1,"84":1,"151":2,"167":1,"172":1,"174":1,"194":1,"325":1,"346":1,"385":3,"420":3,"454":1,"455":1}}],["tmp",{"2":{"129":1,"131":1,"393":4}}],["twitter",{"2":{"440":1}}],["twitch",{"2":{"113":1,"207":1}}],["two",{"2":{"91":1,"133":1,"232":1,"233":1,"234":1,"304":1,"338":1,"348":1,"358":1,"365":1,"381":2,"425":1,"445":1,"470":1,"471":1,"472":1}}],["tweaking",{"2":{"50":1}}],["tsx",{"2":{"289":1,"442":1}}],["tsuccesscallback",{"2":{"175":1}}],["ts",{"2":{"80":1,"442":1,"455":1}}],["txhash",{"2":{"454":2}}],["tx",{"2":{"450":1,"452":1,"454":3,"455":4}}],["txs",{"2":{"66":1,"72":1}}],["txns",{"2":{"73":1}}],["txn2",{"2":{"73":2}}],["txn1",{"2":{"73":2}}],["txnreceipt",{"2":{"66":4,"72":2}}],["txnresponse",{"2":{"66":2,"72":1,"231":2,"232":4,"233":4,"234":4,"469":2,"470":4,"471":4,"472":4}}],["txn",{"2":{"66":2,"72":2,"85":2}}],["tx5drvi",{"2":{"50":1}}],["tnqwlujz",{"2":{"50":1}}],["times",{"2":{"62":1,"75":1,"158":1}}],["time",{"0":{"340":1,"446":1},"2":{"30":2,"33":1,"50":1,"74":1,"85":1,"126":1,"158":1,"160":1,"181":2,"182":1,"183":1,"187":1,"219":1,"222":1,"223":1,"323":1,"325":1,"340":1,"359":1,"381":1,"385":1,"392":1,"397":1,"413":1,"441":1,"446":1,"447":1,"458":1,"460":1,"461":1}}],["timezones",{"2":{"0":1}}],["tips",{"0":{"30":1},"2":{"384":1}}],["tip",{"2":{"23":1,"42":1,"49":1,"55":1,"194":1,"247":1,"257":1,"267":1,"283":1}}],["t",{"2":{"8":1,"92":1,"124":1,"127":1,"129":1,"131":2,"139":2,"150":1,"158":2,"159":1,"172":2,"180":1,"216":1,"235":1,"323":1,"325":3,"357":2,"359":1,"366":1,"392":1,"394":1,"396":1,"401":1,"407":1,"408":1,"412":1,"413":1,"416":1,"439":1,"440":1,"447":1,"473":1}}],["tries",{"2":{"450":1}}],["triggered",{"2":{"120":1,"194":1,"450":3,"451":2,"452":1}}],["triggertransaction",{"2":{"120":1}}],["triggercheckout",{"2":{"118":2}}],["triggering",{"0":{"102":1},"2":{"98":1}}],["trigger",{"0":{"449":1},"1":{"450":1},"2":{"66":1,"449":1}}],["triggers",{"2":{"66":1}}],["trees",{"2":{"435":1}}],["tree",{"0":{"433":1},"1":{"434":1,"435":1,"436":1},"2":{"430":1,"433":3,"435":1,"436":3,"437":4}}],["trust",{"2":{"220":1,"351":1,"357":1,"459":1}}],["trusted",{"2":{"80":1,"446":1,"447":1,"448":1}}],["true",{"0":{"410":1},"2":{"23":3,"24":3,"28":2,"30":2,"32":1,"37":3,"39":2,"41":3,"42":1,"55":1,"82":1,"85":2,"102":1,"103":1,"139":3,"194":1,"200":1,"202":1,"203":1,"204":1,"213":1,"219":2,"249":1,"287":1,"289":1,"346":1,"385":1,"408":2,"413":1,"414":1,"443":1,"448":2,"449":4,"450":2,"452":2,"455":1,"458":2}}],["trades",{"2":{"385":1}}],["tradeoff",{"2":{"384":1}}],["traditional",{"2":{"190":1,"357":1,"380":1}}],["trading",{"2":{"50":1,"385":1}}],["tranfereth",{"2":{"321":1}}],["transports",{"2":{"100":3,"101":3,"124":1}}],["transferring",{"2":{"412":1}}],["transfereth",{"2":{"321":1}}],["transfertransaction",{"2":{"321":2}}],["transfers",{"0":{"321":1},"2":{"145":1,"147":1,"149":1,"232":2,"233":2,"234":2,"470":2,"471":2,"472":2}}],["transfer",{"2":{"66":1,"73":2,"232":7,"233":1,"234":1,"235":2,"321":1,"322":2,"323":4,"327":1,"470":7,"471":1,"472":1,"473":2}}],["transactionfailed",{"2":{"455":1}}],["transactioncreator",{"2":{"323":4,"327":2}}],["transactioncount",{"0":{"319":1},"2":{"319":2}}],["transactioncall",{"2":{"311":2}}],["transactionbyhash",{"0":{"318":1},"2":{"318":1}}],["transaction2",{"2":{"232":2,"233":2,"234":2,"235":2,"470":2,"471":2,"472":2,"473":2}}],["transaction1",{"2":{"232":2,"233":2,"234":2,"235":2,"470":2,"471":2,"472":2,"473":2}}],["transactionreceipt",{"2":{"298":2,"300":4,"320":2,"321":1,"323":4,"327":2,"454":1}}],["transactionreturn",{"2":{"142":1}}],["transactionresponse",{"2":{"80":1,"85":1}}],["transactionhash",{"2":{"297":1,"315":1,"318":1,"320":1}}],["transactionhashes",{"2":{"37":1,"299":1}}],["transactionhistoryfilter",{"2":{"37":1,"39":1,"41":1}}],["transactionhistory",{"2":{"37":2,"39":2}}],["transaction",{"0":{"36":1,"37":1,"39":1,"185":1,"422":1,"453":1,"454":1,"455":1},"1":{"37":1,"454":1,"455":1},"2":{"8":3,"35":2,"37":7,"39":4,"65":1,"66":5,"67":2,"72":5,"74":2,"77":1,"85":2,"120":1,"142":3,"143":4,"144":2,"145":1,"146":2,"147":1,"148":4,"149":1,"150":4,"151":6,"154":1,"155":1,"180":1,"185":1,"190":1,"231":4,"232":4,"233":4,"234":4,"235":1,"240":1,"297":1,"298":1,"299":3,"300":2,"311":1,"315":3,"318":4,"320":1,"321":1,"323":4,"327":3,"337":1,"341":1,"399":1,"402":1,"407":1,"410":2,"412":3,"413":4,"414":1,"431":1,"450":1,"451":1,"453":3,"454":8,"455":4,"469":4,"470":4,"471":4,"472":4,"473":1,"478":1}}],["transactions",{"0":{"73":1,"151":1,"184":1,"231":1,"235":1,"469":1,"473":1},"2":{"8":10,"33":2,"65":3,"66":2,"67":2,"73":8,"142":1,"151":5,"184":1,"185":1,"191":1,"232":1,"233":1,"234":1,"235":4,"299":3,"300":3,"319":1,"353":1,"358":2,"408":1,"413":2,"414":1,"418":1,"429":1,"440":1,"453":1,"454":1,"455":3,"470":1,"471":1,"472":1,"473":4}}],["trait",{"2":{"61":8}}],["tracking",{"2":{"386":1}}],["trackers",{"2":{"220":2,"459":2}}],["tracked",{"2":{"75":1}}],["track",{"2":{"30":1,"39":1}}],["trying",{"2":{"96":1,"190":1,"245":1,"373":1}}],["try",{"0":{"7":1,"87":1,"344":1,"346":1,"361":1,"368":1},"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"50":1,"80":3,"82":1,"87":1,"179":1,"220":1,"247":2,"257":2,"267":2,"283":2,"290":2,"361":1,"368":1,"376":1,"377":1,"442":1,"455":2,"459":1}}],["troubles",{"2":{"0":1}}],["technique",{"2":{"255":1,"264":1}}],["technically",{"2":{"61":1}}],["technical",{"2":{"27":1,"28":1,"63":1}}],["text",{"2":{"167":1,"219":1,"458":1}}],["textmeshpro",{"2":{"129":1,"131":1}}],["templates",{"2":{"188":1,"192":1}}],["template",{"0":{"82":1,"88":1,"345":1,"362":1,"369":1},"2":{"88":1,"130":3,"188":1,"345":1,"362":1,"369":1}}],["tested",{"2":{"290":1}}],["test",{"0":{"75":1,"76":1},"1":{"76":1},"2":{"74":1,"83":1,"85":1,"92":1,"172":1,"366":1,"440":1,"441":1,"442":1,"443":1,"444":1,"454":1,"455":1}}],["testing",{"0":{"58":1,"83":1},"2":{"1":1,"33":1,"75":2,"104":1,"127":1}}],["terms",{"2":{"63":1,"384":1}}],["team",{"2":{"0":3,"5":1,"23":1,"43":1,"56":1,"57":2,"91":1,"94":1,"132":1,"160":1,"163":1,"239":1,"243":1,"357":1,"365":1,"385":1,"477":1}}],["tampered",{"2":{"357":1}}],["tailored",{"2":{"241":1}}],["taking",{"2":{"216":1}}],["takes",{"2":{"194":1,"438":1,"449":1}}],["taken",{"2":{"72":1,"413":1}}],["take",{"2":{"64":1,"97":1,"142":1,"153":1,"154":1,"158":1,"179":2,"190":1,"246":1,"255":1,"264":1,"322":1,"348":1,"358":1,"374":1,"380":1}}],["tag",{"2":{"211":1}}],["tanstack",{"2":{"99":3,"100":1,"101":1}}],["tank",{"0":{"70":1},"2":{"72":2}}],["tablet",{"2":{"376":1,"377":1}}],["tab",{"2":{"77":1,"179":3,"182":1,"334":1}}],["tasks",{"2":{"290":1}}],["task",{"2":{"57":1,"142":2,"153":2,"154":2,"323":1}}],["taskid",{"2":{"57":3}}],["targets",{"2":{"133":1}}],["target",{"2":{"23":1,"26":1,"43":1,"50":1,"53":1,"56":1,"57":2,"385":1}}],["talking",{"2":{"0":1}}],["tackle",{"2":{"0":1}}],["those",{"2":{"165":1,"241":1,"370":1}}],["thought",{"2":{"142":1}}],["than",{"2":{"159":1,"220":1,"240":1,"459":1,"478":1}}],["that",{"2":{"0":1,"3":1,"4":3,"6":1,"8":1,"23":1,"26":1,"30":1,"33":2,"59":1,"61":2,"62":2,"63":2,"66":1,"72":2,"73":3,"75":2,"77":1,"80":4,"92":1,"104":1,"115":1,"126":1,"129":1,"130":3,"131":3,"132":1,"133":1,"142":1,"143":1,"144":1,"145":2,"147":2,"149":2,"150":2,"151":1,"154":1,"155":1,"158":1,"164":1,"165":1,"172":1,"174":1,"179":4,"182":2,"184":1,"190":1,"191":1,"193":2,"194":1,"199":1,"207":1,"216":2,"223":2,"231":1,"241":1,"252":1,"255":1,"264":1,"271":1,"274":1,"280":1,"289":3,"290":3,"294":2,"299":1,"300":1,"303":1,"322":1,"323":1,"324":1,"340":1,"342":1,"347":1,"352":2,"355":1,"357":1,"358":3,"359":1,"366":1,"370":1,"379":1,"380":3,"381":1,"383":1,"384":2,"388":1,"392":1,"398":1,"399":1,"400":1,"405":1,"406":1,"407":2,"408":1,"410":1,"413":1,"421":2,"429":1,"431":1,"432":1,"435":1,"436":1,"437":1,"441":2,"442":2,"443":1,"446":1,"449":1,"450":1,"453":1,"454":2,"461":2,"469":1}}],["threshold",{"0":{"431":1},"2":{"384":1,"387":1,"390":2,"391":2,"393":2,"401":1,"402":1,"406":1,"407":1,"419":1,"420":1,"421":1,"430":1,"431":2,"434":1,"436":5,"437":2}}],["three",{"2":{"381":3}}],["threat",{"0":{"359":1}}],["threats",{"2":{"356":1}}],["threads",{"2":{"139":1}}],["throwing",{"2":{"290":1}}],["throw",{"2":{"66":2,"290":2}}],["throughout",{"2":{"294":1}}],["throughput",{"2":{"65":1,"74":1}}],["through",{"2":{"2":1,"4":1,"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1,"74":1,"98":1,"122":1,"133":1,"150":1,"167":2,"172":1,"173":1,"188":1,"193":1,"223":1,"247":1,"257":1,"267":1,"268":1,"287":1,"289":1,"419":2,"420":2,"421":1,"445":1,"461":1}}],["third",{"2":{"130":1,"357":1}}],["think",{"2":{"94":1,"193":1,"239":1,"241":1,"477":1}}],["thing",{"2":{"84":1,"175":1}}],["things",{"2":{"30":1,"175":1,"304":1,"331":1,"436":2}}],["this",{"2":{"3":5,"4":2,"23":2,"27":1,"30":3,"39":2,"41":2,"43":1,"46":1,"56":1,"61":2,"63":1,"66":5,"67":1,"72":2,"73":1,"74":1,"75":2,"76":1,"77":5,"78":1,"79":1,"80":1,"82":3,"83":1,"84":3,"85":2,"91":1,"98":1,"101":1,"115":1,"122":1,"125":1,"126":1,"129":5,"130":4,"131":3,"132":3,"133":5,"135":1,"139":3,"141":3,"142":1,"143":3,"144":2,"145":1,"146":1,"147":1,"148":1,"149":1,"150":7,"152":1,"153":1,"154":2,"155":2,"158":2,"160":1,"163":3,"164":1,"165":4,"167":16,"168":3,"172":3,"177":1,"179":2,"192":1,"193":5,"194":1,"198":1,"219":7,"222":1,"227":2,"241":1,"243":1,"251":1,"253":1,"255":2,"261":1,"263":1,"264":2,"287":2,"288":3,"289":5,"292":1,"293":1,"302":2,"304":1,"321":1,"322":1,"328":1,"330":1,"331":2,"332":2,"333":1,"334":2,"338":3,"339":3,"340":3,"342":1,"352":1,"357":3,"358":3,"359":4,"365":1,"370":1,"377":1,"381":1,"383":3,"384":1,"390":1,"392":1,"395":1,"398":1,"399":2,"401":2,"402":1,"406":1,"407":3,"408":2,"409":1,"410":1,"413":1,"415":1,"416":2,"419":1,"420":1,"421":1,"435":2,"436":3,"437":1,"439":1,"441":2,"443":1,"446":1,"447":1,"448":1,"449":1,"450":1,"452":1,"454":1,"455":5,"458":7,"460":1,"465":2}}],["thus",{"2":{"8":1}}],["these",{"0":{"187":1,"190":1},"2":{"85":1,"100":1,"105":1,"117":1,"127":1,"130":2,"131":1,"132":1,"151":1,"155":1,"158":1,"163":1,"167":2,"175":1,"177":2,"178":1,"187":2,"189":1,"303":2,"327":2,"331":2,"352":1,"355":1,"358":1,"359":1,"384":1,"395":1,"399":1,"407":1,"425":1}}],["then",{"2":{"28":1,"30":1,"46":1,"47":1,"77":1,"80":1,"81":1,"84":2,"101":1,"136":2,"137":2,"163":1,"165":3,"173":1,"179":1,"187":1,"193":1,"202":1,"219":3,"220":1,"223":1,"240":1,"249":1,"259":1,"289":2,"298":1,"300":1,"333":1,"342":1,"408":1,"432":1,"440":1,"441":1,"458":3,"459":1,"461":1,"478":1}}],["theme=",{"2":{"139":2}}],["theme",{"0":{"205":1},"2":{"107":1,"194":2,"205":2}}],["themselves",{"2":{"64":1,"357":1,"384":1,"409":1}}],["them",{"0":{"191":1},"2":{"8":1,"62":1,"73":3,"96":1,"141":1,"146":1,"155":1,"165":1,"173":1,"190":1,"223":1,"245":1,"290":1,"299":1,"300":1,"303":1,"356":1,"373":1,"384":1,"461":1}}],["their",{"2":{"8":1,"61":1,"64":1,"96":1,"135":1,"150":1,"164":1,"193":3,"194":1,"216":2,"219":3,"222":1,"223":3,"245":1,"288":1,"289":1,"327":1,"341":1,"347":1,"358":1,"373":1,"379":1,"380":3,"381":5,"382":3,"383":1,"384":4,"387":1,"388":1,"430":1,"435":1,"446":1,"447":1,"458":3,"460":1,"461":3}}],["they",{"2":{"8":1,"30":1,"61":1,"63":1,"64":1,"73":1,"113":1,"114":1,"131":1,"150":1,"174":1,"187":1,"194":1,"204":2,"216":1,"219":1,"223":3,"290":1,"291":1,"323":1,"352":1,"381":1,"395":1,"436":2,"455":1,"458":1,"461":3}}],["therefore",{"2":{"154":1,"284":1,"287":1,"392":1}}],["there",{"2":{"4":1,"61":1,"73":1,"130":2,"131":1,"135":1,"154":1,"158":1,"179":1,"255":1,"264":1,"289":1,"292":1,"303":1,"304":1,"385":1,"408":1,"409":1}}],["the",{"0":{"37":1,"39":1,"83":1,"84":1,"100":1,"101":1,"102":1,"103":1,"118":1,"119":1,"187":1,"190":1,"191":1,"215":1,"218":1,"288":1,"289":1,"334":1,"339":1,"391":1,"415":1,"416":1,"457":1},"1":{"120":1,"121":1,"416":1},"2":{"0":6,"1":3,"2":4,"3":7,"4":13,"5":2,"6":1,"7":8,"8":9,"22":2,"23":7,"24":5,"25":4,"26":12,"27":2,"28":2,"29":2,"30":11,"31":2,"32":2,"33":12,"34":1,"35":5,"36":2,"37":4,"38":2,"39":6,"40":2,"41":8,"42":1,"43":1,"45":2,"48":2,"49":8,"50":14,"51":4,"52":5,"53":8,"55":1,"56":2,"57":6,"59":5,"61":7,"62":6,"63":8,"64":3,"66":20,"67":5,"72":8,"73":2,"74":5,"75":14,"76":4,"77":16,"78":1,"79":1,"80":10,"81":2,"82":3,"83":1,"84":9,"85":8,"90":4,"91":2,"92":2,"93":1,"94":1,"95":3,"96":2,"97":2,"98":2,"99":5,"100":4,"101":4,"102":6,"103":2,"104":1,"105":3,"107":5,"108":4,"109":2,"110":2,"111":2,"112":2,"113":7,"114":7,"115":5,"116":1,"117":4,"118":2,"119":2,"120":1,"121":3,"122":1,"123":3,"124":4,"125":2,"126":1,"129":3,"130":16,"131":11,"132":13,"133":7,"134":8,"135":4,"136":5,"137":5,"139":10,"141":4,"142":5,"143":6,"144":5,"145":4,"146":1,"147":4,"148":4,"149":4,"150":24,"151":5,"152":5,"153":4,"154":7,"155":5,"156":1,"157":1,"158":16,"159":1,"160":3,"163":3,"164":1,"165":15,"167":10,"168":4,"169":3,"172":14,"173":4,"174":11,"176":1,"177":4,"179":29,"180":1,"181":3,"182":8,"183":2,"184":2,"185":2,"187":8,"188":4,"190":3,"191":1,"192":2,"193":7,"194":11,"195":1,"196":1,"198":2,"200":2,"203":3,"204":1,"205":2,"206":1,"207":1,"208":1,"209":1,"211":5,"212":2,"213":6,"214":1,"216":25,"218":1,"219":12,"220":8,"223":4,"226":1,"227":2,"228":2,"229":1,"230":4,"231":6,"232":2,"233":4,"234":4,"235":2,"237":1,"238":1,"239":1,"240":5,"241":3,"243":5,"244":3,"245":2,"246":2,"247":2,"248":6,"249":3,"251":1,"252":1,"253":1,"254":3,"255":11,"256":3,"257":2,"258":2,"259":3,"261":1,"262":5,"263":1,"264":9,"265":3,"266":2,"267":2,"268":1,"271":2,"272":2,"274":2,"275":2,"277":1,"278":2,"280":2,"281":2,"283":1,"284":3,"285":1,"287":7,"288":13,"289":24,"290":4,"291":2,"292":3,"294":3,"295":2,"296":2,"297":2,"298":3,"299":8,"300":9,"301":8,"302":4,"303":2,"304":13,"305":1,"306":1,"307":1,"308":1,"309":3,"310":1,"311":2,"313":3,"314":1,"315":2,"317":1,"319":1,"320":1,"321":4,"322":4,"323":12,"324":2,"325":6,"326":1,"327":5,"328":2,"331":1,"332":3,"333":2,"334":2,"335":2,"337":2,"338":4,"339":5,"340":5,"341":2,"342":4,"347":5,"348":2,"349":1,"352":3,"355":5,"356":4,"357":1,"358":11,"359":11,"364":4,"365":2,"366":2,"368":1,"370":2,"372":3,"373":2,"374":2,"377":1,"379":5,"380":7,"381":9,"382":1,"383":3,"384":9,"385":29,"386":2,"389":2,"391":2,"392":11,"394":8,"395":11,"396":8,"397":2,"398":8,"399":4,"400":5,"401":11,"402":6,"404":2,"405":3,"406":3,"407":17,"408":16,"409":4,"410":3,"411":4,"412":3,"413":14,"414":3,"415":6,"416":8,"419":7,"420":8,"421":13,"429":6,"430":4,"431":6,"432":4,"433":3,"434":5,"435":5,"436":14,"437":8,"438":23,"439":2,"440":4,"441":16,"442":18,"443":1,"444":2,"445":1,"447":1,"448":3,"449":9,"450":5,"451":1,"452":3,"453":1,"454":13,"455":8,"457":1,"458":12,"459":8,"461":4,"464":1,"465":2,"466":2,"467":1,"468":4,"469":6,"470":2,"471":4,"472":4,"473":2,"475":1,"476":1,"477":1,"478":5}}],["torus",{"0":{"384":1},"2":{"381":3,"384":7}}],["towards",{"2":{"190":1}}],["tower",{"2":{"130":2}}],["touch",{"2":{"160":1}}],["toutf8bytes",{"2":{"77":1}}],["toggling",{"2":{"182":1}}],["toggle",{"2":{"23":1,"24":1,"37":1,"41":1}}],["together",{"2":{"150":1,"151":2,"173":1,"291":1,"299":1,"300":1,"436":2}}],["toaddress",{"2":{"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":4,"323":4,"327":2}}],["toying",{"2":{"107":1}}],["topics",{"2":{"454":2}}],["top",{"0":{"430":1},"1":{"431":1,"432":1,"433":1,"434":1,"435":1,"436":1},"2":{"105":1,"108":3,"132":1,"158":1,"179":1,"182":1}}],["toml",{"2":{"81":1,"82":1}}],["took",{"2":{"383":1}}],["toolkit",{"2":{"94":1,"95":1,"239":1,"244":1,"372":1,"477":1}}],["tools=",{"2":{"139":2}}],["tools",{"0":{"159":1},"2":{"94":1,"95":1,"139":2,"159":1,"239":1,"243":1,"244":1,"372":1,"477":1}}],["too",{"2":{"49":1,"193":2,"194":1,"243":1,"247":1,"257":1,"267":1,"283":1}}],["total",{"0":{"41":1},"2":{"35":3,"41":1,"182":1,"184":1,"185":1,"388":1,"435":1,"436":2}}],["tokenresponse",{"2":{"442":2}}],["tokenbaseuri",{"2":{"339":2}}],["tokenbalances",{"2":{"23":4,"27":1,"28":1,"32":3}}],["token4id",{"2":{"235":1,"473":1}}],["token2id",{"2":{"234":1,"472":1}}],["token1id",{"2":{"234":1,"472":1}}],["tokencontract",{"2":{"73":2,"385":1}}],["tokenuri",{"2":{"61":2}}],["tokenmetadata",{"2":{"56":2,"57":1}}],["tokendetails",{"2":{"41":4}}],["tokenidasstring",{"2":{"146":1,"148":1,"151":2}}],["tokenids",{"2":{"56":3,"57":3,"346":1,"385":3}}],["tokenid",{"2":{"4":4,"50":1,"52":3,"61":1,"62":1,"66":1,"72":1,"80":3,"83":1,"84":1,"85":3,"121":1,"149":1,"233":4,"234":1,"235":1,"340":2,"385":2,"471":4,"472":1,"473":1}}],["tokens",{"0":{"4":1,"15":1,"16":1,"18":1,"22":1,"23":1,"40":1,"41":1,"232":1,"233":1,"234":1,"327":1,"470":1,"471":1,"472":1},"1":{"23":1,"24":1,"41":1},"2":{"4":8,"8":1,"23":2,"30":1,"32":1,"33":2,"35":3,"41":1,"42":1,"50":4,"52":6,"54":1,"55":1,"56":1,"61":2,"62":1,"64":3,"66":1,"144":1,"145":1,"146":1,"147":1,"148":2,"149":1,"213":1,"327":1,"328":1,"338":1,"340":1,"341":2,"342":4,"353":1,"385":2}}],["token",{"0":{"3":1,"11":1,"24":1,"38":1,"55":1,"56":1,"57":1,"59":1,"331":1},"1":{"39":1,"56":1,"57":1,"58":2,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1},"2":{"2":3,"3":4,"4":6,"23":5,"24":1,"25":1,"30":2,"33":7,"35":4,"37":4,"39":4,"41":8,"42":2,"45":2,"49":4,"50":7,"52":1,"54":3,"55":6,"56":2,"57":2,"58":7,"59":2,"61":3,"62":3,"63":1,"64":3,"66":1,"143":1,"144":4,"146":2,"148":4,"167":1,"169":2,"232":4,"233":3,"234":3,"235":2,"330":1,"331":5,"332":4,"339":2,"340":2,"341":1,"342":2,"347":1,"358":1,"379":1,"385":4,"450":1,"470":4,"471":3,"472":3,"473":2}}],["todotodoplease",{"2":{"56":1}}],["todo",{"0":{"221":1},"2":{"1":1,"90":1,"364":1,"455":1}}],["today",{"2":{"0":1,"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1}}],["to",{"0":{"39":1,"80":1,"85":1,"142":1,"215":1,"329":1,"337":1,"411":1},"1":{"81":1,"82":1,"83":1,"84":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1},"2":{"0":5,"1":5,"2":3,"3":8,"4":10,"6":2,"7":5,"8":4,"11":2,"22":1,"23":6,"24":3,"25":3,"26":3,"27":1,"28":1,"30":11,"31":1,"33":6,"35":1,"36":1,"37":4,"38":1,"39":2,"40":1,"41":6,"42":4,"43":1,"45":3,"49":4,"50":13,"53":2,"55":4,"56":2,"57":4,"59":4,"61":1,"62":2,"63":5,"65":2,"66":16,"67":3,"72":2,"73":8,"74":6,"75":11,"76":1,"77":6,"78":1,"79":2,"80":6,"82":4,"83":1,"84":3,"85":4,"90":1,"91":2,"92":3,"96":1,"97":1,"99":2,"100":3,"101":1,"102":1,"105":1,"109":1,"110":1,"111":1,"113":2,"114":2,"115":1,"116":1,"117":1,"118":1,"122":1,"123":6,"124":3,"125":1,"129":2,"130":10,"131":8,"132":6,"133":7,"134":3,"135":5,"136":2,"137":2,"139":6,"141":2,"142":5,"143":5,"144":5,"145":4,"146":1,"147":4,"148":2,"149":4,"150":16,"151":3,"152":1,"153":3,"154":6,"155":7,"157":2,"158":10,"159":4,"160":1,"163":2,"164":3,"165":14,"167":11,"168":3,"169":3,"172":5,"173":2,"174":4,"175":5,"176":2,"177":6,"178":1,"179":9,"180":3,"181":1,"182":2,"186":1,"187":7,"188":3,"189":1,"190":1,"191":2,"192":4,"193":9,"194":10,"196":1,"200":1,"201":1,"203":1,"204":3,"207":1,"208":1,"209":1,"210":1,"211":2,"212":1,"213":5,"216":7,"218":1,"219":11,"220":4,"222":1,"223":3,"227":2,"229":1,"231":5,"232":7,"233":7,"234":7,"235":11,"240":2,"241":5,"243":6,"245":1,"246":1,"249":1,"251":1,"252":1,"253":3,"254":1,"255":2,"257":1,"259":1,"261":1,"262":1,"263":3,"264":2,"265":1,"271":2,"272":1,"274":1,"277":1,"278":1,"280":2,"284":1,"287":1,"288":3,"289":2,"290":2,"291":1,"294":1,"299":1,"300":1,"301":2,"302":1,"303":2,"304":5,"305":1,"306":1,"307":1,"308":1,"309":2,"310":1,"313":2,"314":2,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":2,"322":5,"323":7,"324":3,"325":4,"326":1,"327":4,"328":3,"332":2,"333":1,"335":1,"337":1,"338":5,"339":4,"340":6,"341":2,"342":3,"344":1,"347":5,"348":1,"350":3,"352":2,"355":1,"356":2,"357":6,"358":1,"359":5,"364":1,"365":2,"366":3,"370":3,"373":1,"374":1,"376":1,"377":2,"379":5,"380":4,"381":2,"382":1,"383":1,"384":7,"385":2,"386":1,"388":1,"392":1,"395":2,"396":1,"397":2,"398":2,"399":1,"400":1,"401":3,"402":2,"403":1,"404":1,"405":1,"407":4,"408":8,"409":2,"410":1,"411":2,"413":2,"414":2,"415":3,"416":3,"418":1,"419":1,"421":2,"429":1,"430":1,"431":1,"432":2,"433":1,"434":2,"435":2,"436":4,"439":2,"440":2,"441":9,"442":7,"446":1,"447":4,"448":1,"449":1,"450":2,"451":2,"452":1,"454":3,"455":7,"457":1,"458":11,"459":4,"460":1,"461":3,"465":2,"467":1,"469":5,"470":7,"471":7,"472":7,"473":11,"478":2}}],["azure",{"2":{"339":1}}],["awesome",{"2":{"193":1}}],["aware",{"2":{"175":1,"220":1,"459":1}}],["away",{"2":{"150":1}}],["await",{"2":{"7":1,"23":1,"24":1,"27":1,"32":1,"37":1,"39":1,"41":1,"43":1,"56":1,"57":2,"66":4,"72":2,"73":2,"77":1,"80":6,"85":3,"142":2,"153":2,"154":2,"194":2,"195":1,"196":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"219":1,"220":2,"225":1,"226":1,"227":1,"228":2,"229":1,"231":1,"232":2,"233":3,"234":3,"235":2,"297":1,"298":1,"299":1,"300":1,"301":2,"304":2,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":2,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":2,"323":6,"325":3,"326":1,"327":5,"385":2,"400":1,"419":1,"420":1,"440":2,"441":4,"442":3,"443":2,"444":3,"448":1,"449":2,"450":1,"451":1,"452":1,"454":2,"455":2,"458":1,"459":2,"463":1,"464":1,"465":1,"466":2,"467":1,"469":1,"470":2,"471":3,"472":3,"473":2}}],["ayourclass",{"2":{"167":2}}],["avoid",{"2":{"123":1,"175":1,"194":1}}],["availability",{"2":{"33":1}}],["available",{"0":{"106":1},"1":{"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1},"2":{"5":1,"49":2,"51":1,"66":1,"91":1,"93":1,"97":1,"123":1,"134":1,"135":1,"160":1,"193":1,"194":1,"205":1,"209":1,"237":1,"238":1,"246":1,"247":1,"252":1,"256":3,"257":1,"262":1,"266":1,"267":1,"268":1,"273":1,"274":1,"282":1,"283":1,"285":1,"287":2,"302":1,"347":1,"352":1,"357":1,"365":1,"374":1,"379":1,"442":1,"475":1,"476":1}}],["avalanche",{"0":{"32":1}}],["avax",{"0":{"32":1}}],["among",{"2":{"436":1}}],["amountasbiginteger",{"2":{"323":4}}],["amountasstring",{"2":{"144":1,"148":1,"151":2}}],["amount4",{"2":{"235":1,"473":1}}],["amount3",{"2":{"235":1,"473":1}}],["amountrequiredraw",{"2":{"120":1}}],["amount",{"2":{"85":1,"144":1,"145":1,"149":1,"150":1,"151":1,"212":2,"232":2,"234":1,"311":1,"340":1,"413":1,"470":2,"472":1}}],["amount2",{"2":{"73":1,"232":1,"233":1,"234":1,"235":1,"470":1,"471":1,"472":1,"473":1}}],["amount1",{"2":{"73":1,"232":1,"233":1,"234":1,"470":1,"471":1,"472":1}}],["amazon",{"2":{"134":2,"357":1,"446":1}}],["amp",{"0":{"3":1,"5":1,"30":1,"34":1,"49":1,"396":1,"417":1},"1":{"50":1,"51":1,"52":1,"53":1,"54":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1},"2":{"2":3,"3":1,"11":2,"23":2,"24":3,"28":3,"32":2,"35":1,"37":3,"39":3,"41":3,"45":3,"49":1,"67":1,"74":1,"102":2,"167":10,"168":1,"169":1,"175":2,"187":2,"391":3,"442":2}}],["admire",{"0":{"341":1}}],["adapter",{"2":{"294":1}}],["advanced",{"0":{"290":1},"1":{"291":1},"2":{"100":1,"131":1,"143":1,"290":1}}],["advantages",{"2":{"191":1}}],["advantage",{"2":{"64":1,"322":1}}],["adhere",{"2":{"30":1}}],["addr",{"2":{"434":1}}],["addresses",{"2":{"23":1,"24":1,"37":2,"41":1,"43":2,"54":1,"183":1,"385":1,"399":2,"407":3}}],["address",{"0":{"37":1,"43":1,"72":1,"218":1,"395":1,"457":1},"2":{"23":3,"24":4,"28":1,"30":1,"32":3,"35":2,"37":6,"39":5,"41":4,"50":4,"54":1,"56":1,"57":1,"64":1,"66":6,"67":1,"72":4,"73":2,"74":1,"77":9,"80":10,"81":2,"83":4,"84":4,"85":5,"134":1,"143":1,"145":1,"147":1,"149":1,"150":1,"154":1,"167":1,"194":1,"208":1,"218":3,"219":3,"220":3,"226":1,"232":2,"233":8,"234":8,"235":7,"240":1,"296":3,"310":1,"314":1,"322":1,"324":2,"325":2,"327":2,"332":1,"338":1,"340":4,"342":1,"385":5,"389":3,"390":4,"392":1,"393":5,"394":3,"395":4,"398":1,"400":10,"408":1,"411":1,"416":2,"420":1,"434":2,"437":2,"438":2,"441":1,"442":1,"443":2,"447":1,"454":2,"455":1,"457":3,"458":3,"459":3,"464":1,"470":2,"471":8,"472":8,"473":7,"478":1}}],["adds",{"2":{"380":1}}],["adddynamic",{"2":{"167":2}}],["addition",{"2":{"50":1,"59":1,"130":1,"154":1,"243":1,"289":1}}],["additionally",{"2":{"26":1,"44":1,"53":1,"61":1,"64":1,"99":1,"143":1,"188":1,"243":1}}],["additional",{"2":{"23":1,"24":1,"37":1,"41":1,"61":1,"62":1,"122":1,"138":1,"180":1,"190":1,"193":1,"243":1,"348":1,"383":2,"391":1,"414":1,"446":1,"447":2}}],["added",{"2":{"44":1,"158":1,"249":1,"257":1,"259":1,"267":1,"384":1,"436":1}}],["add",{"0":{"71":1,"72":1,"81":1},"2":{"1":1,"3":2,"7":1,"27":1,"80":1,"82":2,"90":1,"99":1,"101":1,"117":1,"129":2,"131":3,"136":1,"137":1,"139":2,"154":1,"155":2,"163":1,"167":1,"179":1,"194":1,"241":4,"248":1,"254":1,"258":1,"265":1,"268":1,"357":1,"364":1,"370":4,"384":2}}],["ai",{"2":{"11":1}}],["absolute",{"2":{"219":1,"458":1}}],["abstracted",{"2":{"150":1}}],["abstraction",{"2":{"8":1,"191":1}}],["abis",{"2":{"150":1,"327":1}}],["abi",{"2":{"66":1,"85":1,"145":1,"147":1,"149":1,"150":5,"322":3,"323":1,"324":1,"327":1,"328":1,"393":4,"421":1,"435":1,"436":1,"437":2}}],["ability",{"2":{"66":1,"384":1}}],["about",{"2":{"42":1,"50":1,"55":1,"64":1,"65":1,"73":1,"74":1,"180":1,"194":1,"289":1,"342":1}}],["above",{"0":{"289":1},"2":{"4":2,"30":1,"43":1,"50":3,"52":1,"72":1,"129":1,"143":2,"144":1,"150":1,"194":1,"219":1,"220":1,"287":1,"288":1,"289":2,"305":1,"308":1,"310":1,"312":1,"314":1,"391":1,"419":1,"420":1,"458":1,"459":1}}],["able",{"2":{"30":1,"49":1,"66":1,"131":1,"177":1,"193":3,"210":1,"213":1,"216":1,"359":2,"384":1,"419":1}}],["audits",{"0":{"425":1},"1":{"426":1,"427":1,"428":1},"2":{"425":1}}],["audited",{"2":{"357":1}}],["audio",{"2":{"4":2}}],["auto",{"2":{"381":1}}],["autoconnect",{"2":{"249":1,"289":2}}],["automatic",{"0":{"452":1},"2":{"74":1,"452":1}}],["automatically",{"2":{"8":1,"33":3,"49":1,"102":1,"127":1,"129":2,"131":1,"133":1,"173":1,"198":1,"203":1,"207":1,"208":1,"219":3,"243":1,"336":1,"377":1,"435":1,"438":1,"440":1,"458":3}}],["authorizationmessage",{"2":{"227":2,"228":1,"465":2,"466":1}}],["authorization",{"0":{"227":1,"228":1,"465":1,"466":1},"2":{"220":1,"459":1}}],["authorized",{"2":{"228":2,"466":2}}],["authorizenonce",{"0":{"201":1},"2":{"201":2}}],["authorize",{"0":{"200":1},"2":{"194":1,"200":2,"219":2,"223":2,"227":1,"458":2,"461":2,"465":1}}],["authfailure",{"2":{"167":2}}],["authsuccess",{"2":{"167":3,"168":1,"169":1,"174":1}}],["authrequirescode",{"2":{"167":3,"168":1}}],["authenticating",{"2":{"358":1}}],["authentication",{"0":{"133":1,"166":1,"168":1,"169":1,"170":1},"1":{"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"167":1,"168":1,"169":1,"170":1},"2":{"90":1,"113":1,"114":1,"133":4,"167":1,"168":1,"169":1,"172":1,"190":1,"223":1,"364":1,"381":1,"439":1,"447":1,"461":1}}],["authenticator",{"2":{"167":3,"168":1}}],["authenticates",{"2":{"359":1}}],["authenticated",{"2":{"92":1,"366":1}}],["authenticate",{"0":{"217":1,"219":1,"220":1,"456":1,"458":1,"459":1},"1":{"218":1,"219":1,"220":1,"457":1,"458":1,"459":1},"2":{"7":1,"219":2,"220":1,"358":1,"439":1,"458":2,"459":1}}],["auth",{"0":{"357":1,"442":1},"2":{"66":2,"72":1,"77":1,"85":2,"165":1,"167":1,"168":1,"173":1,"174":2,"177":1,"197":1,"207":1,"220":1,"357":1,"358":1,"359":2,"439":2,"440":1,"442":4,"445":1,"447":1,"459":1}}],["achieves",{"2":{"358":1}}],["achievement",{"0":{"15":1,"16":1}}],["act",{"2":{"223":1,"461":1}}],["actor",{"2":{"165":2,"172":1,"380":1,"383":1,"384":1}}],["acting",{"2":{"380":1}}],["active",{"2":{"444":1}}],["activities",{"2":{"385":2}}],["activity",{"2":{"139":4,"216":1,"383":1,"385":1}}],["activate",{"2":{"278":2}}],["activated",{"2":{"278":1}}],["activation",{"0":{"278":1}}],["actions",{"2":{"223":1,"358":1,"452":1,"461":1}}],["action",{"2":{"139":8,"194":1,"223":1,"229":1,"344":1,"358":1,"450":2,"452":1,"461":1,"467":1}}],["actually",{"2":{"231":1,"469":1}}],["actual",{"2":{"7":1,"83":1,"194":1,"219":1,"241":1,"370":1,"458":1}}],["across",{"2":{"26":1,"33":1,"59":1}}],["acquire",{"2":{"7":1,"83":1,"91":1,"163":1,"365":1}}],["acc36ed4ef40db74137266e48d863083a5c7e85e2735d69adafcb5b362b6cfc0",{"2":{"454":2}}],["accelerate",{"2":{"186":1,"192":1}}],["accepted",{"2":{"194":1}}],["accepts",{"2":{"143":1,"323":1}}],["accepting",{"2":{"75":1,"141":1}}],["accessing",{"2":{"454":1}}],["accessible",{"2":{"4":2,"51":1,"381":1}}],["accessed",{"2":{"302":1,"355":1}}],["access",{"2":{"3":3,"7":2,"11":1,"22":1,"23":3,"24":1,"25":1,"27":1,"30":1,"31":1,"32":2,"33":1,"36":1,"37":2,"38":1,"39":1,"40":1,"41":1,"43":2,"46":2,"56":2,"57":3,"66":2,"72":1,"77":2,"80":8,"81":1,"85":1,"91":1,"92":1,"100":1,"101":1,"124":1,"132":1,"133":1,"145":1,"147":1,"149":1,"160":1,"163":1,"193":3,"194":2,"210":2,"357":3,"359":3,"365":1,"366":1,"382":2,"384":1,"429":1,"440":1,"441":1,"442":1,"443":1,"444":1,"454":1,"455":1}}],["accurately",{"2":{"33":1}}],["accounts",{"0":{"349":1},"1":{"350":1,"351":1},"2":{"135":1,"348":1,"349":2,"443":4}}],["accountaddresses",{"2":{"37":1}}],["accountaddress",{"2":{"23":7,"24":6,"28":2,"32":6,"37":4,"39":2}}],["account",{"0":{"3":1},"2":{"2":2,"3":2,"23":5,"24":4,"28":1,"32":4,"37":5,"66":3,"72":2,"73":2,"75":1,"76":1,"77":4,"85":1,"141":1,"191":1,"194":1,"219":1,"240":1,"255":1,"264":1,"332":1,"335":1,"357":1,"381":3,"384":1,"439":1,"440":1,"458":1,"478":1}}],["aggregating",{"2":{"6":1}}],["against",{"2":{"62":1,"359":2,"384":1,"392":2,"408":1,"416":1}}],["again",{"2":{"3":1,"179":2,"202":1,"339":1,"381":1}}],["aka",{"0":{"32":1},"2":{"4":1}}],["atomic",{"2":{"410":1}}],["attested",{"2":{"357":1}}],["attempts",{"2":{"287":1}}],["attempting",{"2":{"174":1}}],["attempt",{"2":{"129":1,"131":1,"262":1,"271":1,"272":1,"280":1}}],["attacks",{"2":{"442":1}}],["attacker",{"2":{"359":2,"382":1}}],["attackers",{"2":{"357":1}}],["attached",{"2":{"133":1,"158":1}}],["attach",{"2":{"50":1,"165":1}}],["attributes",{"0":{"63":1,"338":1},"2":{"50":1,"61":6,"62":1,"63":6,"331":1,"338":1}}],["at",{"2":{"4":1,"23":1,"50":2,"66":1,"67":1,"75":1,"87":1,"97":1,"126":1,"132":2,"160":2,"164":1,"179":2,"182":1,"190":1,"219":1,"246":1,"299":1,"300":1,"304":4,"310":2,"314":2,"323":1,"325":1,"331":1,"359":1,"361":1,"368":1,"374":1,"376":1,"377":1,"381":1,"396":1,"397":1,"458":1}}],["alpha",{"2":{"158":1}}],["alias",{"2":{"75":2}}],["already",{"2":{"67":1,"97":1,"129":1,"131":2,"139":2,"165":1,"194":1,"207":1,"208":1,"209":1,"216":2,"246":1,"322":1,"340":1,"374":1,"440":1}}],["alternatively",{"2":{"187":1,"192":1,"216":2,"323":1,"325":1}}],["alternative",{"2":{"45":1}}],["alongside",{"2":{"249":1,"259":1}}],["along",{"2":{"26":1,"339":1}}],["always",{"2":{"23":1,"24":1,"37":1,"41":1,"126":1,"160":1,"216":1,"220":1,"342":1,"358":1,"412":1,"413":1,"438":1,"455":1,"459":1}}],["also",{"2":{"4":1,"25":1,"30":2,"42":1,"49":1,"50":1,"55":1,"66":3,"73":1,"74":1,"93":1,"94":1,"122":1,"123":1,"129":1,"130":1,"155":1,"167":1,"177":1,"178":1,"182":1,"188":1,"194":2,"213":1,"216":1,"237":1,"238":1,"239":1,"241":1,"243":3,"253":1,"263":1,"327":2,"328":1,"347":1,"352":1,"358":1,"359":1,"370":1,"379":1,"408":1,"416":1,"420":1,"442":1,"475":1,"476":1,"477":1}}],["ally",{"2":{"62":1}}],["allowed",{"2":{"358":1,"409":1}}],["allowlists",{"2":{"358":1}}],["allowing",{"2":{"99":1,"150":1,"193":1}}],["allows",{"2":{"49":1,"73":1,"150":1,"151":2,"193":1,"219":3,"289":2,"294":1,"338":1,"347":1,"348":1,"352":1,"379":1,"383":1,"392":1,"398":1,"401":1,"405":1,"458":3}}],["allow",{"2":{"8":3,"80":3,"135":1,"145":1,"147":1,"149":1,"165":1,"193":1,"208":1,"213":1,"355":1,"418":1}}],["all",{"0":{"41":1,"288":1},"2":{"1":1,"3":1,"23":2,"24":1,"30":2,"33":3,"35":4,"37":1,"39":2,"41":2,"73":1,"93":1,"96":1,"115":1,"134":1,"135":1,"145":1,"147":1,"149":1,"150":1,"151":3,"152":1,"173":2,"187":1,"191":2,"192":1,"193":1,"210":1,"220":1,"238":1,"243":2,"245":1,"253":1,"263":1,"287":1,"288":1,"289":2,"290":1,"299":1,"300":1,"328":1,"331":1,"333":1,"334":1,"357":1,"373":1,"376":1,"377":1,"381":1,"384":1,"398":1,"401":1,"408":1,"413":1,"438":1,"459":1,"476":1}}],["arcadeum",{"2":{"425":2}}],["architectures",{"2":{"179":1}}],["architecture",{"0":{"356":1},"1":{"357":1,"358":1},"2":{"4":1}}],["argent",{"2":{"354":1}}],["argument",{"2":{"155":1,"449":1}}],["arguments",{"2":{"30":1,"133":1,"323":2}}],["arrive",{"2":{"84":1}}],["array",{"2":{"37":4,"43":1,"56":2,"57":2,"61":1,"63":1,"113":1,"114":1,"151":1,"385":2,"421":1}}],["arbitrum",{"2":{"66":1,"72":1,"346":1,"385":2}}],["arbitrary",{"2":{"62":1,"63":1,"150":1,"323":1,"328":1,"352":1}}],["artstation",{"2":{"62":1}}],["artist",{"2":{"62":1}}],["artists",{"2":{"62":1}}],["armor",{"2":{"62":1}}],["areas",{"2":{"63":1}}],["are",{"0":{"187":1,"190":1,"191":1,"391":1},"2":{"3":1,"8":3,"23":1,"24":1,"25":1,"30":5,"35":1,"37":1,"41":1,"49":1,"59":1,"63":1,"64":2,"77":1,"80":1,"85":1,"113":1,"114":1,"115":2,"123":1,"132":1,"133":1,"135":1,"143":2,"145":1,"147":1,"148":1,"149":1,"150":3,"151":1,"154":1,"155":1,"167":2,"168":1,"174":3,"175":1,"181":3,"189":1,"191":1,"193":2,"194":1,"195":1,"223":2,"240":2,"243":1,"248":1,"254":1,"255":1,"256":1,"264":1,"265":1,"289":1,"292":1,"295":1,"301":1,"303":2,"304":1,"323":1,"324":1,"338":1,"342":1,"347":1,"349":2,"352":3,"356":2,"358":1,"359":3,"379":1,"381":3,"382":1,"384":1,"385":2,"391":1,"392":1,"395":1,"396":1,"399":1,"407":3,"408":1,"409":1,"411":1,"419":2,"420":1,"425":1,"429":1,"431":1,"432":1,"433":1,"434":1,"436":1,"438":1,"440":1,"442":1,"443":1,"452":1,"453":1,"454":1,"455":1,"461":2,"478":2}}],["arise",{"2":{"0":1}}],["after",{"2":{"3":1,"75":1,"80":1,"126":1,"139":1,"158":1,"160":1,"167":3,"169":1,"172":1,"179":1,"194":1,"203":2,"332":1,"385":1,"397":1}}],["apk",{"2":{"139":2}}],["ape",{"2":{"61":2}}],["appprops",{"2":{"289":1}}],["appprotocol",{"0":{"197":1}}],["appropriate",{"2":{"132":1,"150":1,"158":1,"254":1,"265":1,"321":1,"323":1}}],["approach",{"2":{"66":1,"142":1,"153":1,"154":1,"175":1}}],["applied",{"2":{"432":1}}],["applicable",{"2":{"266":2}}],["application",{"2":{"6":1,"23":2,"24":2,"32":2,"37":2,"39":2,"41":2,"43":2,"49":1,"56":2,"57":4,"75":1,"83":1,"84":1,"96":1,"97":1,"98":1,"100":1,"132":1,"135":2,"139":4,"154":1,"172":1,"177":4,"180":1,"222":1,"223":1,"230":1,"245":1,"246":1,"255":1,"264":1,"288":4,"289":1,"346":1,"355":1,"373":1,"374":1,"385":3,"439":1,"442":2,"460":1,"461":1,"468":1}}],["applications",{"0":{"244":1,"372":1},"1":{"245":1,"373":1},"2":{"0":1,"30":1,"95":1,"181":1,"219":1,"220":1,"223":2,"244":1,"290":1,"357":1,"372":1,"458":1,"459":1,"461":2}}],["apply",{"2":{"158":3}}],["appleid",{"2":{"384":1}}],["applevision",{"2":{"179":1}}],["apple",{"0":{"442":1},"2":{"113":1,"135":1,"207":1,"209":1,"441":1,"442":1}}],["appname",{"0":{"272":1,"281":1},"2":{"100":1,"101":1,"124":1,"269":1,"277":3,"281":1}}],["app`",{"2":{"85":1}}],["appear",{"2":{"150":1}}],["appears",{"2":{"61":1,"123":1,"150":1}}],["appended",{"2":{"339":1}}],["append",{"2":{"7":1,"395":1}}],["apps",{"2":{"33":1,"155":1,"178":1}}],["app",{"0":{"196":1,"289":1},"2":{"4":8,"7":1,"23":3,"24":3,"26":2,"27":1,"28":2,"32":3,"37":3,"39":3,"41":3,"43":2,"46":2,"47":1,"50":4,"52":6,"54":1,"56":2,"57":4,"61":2,"62":1,"74":1,"76":1,"77":1,"80":1,"84":1,"85":2,"100":4,"101":3,"104":1,"105":1,"117":2,"124":4,"139":1,"157":1,"179":2,"193":1,"194":2,"196":3,"219":1,"220":1,"243":1,"249":2,"251":1,"252":1,"255":5,"256":5,"259":2,"261":1,"262":1,"264":5,"266":4,"269":1,"272":1,"277":1,"282":1,"287":2,"288":1,"289":3,"290":1,"342":2,"346":1,"357":1,"359":1,"376":1,"377":1,"385":2,"442":1,"458":1,"459":1}}],["apis",{"2":{"80":1,"84":1,"130":1,"181":1,"186":1,"187":3,"188":2,"355":1}}],["api",{"0":{"1":1,"2":1,"8":1,"22":1,"49":1,"171":1,"172":1,"173":1,"175":1,"346":1},"1":{"3":1,"4":1,"5":1,"23":1,"24":1,"50":1,"51":1,"52":1,"53":1,"54":1,"172":1,"173":1,"174":1,"175":1},"2":{"1":3,"2":4,"3":6,"4":1,"8":1,"22":1,"23":2,"25":3,"26":4,"27":1,"31":1,"32":1,"33":4,"36":1,"37":1,"38":1,"40":1,"43":1,"45":5,"46":2,"49":3,"51":1,"53":1,"54":1,"56":1,"74":2,"75":1,"80":5,"91":1,"126":1,"130":1,"132":2,"134":1,"160":1,"163":1,"165":1,"172":5,"174":1,"184":1,"188":1,"302":1,"345":1,"346":1,"365":1,"385":3,"386":1,"441":1,"455":1}}],["announced",{"2":{"196":1}}],["anonymizes",{"2":{"181":1}}],["another",{"2":{"23":1,"26":1,"43":1,"50":1,"53":1,"56":1,"57":2,"61":1,"358":1,"381":1,"385":1,"389":1}}],["analytics",{"0":{"180":1},"1":{"181":1,"182":1,"183":1,"184":1,"185":1},"2":{"181":2}}],["animation",{"2":{"4":2}}],["an",{"0":{"9":1,"17":1,"77":1,"287":1,"346":1},"1":{"78":1,"79":1},"2":{"4":5,"23":2,"24":1,"27":1,"30":1,"32":1,"35":1,"37":1,"39":1,"41":1,"43":2,"46":1,"49":1,"54":1,"56":2,"57":1,"61":2,"62":3,"63":2,"66":1,"73":2,"74":1,"75":2,"77":2,"84":1,"85":1,"94":1,"104":1,"123":4,"129":1,"133":1,"134":1,"135":1,"142":2,"143":1,"144":3,"145":2,"146":3,"147":2,"148":3,"149":2,"150":4,"152":1,"153":2,"154":2,"155":2,"158":1,"164":1,"165":2,"168":1,"175":1,"177":1,"187":1,"191":1,"193":2,"200":1,"201":1,"208":1,"212":1,"216":1,"219":2,"220":1,"222":1,"232":1,"233":2,"234":2,"239":1,"243":1,"254":1,"255":2,"264":2,"265":1,"272":1,"273":2,"285":1,"287":1,"289":3,"293":1,"294":2,"299":2,"300":2,"301":1,"322":1,"323":2,"324":3,"325":1,"327":2,"328":1,"332":1,"338":1,"355":2,"358":1,"359":2,"381":1,"382":1,"385":4,"389":1,"398":1,"407":1,"408":1,"413":1,"433":1,"434":2,"438":1,"439":1,"440":1,"441":6,"444":1,"446":1,"449":1,"450":1,"455":3,"458":2,"459":1,"460":1,"470":1,"471":2,"472":2,"477":1}}],["android=",{"2":{"139":2}}],["androidmanifest",{"2":{"139":1}}],["android",{"0":{"139":1},"2":{"127":1,"139":41,"161":1,"176":1,"177":3}}],["and",{"0":{"4":1,"23":2,"24":2,"75":1,"77":1,"179":1,"191":1,"195":1,"225":1,"288":1,"289":2,"331":1,"341":1,"423":1,"463":1},"1":{"76":1,"78":1,"79":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1},"2":{"0":1,"1":3,"2":4,"3":5,"4":6,"6":1,"7":3,"8":4,"24":1,"25":2,"26":5,"29":1,"30":5,"33":11,"37":1,"41":1,"42":1,"45":1,"48":1,"49":3,"50":6,"51":1,"53":1,"55":2,"59":3,"61":1,"62":1,"63":8,"64":2,"65":1,"67":1,"73":1,"74":5,"75":4,"76":1,"77":3,"80":6,"83":4,"84":5,"85":6,"90":1,"91":1,"93":1,"94":1,"95":1,"96":3,"98":1,"99":2,"104":1,"113":1,"114":1,"118":1,"122":1,"123":1,"124":1,"125":1,"126":2,"129":2,"130":3,"131":4,"132":4,"133":3,"134":2,"136":1,"137":1,"139":4,"141":1,"142":4,"143":4,"144":1,"145":2,"146":1,"147":2,"148":1,"149":2,"150":4,"151":1,"153":1,"154":4,"155":3,"157":1,"158":3,"159":1,"160":2,"164":1,"165":1,"167":1,"168":1,"169":1,"172":2,"175":1,"176":1,"177":3,"179":4,"181":3,"182":1,"184":1,"186":1,"187":5,"188":2,"189":1,"190":3,"191":1,"192":3,"193":6,"194":5,"198":2,"200":1,"204":1,"214":1,"216":2,"219":3,"220":1,"223":3,"226":1,"230":1,"235":1,"238":1,"239":1,"241":1,"243":2,"244":1,"245":3,"249":1,"256":1,"259":1,"262":1,"278":1,"284":1,"287":4,"288":2,"289":7,"290":1,"291":1,"297":1,"298":1,"299":2,"300":2,"301":1,"302":1,"303":1,"304":1,"305":1,"308":1,"310":1,"312":1,"314":1,"315":1,"320":1,"321":1,"322":2,"323":3,"325":2,"327":2,"328":2,"331":1,"332":2,"335":1,"336":1,"338":1,"339":2,"340":1,"341":2,"342":1,"347":1,"348":1,"352":1,"355":3,"357":4,"358":5,"364":1,"365":1,"372":1,"373":3,"379":1,"381":3,"383":1,"384":5,"385":1,"386":1,"387":1,"390":1,"392":3,"394":1,"402":2,"408":1,"412":1,"413":1,"416":1,"418":1,"419":2,"420":1,"421":2,"425":1,"429":1,"430":2,"431":1,"433":2,"434":1,"436":5,"440":1,"442":4,"443":1,"448":2,"455":1,"458":3,"459":1,"461":3,"464":1,"468":1,"473":1,"476":1,"477":1}}],["anywhere",{"2":{"142":1,"153":1,"154":1}}],["anyway",{"2":{"72":1}}],["anyone",{"2":{"84":1,"357":1}}],["anything",{"2":{"30":1,"194":1}}],["any",{"0":{"23":1,"37":1,"39":1,"43":1,"56":1,"215":1},"2":{"0":1,"8":2,"23":1,"24":1,"25":1,"30":1,"32":1,"33":1,"35":3,"37":3,"39":4,"41":4,"42":2,"49":1,"50":2,"55":4,"63":2,"66":3,"67":1,"72":1,"73":1,"75":1,"80":6,"92":1,"126":1,"130":1,"131":1,"133":1,"145":1,"147":1,"149":1,"150":1,"151":1,"159":1,"160":1,"167":1,"172":2,"180":1,"193":3,"194":1,"216":1,"220":1,"324":1,"327":1,"328":1,"339":1,"340":1,"359":1,"366":1,"376":1,"377":1,"391":2,"407":2,"414":1,"425":1,"431":1,"433":1,"435":1,"436":1,"438":1,"442":1,"444":2,"453":1,"454":1,"455":1,"459":1}}],["answered",{"2":{"75":1}}],["answer",{"2":{"0":2,"441":2}}],["asking",{"2":{"219":1,"447":1,"458":1}}],["ask",{"0":{"218":1,"457":1},"2":{"204":1,"232":1,"470":1}}],["askforemail",{"0":{"204":1},"2":{"204":2}}],["asks",{"2":{"130":1}}],["aspects",{"2":{"439":1}}],["aspect",{"2":{"194":2,"206":1}}],["asequencebackendmanager",{"2":{"167":1}}],["assigned",{"2":{"397":2}}],["assistance",{"2":{"23":1,"43":1,"56":1,"57":2,"385":1}}],["assured",{"2":{"357":1}}],["assuming",{"2":{"172":1}}],["assumes",{"2":{"194":1}}],["assume",{"2":{"67":1}}],["assembled",{"2":{"323":1}}],["assets",{"2":{"4":1,"50":3,"62":1,"78":1,"115":5,"129":1,"130":2,"132":2,"139":1,"158":1,"187":3,"190":1}}],["assetid",{"2":{"4":2}}],["assetidorassettype",{"2":{"4":1}}],["assettype",{"2":{"4":3}}],["asset",{"2":{"4":6,"61":1,"62":1}}],["asstring",{"2":{"301":2}}],["associated",{"2":{"185":1,"226":1,"421":1,"464":1}}],["association",{"2":{"133":1}}],["asynchronous",{"2":{"142":1,"153":1,"154":1,"290":1}}],["async",{"2":{"7":1,"66":2,"72":1,"77":1,"80":5,"85":2,"120":1,"142":1,"153":1,"154":1,"278":2,"290":1,"323":1,"385":1,"442":3}}],["as",{"0":{"242":1,"371":1},"2":{"0":2,"3":3,"4":2,"8":1,"26":3,"30":2,"43":1,"49":2,"50":2,"52":1,"53":2,"56":1,"57":1,"61":1,"62":1,"63":4,"64":1,"72":1,"75":2,"80":4,"84":1,"85":1,"91":1,"92":1,"94":1,"96":1,"99":1,"100":1,"101":1,"113":1,"114":1,"123":2,"130":2,"131":2,"133":1,"135":1,"141":2,"142":1,"143":5,"144":1,"146":1,"148":2,"150":4,"151":1,"154":1,"155":4,"158":1,"160":1,"168":1,"172":1,"177":2,"180":1,"186":2,"187":4,"190":3,"191":1,"201":1,"212":1,"216":2,"219":1,"220":2,"223":2,"231":1,"232":2,"233":2,"234":2,"235":1,"239":1,"240":1,"242":1,"245":1,"251":1,"261":1,"278":1,"280":1,"287":1,"294":1,"299":1,"300":1,"302":1,"303":1,"304":1,"305":1,"308":1,"310":1,"312":1,"313":1,"314":1,"322":2,"323":2,"325":3,"327":1,"328":1,"331":1,"332":1,"340":2,"347":1,"348":1,"352":1,"355":1,"356":1,"365":1,"366":1,"371":1,"373":1,"379":1,"384":1,"385":1,"392":1,"395":1,"400":1,"401":1,"419":4,"420":3,"421":1,"425":1,"430":1,"434":1,"435":1,"436":1,"437":3,"438":2,"440":1,"441":4,"449":1,"450":1,"458":1,"459":2,"461":2,"469":1,"470":2,"471":2,"472":2,"473":1,"477":1,"478":1}}],["a",{"0":{"3":1,"7":1,"11":1,"13":1,"14":1,"19":1,"40":1,"41":1,"65":1,"68":1,"74":1,"75":1,"85":1,"87":1,"123":1,"226":1,"235":1,"288":1,"289":1,"344":1,"361":1,"368":1,"464":1,"473":1},"1":{"41":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"75":1,"76":2,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"0":1,"1":2,"2":3,"3":4,"6":1,"7":4,"8":6,"11":2,"23":2,"24":2,"25":1,"26":2,"30":1,"32":2,"33":6,"35":4,"37":7,"39":3,"41":3,"43":2,"45":1,"49":2,"50":6,"51":2,"54":3,"55":1,"56":2,"57":5,"61":2,"62":3,"64":3,"65":1,"66":16,"67":4,"72":5,"73":2,"74":7,"75":4,"76":2,"77":5,"79":1,"80":9,"82":1,"83":2,"84":2,"85":4,"88":1,"91":1,"92":2,"93":1,"95":2,"96":3,"97":1,"100":1,"107":2,"113":2,"114":2,"115":1,"118":1,"120":1,"123":5,"124":1,"125":1,"126":3,"129":4,"130":8,"131":3,"132":5,"133":4,"134":2,"135":2,"139":3,"141":3,"142":6,"143":11,"144":1,"145":4,"147":4,"148":1,"149":4,"150":8,"151":5,"152":1,"153":2,"154":8,"155":6,"156":1,"158":3,"159":1,"160":4,"164":2,"165":6,"167":4,"168":2,"172":2,"173":3,"174":1,"175":1,"177":1,"179":5,"181":1,"186":1,"187":4,"188":4,"190":4,"191":2,"192":1,"193":6,"194":4,"195":1,"202":1,"206":2,"207":1,"212":1,"214":2,"216":1,"219":6,"220":2,"222":1,"223":7,"226":1,"227":1,"229":1,"230":1,"231":2,"232":4,"233":3,"234":3,"235":1,"238":1,"240":4,"241":3,"242":1,"243":2,"244":2,"245":3,"246":1,"247":1,"252":1,"253":1,"256":4,"257":1,"262":1,"263":1,"266":3,"267":1,"281":1,"282":1,"283":1,"288":3,"289":10,"290":1,"292":1,"293":4,"294":3,"295":1,"299":5,"300":5,"301":2,"302":7,"303":2,"304":3,"305":1,"306":1,"308":2,"310":3,"311":1,"312":1,"314":2,"315":2,"316":1,"318":1,"319":1,"320":1,"321":1,"322":6,"323":7,"324":1,"325":4,"326":1,"327":3,"328":1,"330":1,"331":2,"333":1,"334":1,"340":1,"341":1,"344":1,"345":1,"347":1,"348":1,"349":1,"355":1,"356":2,"357":6,"358":2,"359":1,"362":1,"365":1,"366":2,"369":1,"370":2,"371":1,"372":2,"373":3,"374":1,"379":1,"380":7,"381":5,"383":3,"384":6,"385":4,"387":3,"388":1,"390":1,"391":1,"392":1,"397":2,"399":1,"400":1,"401":1,"402":1,"405":1,"407":2,"408":1,"410":2,"412":1,"413":1,"415":1,"416":3,"419":1,"420":2,"429":1,"430":2,"431":1,"432":2,"433":3,"434":2,"435":2,"436":4,"437":4,"439":1,"440":3,"441":3,"442":6,"443":1,"444":1,"446":2,"447":2,"449":2,"450":4,"454":2,"455":2,"458":6,"459":2,"460":1,"461":7,"464":1,"465":1,"467":1,"468":1,"469":2,"470":4,"471":3,"472":3,"473":1,"476":1,"478":4}}],["swapping",{"2":{"175":1}}],["switches",{"2":{"172":1}}],["switch",{"2":{"172":1}}],["switching",{"2":{"133":1}}],["sso",{"0":{"177":1},"2":{"167":1,"169":2}}],["sqnc",{"2":{"165":1}}],["sfts",{"2":{"148":1}}],["smooth",{"2":{"95":1,"96":1,"244":1,"245":1,"372":1,"373":1}}],["smart",{"0":{"323":1,"348":1,"352":1},"1":{"349":1,"350":1,"351":1,"352":1,"353":2,"354":1},"2":{"65":1,"67":2,"141":1,"145":1,"147":1,"149":1,"150":3,"151":3,"154":4,"191":1,"220":1,"241":1,"310":1,"323":2,"324":1,"325":2,"348":2,"352":2,"356":1,"357":1,"389":1,"407":1,"459":1}}],["small",{"2":{"61":1,"231":1,"469":1}}],["sync",{"2":{"432":1}}],["synonymous",{"2":{"425":1}}],["systems",{"2":{"164":1,"172":1}}],["system",{"2":{"90":1,"127":2,"130":1,"131":1,"157":1,"176":1,"181":1,"348":1,"355":1,"364":1,"439":1}}],["symbol",{"2":{"50":1,"327":2}}],["skipfetchsetup",{"2":{"85":2}}],["skywvr",{"2":{"50":1}}],["skyweavercover",{"2":{"50":1}}],["skyweaver",{"2":{"39":3,"41":3,"50":10,"62":3}}],["shape=",{"2":{"442":1}}],["sha",{"2":{"177":1}}],["share",{"0":{"125":1},"2":{"84":1,"125":1,"204":1}}],["showing",{"2":{"334":1}}],["showcase",{"2":{"187":1}}],["showcases",{"2":{"130":1}}],["shows",{"2":{"172":1,"184":1}}],["show",{"2":{"172":1,"182":2,"211":1,"272":1}}],["showauthsuccessdelegate",{"2":{"167":3}}],["showemailinput",{"0":{"112":1}}],["shown",{"2":{"110":1,"111":1,"112":1,"113":1,"114":1,"121":1}}],["should",{"2":{"3":2,"57":1,"63":1,"66":2,"75":1,"76":1,"82":1,"83":1,"84":3,"85":1,"123":1,"129":1,"131":1,"206":1,"230":1,"241":1,"290":2,"305":1,"308":1,"310":1,"312":1,"314":1,"327":1,"331":1,"332":1,"338":1,"339":1,"370":1,"382":1,"410":1,"413":4,"415":1,"438":1,"450":1,"468":1}}],["src=",{"2":{"242":2,"371":2}}],["src",{"2":{"80":1}}],["snippets",{"2":{"192":1}}],["snippet",{"2":{"77":1,"141":1,"143":1,"144":1,"146":1,"148":1,"150":1,"154":1,"220":1,"302":1,"459":1}}],["slot",{"2":{"400":5}}],["sleepy",{"2":{"61":1}}],["slightly",{"2":{"59":1}}],["sdk",{"0":{"90":1,"95":1,"364":1},"1":{"96":1},"2":{"57":1,"66":1,"90":3,"92":1,"93":1,"126":2,"130":4,"131":6,"132":2,"133":1,"134":1,"139":5,"141":1,"145":1,"147":1,"149":1,"151":1,"152":1,"155":2,"160":3,"173":1,"190":1,"220":1,"238":1,"241":2,"243":1,"292":1,"364":3,"366":1,"370":2,"439":1,"441":3,"442":2,"455":1,"459":1,"476":1}}],["sdks",{"2":{"26":1,"29":1,"48":1,"53":1,"90":1,"91":1,"180":1,"181":1,"183":1,"192":1,"243":1,"364":1,"365":1,"436":1}}],["salt",{"2":{"392":1,"395":1,"396":1,"408":1,"430":1,"438":2}}],["sale",{"2":{"385":1}}],["sardine",{"2":{"347":1,"379":1}}],["savings",{"2":{"151":1}}],["saves",{"2":{"158":1}}],["save",{"2":{"6":1,"75":1,"130":1}}],["safeguarding",{"2":{"382":1}}],["safeguards",{"2":{"359":1}}],["safe",{"2":{"354":1,"359":1}}],["safety",{"2":{"328":1}}],["safetransferfrom",{"2":{"66":2,"72":2,"233":5,"234":5,"235":4,"471":5,"472":5,"473":4}}],["safemint",{"2":{"147":2}}],["safer",{"2":{"131":1}}],["say",{"2":{"50":1}}],["same",{"2":{"26":1,"50":1,"63":1,"66":1,"72":1,"148":1,"219":1,"235":1,"251":1,"261":1,"294":1,"413":1,"432":1,"440":1,"458":1,"473":1}}],["samples",{"0":{"130":1},"2":{"129":2,"130":3}}],["sample",{"2":{"26":1,"130":8,"132":1,"156":1,"442":1}}],["sociallogin",{"2":{"167":1,"169":1}}],["socialauthoptions",{"0":{"113":1},"2":{"124":2}}],["social",{"0":{"135":1,"169":1,"170":1,"381":1,"447":1},"1":{"136":1,"137":1,"138":1,"139":1,"140":1,"382":1,"383":1,"384":1},"2":{"96":1,"113":1,"127":2,"129":1,"132":1,"135":2,"141":1,"190":1,"191":1,"245":1,"353":1,"357":1,"373":1,"380":1,"381":3,"384":2,"386":1,"440":1,"441":1,"442":1,"447":1,"448":1}}],["soliditykeccak256",{"2":{"437":3}}],["soliditypack",{"2":{"393":1,"395":2,"437":1}}],["solidity",{"2":{"77":1}}],["solutions",{"2":{"1":1,"27":1,"28":1}}],["so",{"2":{"30":1,"33":1,"64":1,"74":1,"77":2,"123":1,"132":1,"133":2,"150":2,"159":1,"164":1,"167":4,"187":1,"190":1,"220":1,"288":1,"294":1,"322":2,"327":2,"339":1,"352":1,"357":1,"409":1,"411":1,"459":1}}],["sourced",{"2":{"243":1}}],["sources",{"2":{"30":2}}],["source",{"2":{"26":1,"53":1,"80":1,"94":1,"130":1,"150":2,"163":1,"194":1,"239":1,"242":1,"247":1,"257":1,"267":1,"283":1,"357":1,"371":1,"477":1}}],["soon",{"0":{"20":1,"159":1},"2":{"140":1}}],["someone",{"2":{"84":1}}],["sometimes",{"2":{"63":1,"179":1}}],["something",{"2":{"44":1,"141":1,"142":2,"153":1,"154":2,"175":1,"241":1,"331":1,"339":1,"370":1}}],["some",{"2":{"8":1,"43":1,"56":1,"59":1,"63":1,"64":1,"83":2,"84":4,"127":1,"130":3,"131":1,"135":1,"150":1,"154":1,"155":3,"158":1,"175":1,"194":1,"240":1,"287":1,"291":1,"350":1,"440":1,"478":1}}],["space",{"2":{"73":1,"353":1}}],["spaces",{"2":{"73":3}}],["spam",{"0":{"30":1},"2":{"23":1,"24":1,"30":2,"37":1,"41":1}}],["spec",{"2":{"165":1}}],["spectator",{"2":{"165":3}}],["special",{"2":{"154":1,"194":1,"255":1,"264":1,"304":1,"305":1,"308":1,"310":1,"312":1,"314":1}}],["specifying",{"2":{"124":1}}],["specify",{"2":{"37":5,"50":1,"194":1,"195":1,"207":1,"208":1,"209":1,"212":1,"347":1,"379":1}}],["specifies",{"2":{"120":1,"121":1}}],["specified",{"2":{"23":1,"212":1,"213":1,"232":1,"306":1,"308":1,"310":1,"470":1}}],["specifics",{"0":{"179":1}}],["specific",{"2":{"8":1,"23":1,"24":1,"33":1,"37":1,"41":1,"61":1,"62":1,"66":5,"72":1,"77":1,"84":1,"107":1,"135":1,"216":1,"223":1,"241":1,"305":1,"342":1,"370":1,"385":2,"461":1}}],["specs",{"2":{"74":1}}],["speed",{"2":{"65":1,"74":1}}],["spell",{"2":{"62":1}}],["sponsoring",{"0":{"67":1,"79":1},"1":{"68":1,"69":1,"70":1,"71":1,"72":1},"2":{"66":1,"67":1}}],["sponsor",{"0":{"77":1},"1":{"78":1,"79":1},"2":{"8":1,"11":1,"74":1,"79":2}}],["sponsored",{"0":{"72":1},"2":{"8":1,"67":1,"77":1,"85":1}}],["scenario",{"2":{"359":5}}],["scenarios",{"2":{"350":1,"359":1,"436":1}}],["scene",{"2":{"129":1,"130":2,"131":1,"133":1,"155":1,"158":3}}],["scenes",{"2":{"33":1,"321":1}}],["scope",{"2":{"223":1,"419":1,"420":1,"441":1,"461":1}}],["scheme=",{"2":{"139":2}}],["scheme",{"0":{"158":1},"2":{"132":1,"135":2,"136":1,"137":1,"139":3,"158":3}}],["schemes",{"2":{"127":1,"136":1,"137":1}}],["schemas",{"2":{"139":4}}],["schema",{"2":{"26":1,"61":1,"62":1}}],["scan",{"2":{"216":1,"284":1}}],["scanned",{"2":{"216":2}}],["scaffold",{"2":{"80":1}}],["scaling",{"2":{"74":1}}],["scaled",{"2":{"133":1}}],["scaler",{"2":{"133":1}}],["scale",{"2":{"6":1,"133":2}}],["scroll",{"2":{"136":1,"137":1,"339":1,"340":1}}],["scripts",{"2":{"130":1,"154":1}}],["scripting",{"2":{"130":1}}],["script",{"2":{"129":1,"130":1,"158":1,"179":5,"242":5,"371":5}}],["scriptableobject",{"2":{"132":3}}],["scriptable",{"2":{"129":1,"158":3,"302":1}}],["scratch",{"2":{"75":1}}],["screen",{"2":{"3":1,"108":1,"133":1,"196":1,"337":1}}],["s",{"2":{"4":1,"30":1,"49":1,"50":3,"61":1,"62":1,"73":1,"80":2,"93":1,"102":1,"105":1,"113":1,"114":1,"123":2,"126":1,"130":1,"141":1,"150":1,"157":1,"165":1,"169":1,"175":1,"194":1,"198":1,"201":1,"216":1,"218":1,"220":1,"223":2,"227":1,"238":1,"240":1,"272":1,"289":1,"333":1,"340":1,"352":2,"357":1,"358":3,"359":1,"380":1,"382":1,"384":1,"385":2,"388":1,"398":1,"401":1,"402":1,"409":1,"413":1,"415":1,"421":1,"441":1,"447":1,"449":1,"457":1,"459":1,"461":2,"465":1,"476":1,"478":1}}],["sum",{"2":{"430":1,"431":1}}],["summarize",{"2":{"173":1}}],["summary",{"0":{"121":1},"2":{"121":1}}],["suspicious",{"2":{"383":1}}],["sufficient",{"2":{"447":1}}],["sufficiently",{"2":{"66":1}}],["suffix",{"2":{"339":1}}],["suggestgastipcap",{"0":{"317":1},"2":{"317":1}}],["suggestgasprice",{"0":{"316":1},"2":{"316":1}}],["suggested",{"2":{"316":1,"317":1}}],["suggesting",{"2":{"61":1}}],["surf",{"2":{"193":1}}],["sure",{"2":{"26":1,"39":1,"41":1,"75":1,"80":4,"123":1,"139":1,"144":2,"165":1,"167":1}}],["subject",{"2":{"443":2}}],["subdigests",{"2":{"435":1}}],["subdigest",{"0":{"435":1},"2":{"435":3,"437":1}}],["subdomain",{"2":{"83":1,"84":1}}],["subtree",{"0":{"436":1},"2":{"433":1,"436":1}}],["subtle",{"2":{"59":1}}],["sub",{"2":{"241":3,"370":3}}],["submits",{"2":{"297":1,"298":1,"299":1,"300":1}}],["submit",{"2":{"155":1,"159":1,"315":1}}],["submitted",{"2":{"151":1,"299":3,"300":3}}],["subsequent",{"0":{"414":1},"2":{"394":1}}],["subscribe",{"2":{"141":1}}],["substitute",{"2":{"139":2}}],["succeeded",{"2":{"216":1,"454":2,"455":1}}],["success",{"2":{"83":1,"165":1}}],["successfulcontractdeploymentreturn",{"2":{"154":1}}],["successfultransactionreturn",{"2":{"142":1}}],["successfully",{"2":{"134":1,"135":1,"442":1,"454":1}}],["successful",{"0":{"454":1},"2":{"66":2,"72":1,"173":3,"453":1}}],["such",{"2":{"4":2,"50":1,"64":1,"83":1,"96":1,"99":1,"123":1,"180":1,"187":2,"190":1,"191":1,"219":1,"245":1,"255":1,"264":1,"287":1,"289":1,"359":1,"373":1,"384":2,"450":1,"451":1,"458":1}}],["suite",{"2":{"186":1}}],["suit",{"2":{"63":1,"157":1}}],["supplied",{"2":{"172":1}}],["supplies",{"0":{"41":1},"2":{"35":1,"39":1,"41":3}}],["supplement",{"2":{"130":1}}],["supplying",{"2":{"168":1}}],["supply",{"2":{"35":2}}],["supports",{"2":{"55":1,"94":1,"214":1,"216":2,"239":1,"347":1,"379":1,"477":1}}],["supported",{"0":{"34":1},"2":{"26":1,"34":1,"39":1,"41":1,"49":1,"50":1,"52":1,"59":1,"136":1,"137":1,"179":1,"207":2,"211":1,"251":1,"261":1,"352":1,"380":1,"441":1,"442":1}}],["support",{"0":{"0":1,"240":1,"478":1},"2":{"0":3,"23":1,"27":1,"28":1,"33":2,"43":1,"56":1,"57":2,"61":1,"80":1,"81":1,"122":1,"143":1,"190":2,"193":1,"243":1,"347":1,"353":1,"357":1,"377":1,"379":1,"389":1,"407":1,"418":1,"447":1}}],["super",{"2":{"33":1}}],["storage",{"2":{"223":1,"226":1,"230":1,"392":1,"396":1,"400":2,"438":2,"461":1,"464":1,"468":1}}],["stores",{"2":{"173":1,"181":1}}],["storedcredentials",{"2":{"174":1}}],["storedcredentialsvalid",{"2":{"167":1}}],["stored",{"2":{"3":1,"164":4,"223":1,"230":1,"380":1,"382":1,"392":1,"400":1,"437":1,"461":1,"468":1}}],["store",{"2":{"3":1,"63":2,"186":1,"187":2,"226":1,"392":1,"396":1,"464":1}}],["style",{"2":{"139":2}}],["styling",{"2":{"107":1}}],["still",{"2":{"126":1,"131":1,"154":1,"155":2,"160":1,"223":1,"240":1,"359":1,"408":1,"443":1,"461":1,"478":1}}],["straightforward",{"2":{"322":1}}],["streamlines",{"2":{"241":1}}],["streamlining",{"2":{"223":1,"461":1}}],["strength",{"2":{"62":1}}],["strictmode",{"2":{"442":2}}],["strictly",{"2":{"322":1}}],["stripe",{"2":{"193":1}}],["stringify",{"2":{"80":3,"385":1}}],["strings",{"2":{"43":1,"56":2,"57":2}}],["string",{"2":{"23":3,"24":4,"32":2,"37":8,"39":2,"41":3,"43":2,"56":3,"57":3,"61":3,"62":1,"63":2,"66":1,"77":1,"80":9,"83":1,"84":1,"85":2,"115":1,"132":1,"143":1,"145":1,"147":1,"149":1,"150":1,"153":1,"154":2,"219":1,"297":1,"299":3,"301":2,"302":1,"304":3,"306":1,"307":1,"309":1,"310":1,"313":2,"315":2,"322":2,"324":5,"326":1,"327":1,"385":15,"407":1,"419":1,"420":2,"437":3,"458":1}}],["structured",{"0":{"420":1},"2":{"420":1}}],["structure",{"2":{"255":2,"256":2,"264":2,"266":2,"287":3,"289":2}}],["structures",{"2":{"61":1}}],["structs",{"2":{"174":1}}],["struct",{"2":{"168":1}}],["stunt",{"2":{"61":1}}],["stud",{"2":{"61":1}}],["step",{"0":{"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1},"2":{"4":1,"67":1,"75":3,"80":1,"84":1,"85":1,"132":1,"188":2,"440":1}}],["steps",{"0":{"97":1,"246":1,"374":1},"2":{"4":2,"67":1,"74":2,"77":1,"83":1,"85":2,"100":1,"117":1,"138":1,"179":1}}],["stay",{"2":{"190":1}}],["standalone",{"2":{"127":2,"161":2}}],["standardized",{"2":{"80":1,"81":1}}],["standard",{"2":{"59":1,"61":1,"63":1,"144":1,"145":1,"146":1,"147":1,"148":2,"149":1,"220":1,"233":1,"234":1,"235":1,"240":2,"243":1,"293":1,"327":1,"377":1,"418":1,"459":1,"471":1,"472":1,"473":1,"478":2}}],["standards",{"0":{"44":1,"59":1,"60":1},"1":{"61":1,"62":1,"63":1,"64":1},"2":{"30":1,"45":2,"55":1,"59":4,"61":1,"193":1}}],["static",{"2":{"152":1,"433":1,"435":3,"437":1}}],["status",{"0":{"448":1},"1":{"449":1,"450":1,"451":1},"2":{"57":1,"66":6,"72":3,"80":10,"102":1,"385":1,"448":1,"454":3}}],["state",{"2":{"3":1,"131":1,"416":1,"432":1,"442":1}}],["startingblocknumber",{"2":{"308":1}}],["starting",{"2":{"123":1,"130":1}}],["starter",{"2":{"75":1}}],["started",{"0":{"35":1,"89":1,"98":1,"188":1,"192":1,"363":1},"1":{"90":1,"91":1,"92":1,"99":1,"364":1,"365":1,"366":1},"2":{"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1,"88":1,"97":1,"99":1,"187":1,"188":2,"192":2,"246":1,"345":1,"362":1,"369":1,"374":1,"376":1,"377":1}}],["start",{"2":{"0":1,"91":1,"92":1,"167":1,"168":2,"169":1,"175":1,"187":1,"365":1,"366":1}}],["stack",{"2":{"0":1,"6":1,"241":2}}],["situations",{"2":{"287":1}}],["situation",{"2":{"240":1,"478":1}}],["site",{"2":{"75":1}}],["size",{"2":{"133":1,"136":1,"137":1}}],["side",{"0":{"220":1,"459":1},"2":{"66":1,"167":1,"179":1,"220":1,"223":1,"228":1,"229":1,"230":1,"240":1,"255":1,"264":1,"359":1,"459":1,"461":1,"466":1,"467":1,"468":1,"478":1}}],["six",{"2":{"62":1}}],["simulation",{"2":{"455":1}}],["simulations",{"2":{"454":1,"455":1}}],["simulating",{"2":{"455":1}}],["similarly",{"2":{"167":1,"277":1,"278":1,"299":1,"300":1,"441":1}}],["similar",{"2":{"59":1,"133":1,"142":1,"165":1,"175":1,"233":1,"234":1,"241":1,"328":1,"420":1,"471":1,"472":1}}],["simply",{"2":{"4":2,"26":1,"49":1,"50":1,"53":1,"130":1,"151":1,"190":1,"323":1,"325":1,"332":1}}],["simpler",{"2":{"219":1,"458":1}}],["simple",{"2":{"1":1,"2":1,"8":1,"25":1,"33":1,"45":1,"49":1,"51":1,"172":1,"193":1,"219":1,"340":1,"350":1,"357":1,"442":1,"458":1}}],["silently",{"2":{"290":1,"451":1}}],["silence",{"2":{"50":1}}],["silvercardid",{"2":{"50":1}}],["silver",{"2":{"50":1,"61":1,"62":3}}],["signtransactions",{"2":{"231":1,"469":1}}],["sign+verify",{"2":{"219":1,"458":1}}],["signedtransactionstring",{"2":{"315":1}}],["signedmessage",{"2":{"301":2}}],["signed",{"0":{"419":1},"2":{"194":2,"207":1,"208":1,"209":1,"219":3,"220":1,"223":1,"231":1,"315":1,"419":3,"420":1,"421":1,"431":1,"458":3,"459":1,"461":1,"469":1}}],["signer2",{"2":{"73":2}}],["signer1",{"2":{"73":2}}],["signerssigner",{"2":{"388":1}}],["signers",{"0":{"391":1},"2":{"73":1,"356":1,"387":1,"388":2,"390":2,"391":2,"393":1,"396":1,"399":1,"401":1,"402":1,"406":1,"407":4,"419":1,"420":1,"430":1,"431":1,"433":1,"434":1,"436":2}}],["signer",{"0":{"357":1,"358":1,"389":1,"434":1},"1":{"390":1,"391":1},"2":{"66":7,"72":4,"77":3,"85":4,"225":2,"227":1,"231":2,"232":4,"233":4,"234":4,"235":4,"389":2,"393":6,"401":1,"433":1,"434":2,"463":2,"465":1,"469":2,"470":4,"471":4,"472":4,"473":4}}],["signmessagereturn",{"2":{"153":1}}],["signmessage",{"0":{"301":1},"2":{"153":3,"227":1,"229":1,"301":2,"419":1,"420":1,"465":1,"467":1}}],["signinwithemail",{"0":{"208":1},"2":{"208":2}}],["signinwith",{"0":{"207":1},"2":{"207":2}}],["signinoptions",{"0":{"209":1},"2":{"194":2,"209":2}}],["signingin",{"2":{"442":1}}],["signing",{"2":{"132":1,"133":1,"153":1,"179":1,"190":1,"200":1,"216":1,"219":1,"223":1,"231":1,"418":1,"419":1,"420":1,"440":2,"450":1,"458":1,"461":1,"469":1}}],["signin",{"0":{"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"169":1,"170":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1},"2":{"109":1,"124":1,"167":1,"440":1,"441":1,"442":1,"443":1,"444":1,"454":1,"455":1}}],["signs",{"2":{"102":1,"135":1,"297":1,"298":1,"299":1,"300":1}}],["signaturevalidation",{"2":{"421":1}}],["signatures",{"0":{"222":1,"420":1,"460":1},"2":{"240":1,"392":1,"401":1,"402":1,"408":1,"419":1,"420":1,"421":5,"429":1,"431":1,"478":1}}],["signature",{"0":{"217":1,"228":1,"230":1,"418":1,"456":1,"466":1,"468":1},"1":{"218":1,"219":1,"220":1,"419":1,"420":1,"421":1,"457":1,"458":1,"459":1},"2":{"74":1,"150":2,"153":1,"219":1,"220":1,"227":1,"228":2,"230":3,"301":1,"322":1,"323":1,"388":1,"389":1,"392":1,"418":1,"419":2,"420":2,"421":8,"430":1,"433":2,"435":3,"436":1,"438":1,"458":1,"459":1,"465":1,"466":2,"468":3}}],["signals",{"2":{"73":1}}],["sign",{"0":{"109":1,"134":1,"135":1,"153":1,"227":1,"229":1,"440":2,"441":2,"465":1,"467":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"136":1,"137":1,"138":1,"139":1,"140":1,"441":2,"442":2},"2":{"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1,"66":1,"77":1,"102":1,"109":1,"110":1,"111":1,"112":1,"113":1,"127":2,"129":1,"132":1,"134":1,"135":2,"141":1,"153":1,"194":1,"204":1,"207":1,"208":1,"209":1,"219":2,"222":1,"227":1,"229":1,"301":1,"337":1,"339":1,"341":1,"356":1,"358":1,"429":1,"436":1,"440":1,"441":1,"458":2,"460":1,"465":1,"467":1}}],["signup",{"2":{"11":1}}],["singlesigner",{"2":{"66":2,"72":1,"77":1,"85":1}}],["single",{"2":{"6":1,"8":1,"50":1,"54":1,"64":1,"85":1,"148":1,"151":1,"232":3,"233":2,"234":2,"235":1,"241":1,"299":1,"300":1,"333":1,"349":1,"370":1,"380":1,"437":2,"470":3,"471":2,"472":2,"473":1}}],["since",{"2":{"3":1,"130":1,"151":1,"167":1,"312":1,"327":1,"382":1,"412":1,"413":1}}],["sepolia",{"2":{"346":1,"385":2}}],["separate",{"2":{"332":1}}],["separated",{"2":{"50":1}}],["several",{"2":{"241":1,"370":1}}],["self",{"2":{"399":1,"407":1,"412":1}}],["selling",{"2":{"187":2}}],["sell",{"2":{"184":1}}],["selector",{"2":{"421":1}}],["selects",{"2":{"216":1}}],["selected",{"2":{"183":1}}],["selecting",{"2":{"77":1,"289":1}}],["selectfee",{"2":{"66":1,"72":1}}],["select",{"2":{"66":1,"77":1,"84":1,"136":2,"137":2,"179":1,"192":1,"336":1}}],["selectwallet",{"2":{"66":1}}],["series",{"2":{"167":1,"182":1}}],["serves",{"2":{"130":1}}],["servers",{"2":{"141":1,"383":1}}],["serverprivatekey",{"2":{"66":2,"72":1}}],["serverless",{"0":{"19":1,"74":1},"1":{"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"74":1,"342":1}}],["server",{"0":{"65":1,"66":1,"67":1,"220":1,"459":1},"1":{"66":1,"67":1,"68":2,"69":2,"70":2,"71":2,"72":2,"73":1},"2":{"4":2,"26":1,"33":1,"65":1,"66":6,"72":3,"77":2,"220":2,"228":1,"230":1,"240":1,"255":1,"264":1,"287":2,"289":1,"459":2,"466":1,"468":1,"478":1}}],["services",{"2":{"30":2,"63":1,"240":1,"478":1}}],["service",{"0":{"3":1},"2":{"1":1,"2":4,"3":2,"4":1,"8":1,"11":1,"22":1,"25":1,"30":1,"31":1,"33":3,"36":1,"38":1,"40":1,"45":2,"49":3,"51":1,"53":2,"55":1,"57":1,"59":1,"155":1,"302":1,"355":1,"357":1,"358":1}}],["semi",{"2":{"148":1,"432":1}}],["semantic",{"2":{"126":1,"160":1}}],["sessionid",{"2":{"440":1,"444":1}}],["sessionhash",{"2":{"440":3,"441":2,"442":6}}],["sessionaddress",{"2":{"226":1,"230":1,"464":1,"468":1}}],["sessionwallet",{"2":{"226":2,"229":1,"464":2,"467":1}}],["sessionprivatekey",{"2":{"226":4,"464":4}}],["sessionsignature",{"2":{"229":1,"230":1,"467":1,"468":1}}],["sessions",{"0":{"443":1},"2":{"220":2,"440":1,"443":4,"444":2,"459":2}}],["sessionsettings",{"2":{"85":2}}],["session",{"0":{"223":1,"224":1,"226":1,"229":1,"230":1,"382":1,"439":1,"444":1,"449":1,"451":1,"452":1,"461":1,"462":1,"464":1,"467":1,"468":1},"1":{"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"440":1,"441":1,"442":1,"443":1,"444":1,"450":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1},"2":{"66":14,"72":6,"73":2,"75":1,"77":5,"85":5,"133":1,"134":1,"173":2,"174":1,"216":1,"222":1,"223":4,"227":1,"228":2,"229":1,"230":5,"357":2,"381":4,"382":2,"383":1,"439":1,"441":3,"442":5,"444":4,"448":1,"449":2,"450":3,"451":3,"452":2,"454":1,"455":1,"460":1,"461":4,"465":1,"466":2,"467":1,"468":5}}],["seamless",{"2":{"74":1,"87":1,"125":1,"187":1,"191":1,"219":1,"358":1,"361":1,"458":1}}],["seamlessly",{"0":{"244":1,"372":1},"1":{"245":1,"373":1},"2":{"33":1,"96":1,"245":1,"373":1}}],["seaman",{"2":{"61":1}}],["senttransactionresponse",{"2":{"454":1}}],["sent",{"2":{"181":1,"185":1,"235":1,"340":1,"454":1,"455":2,"473":1}}],["sensical",{"2":{"59":1}}],["sends",{"2":{"338":1,"446":1,"451":1}}],["sendquery",{"2":{"325":3}}],["sendrawtransaction",{"0":{"315":1},"2":{"315":1}}],["senderc1155values",{"2":{"148":3,"151":2}}],["senderc1155",{"0":{"148":1},"1":{"149":1},"2":{"148":1,"151":1}}],["senderc721",{"0":{"146":1},"1":{"147":1},"2":{"146":1,"151":1}}],["senderc20",{"0":{"144":1},"1":{"145":1},"2":{"144":1,"151":1,"450":1}}],["senderaddress",{"2":{"66":1,"72":1}}],["sending",{"0":{"231":1,"232":1,"233":1,"234":1,"235":1,"469":1,"470":1,"471":1,"472":1,"473":1},"2":{"73":1,"142":1,"151":2,"154":1,"233":2,"234":2,"327":1,"440":1,"450":1,"453":1,"455":1,"471":2,"472":2}}],["sendtransactionmethod",{"2":{"323":1}}],["sendtransactionmethodandwaitforreceipt",{"2":{"323":2,"327":1}}],["sendtransactionandwaitforreceipt",{"0":{"298":1},"2":{"298":1,"300":1,"321":1,"323":2,"327":1}}],["sendtransactionbatchandwaitforreceipts",{"0":{"300":1}}],["sendtransactionbatch",{"0":{"299":1},"2":{"233":1,"234":1,"299":1,"471":1,"472":1}}],["sendtransaction",{"0":{"297":1},"2":{"66":1,"72":1,"73":3,"85":1,"142":2,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":2,"151":2,"154":1,"231":2,"232":2,"233":1,"234":1,"235":2,"297":1,"451":1,"452":1,"454":1,"455":2,"469":2,"470":2,"471":1,"472":1,"473":2}}],["send",{"2":{"8":1,"66":2,"67":1,"72":1,"73":2,"143":2,"144":1,"145":1,"146":1,"147":1,"148":2,"149":1,"150":1,"168":1,"232":3,"233":2,"234":2,"323":1,"325":1,"327":1,"441":2,"447":1,"449":1,"470":3,"471":2,"472":2}}],["sequentially",{"2":{"65":1,"299":1,"300":1}}],["sequentual",{"2":{"65":1}}],["sequenceonboard",{"2":{"269":2}}],["sequenceoptions",{"2":{"269":1}}],["sequencemodule",{"2":{"269":2}}],["sequencemetadata",{"2":{"43":2,"46":2,"56":2,"57":4}}],["sequencewallet",{"2":{"259":2}}],["sequencewaas",{"2":{"92":2,"366":2,"440":2,"441":2,"442":2,"443":2,"444":2,"454":1,"455":1}}],["sequenceutils",{"2":{"424":1}}],["sequenceunreal",{"2":{"179":2}}],["sequenceui",{"2":{"165":1}}],["sequencebackendmanager",{"2":{"167":3}}],["sequenceplugin",{"2":{"163":2,"165":4}}],["sequencecontext",{"2":{"424":1}}],["sequenceconnector",{"2":{"249":2,"277":2,"278":3}}],["sequenceconfig",{"2":{"129":1,"132":4,"136":1,"137":1,"139":1,"302":1}}],["sequencecanvas",{"2":{"158":1}}],["sequencesdk",{"2":{"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":2,"151":1}}],["sequenceethclient",{"2":{"302":2,"303":1}}],["sequenceethereum",{"2":{"126":1,"145":1,"147":1,"149":1,"290":3,"291":1,"292":1,"294":1,"302":1,"324":1}}],["sequenceencryptor",{"2":{"164":1}}],["sequenceexamples",{"2":{"133":1,"155":2}}],["sequenceapiclient",{"2":{"80":1}}],["sequenceindexer",{"2":{"23":2,"24":2,"27":2,"32":2,"37":2,"39":2,"41":2}}],["sequencekit",{"0":{"12":1,"95":1},"1":{"96":1},"2":{"191":1,"368":1,"369":1}}],["sequence",{"0":{"67":1,"98":1,"99":1,"122":1,"172":1,"173":1,"175":1,"189":1,"215":1,"224":1,"225":1,"236":1,"244":1,"329":1,"335":1,"355":1,"357":1,"358":1,"372":1,"462":1,"463":1,"474":1},"1":{"68":1,"69":1,"70":1,"71":1,"72":1,"99":1,"123":1,"190":1,"191":1,"192":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"237":1,"238":1,"239":1,"240":1,"245":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"356":1,"357":1,"358":1,"359":1,"373":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"475":1,"476":1,"477":1,"478":1},"2":{"0":2,"1":2,"2":2,"4":8,"5":2,"6":1,"7":1,"8":5,"11":1,"22":3,"23":7,"24":6,"25":5,"26":5,"27":3,"28":4,"29":3,"30":6,"31":3,"32":6,"33":6,"36":3,"37":6,"38":3,"39":7,"40":3,"41":6,"42":2,"43":5,"45":2,"46":2,"47":2,"48":3,"49":3,"50":4,"52":6,"54":1,"55":3,"56":5,"57":10,"59":1,"61":4,"62":1,"65":2,"66":10,"67":1,"72":4,"74":2,"77":6,"80":9,"81":2,"85":4,"91":2,"92":1,"93":5,"94":1,"95":1,"96":1,"97":2,"98":1,"99":1,"104":1,"105":1,"107":2,"114":1,"117":1,"122":2,"123":2,"124":2,"125":1,"126":2,"129":1,"130":1,"131":1,"132":2,"139":5,"151":2,"152":2,"156":1,"158":1,"160":4,"163":3,"165":3,"167":1,"172":6,"173":1,"179":3,"180":2,"181":1,"183":1,"184":1,"186":1,"189":1,"192":1,"193":10,"194":9,"195":1,"205":2,"210":1,"211":1,"214":1,"215":1,"216":6,"218":2,"219":3,"220":4,"222":1,"223":1,"227":1,"228":1,"238":5,"239":1,"240":5,"241":3,"243":6,"244":1,"245":1,"246":2,"247":2,"252":1,"253":1,"257":2,"262":1,"263":1,"267":2,"268":3,"269":1,"271":1,"272":1,"273":1,"277":1,"278":2,"280":1,"281":1,"283":2,"284":2,"285":1,"330":1,"335":1,"336":1,"340":1,"342":3,"346":1,"347":4,"348":1,"354":1,"355":2,"356":1,"357":2,"358":4,"359":4,"365":2,"366":1,"370":1,"372":1,"373":1,"374":2,"376":3,"377":4,"378":1,"379":4,"380":2,"381":3,"384":1,"385":2,"387":1,"396":2,"397":1,"401":1,"408":1,"418":1,"419":1,"420":1,"425":3,"429":1,"430":1,"435":1,"436":1,"437":2,"438":1,"439":1,"440":1,"441":1,"442":8,"447":1,"454":1,"455":1,"457":2,"458":3,"459":4,"460":1,"461":1,"465":1,"466":1,"476":5,"477":1,"478":5}}],["seqmetadata",{"2":{"43":2,"47":2,"56":2,"57":4}}],["seqindexer",{"2":{"23":1,"24":1,"28":2,"32":1,"37":1,"39":1,"41":1}}],["seterror",{"2":{"442":3}}],["setbasemetadatauri",{"2":{"338":1,"339":1}}],["setitem",{"2":{"226":1,"464":1}}],["setopenwalletmodal",{"2":{"103":2}}],["setopenconnectmodal",{"2":{"102":2}}],["setting",{"0":{"100":1,"101":1},"2":{"287":1,"289":1}}],["settings",{"0":{"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1},"2":{"3":1,"30":1,"85":3,"118":1,"120":1,"132":1,"136":4,"137":4,"139":2,"163":1,"165":1,"179":2,"194":8,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1}}],["setupcredentials",{"2":{"165":1}}],["setup",{"0":{"75":1,"91":1,"92":1,"132":1,"165":1,"177":1,"365":1,"366":1},"1":{"76":1},"2":{"74":1,"129":3,"130":1,"132":1,"142":1,"153":1,"154":1,"165":2,"167":1,"172":2,"178":1,"288":1,"384":1}}],["setsigningin",{"2":{"442":1}}],["setsessionhash",{"2":{"442":3}}],["sets",{"2":{"4":1,"172":1,"442":1}}],["set",{"0":{"332":1,"335":1,"339":1},"2":{"3":1,"4":1,"30":1,"61":1,"75":1,"80":4,"135":1,"139":3,"158":3,"176":1,"213":1,"335":1,"338":1,"339":1,"396":1,"401":1,"413":1,"429":1,"435":1}}],["seemlessly",{"2":{"151":1}}],["seen",{"2":{"59":1,"63":1,"356":1}}],["see",{"2":{"3":1,"23":1,"25":1,"27":2,"28":2,"34":1,"42":1,"49":1,"50":3,"55":1,"61":3,"62":2,"63":1,"66":1,"72":1,"80":1,"81":1,"85":1,"113":1,"114":1,"127":1,"131":2,"133":1,"139":2,"141":1,"143":1,"150":1,"180":2,"181":1,"182":1,"194":1,"206":1,"214":1,"220":1,"240":1,"243":3,"255":4,"264":4,"287":2,"341":1,"344":1,"347":1,"376":1,"377":1,"379":1,"416":1,"440":1,"442":3,"454":1,"455":1,"459":1,"478":1}}],["security",{"0":{"164":1},"2":{"193":2,"348":1,"357":1,"380":1,"384":2}}],["secured",{"2":{"381":1}}],["secure",{"2":{"11":1,"74":1,"95":1,"96":1,"181":1,"223":2,"244":1,"245":1,"357":1,"372":1,"373":1,"380":2,"461":2}}],["securely",{"2":{"3":2,"164":2,"342":1}}],["seconds",{"2":{"158":1,"199":2}}],["second",{"2":{"50":1,"130":1,"143":1,"440":1}}],["secret",{"2":{"3":3,"4":1}}],["section",{"2":{"2":1,"4":1,"23":1,"61":1,"64":1,"66":1,"81":1,"136":1,"137":1,"139":1,"143":1,"255":2,"264":2,"335":1,"338":1,"341":1,"419":1,"420":1,"454":1,"455":1}}]],"serializationVersion":2}
diff --git a/.vocs/search-index-f3270585.json b/.vocs/search-index-f3270585.json
deleted file mode 100644
index 4257b7b7e0c..00000000000
--- a/.vocs/search-index-f3270585.json
+++ /dev/null
@@ -1 +0,0 @@
-{"documentCount":473,"nextId":473,"documentIds":{"0":"docs/pages/support.mdx#support","1":"docs/pages/api/marketplace.mdx#marketplace-api","2":"docs/pages/api/metadata.mdx#metadata-api","3":"docs/pages/api/metadata.mdx#obtaining-a-service-account--token","4":"docs/pages/api/metadata.mdx#creating-collections-tokens-and-managing-metadata","5":"docs/pages/api/metadata.mdx#pricing--usage","6":"docs/pages/api/node-gateway.mdx#node-gateway","7":"docs/pages/api/node-gateway.mdx#give-it-a-try","8":"docs/pages/api/relayer.mdx#relayer-api","9":"docs/pages/guides/lootbox.mdx#deploy-an-in-game-collectibles-contract","10":"docs/pages/guides/lootbox.mdx#query-contract-details","11":"docs/pages/guides/lootbox.mdx#fetch-token-balances-of-a-wallet","12":"docs/pages/guides/unity-guide.mdx#integrate-sequencekit-with-waas","13":"docs/pages/guides/unity-guide.mdx#deploy-a-collectibles-contract","14":"docs/pages/guides/unity-guide.mdx#deploy-a-remote-minter","15":"docs/pages/guides/unity-guide.mdx#mint-in-game-achievement-tokens","16":"docs/pages/guides/unity-guide.mdx#burn-in-game-achievement-tokens","17":"docs/pages/guides/unity-guide.mdx#integrate-an-embedded-marketplace","18":"docs/pages/solutions/minter.mdx#mint-tokens-using-builder-manually","19":"docs/pages/solutions/minter.mdx#deploy-a-serverless-minter-on-cloudflare-workers","20":"docs/pages/solutions/nft-checkout.mdx#integrate-nft-checkout-on-web-coming-soon","21":"docs/pages/solutions/onramps.mdx#integrate-onramp-on-web","22":"docs/pages/api/indexer/fetch-tokens.mdx#tokens-api","23":"docs/pages/api/indexer/fetch-tokens.mdx#fetches-list-of-erc20-erc721-and-erc1155-tokens-and-metadata-in-any-wallet","24":"docs/pages/api/indexer/fetch-tokens.mdx#fetch-token-ids-balances-and-metadata-of-erc721-and-erc1155-collections","25":"docs/pages/api/indexer/installation.mdx#indexer-installation","26":"docs/pages/api/indexer/installation.mdx#installation","27":"docs/pages/api/indexer/installation.mdx#web--nodejs-installation","28":"docs/pages/api/indexer/installation.mdx#go-installation","29":"docs/pages/api/indexer/installation.mdx#unity-or-unreal-installation","30":"docs/pages/api/indexer/metadata-tips.mdx#metadata-tips--notes-on-spam","31":"docs/pages/api/indexer/native-network-balance.mdx#native-network-balances-ie-eth-matic-etc","32":"docs/pages/api/indexer/native-network-balance.mdx#fetch-native-network-balance-aka-eth-on-ethereum-matic-on-polygon-avax-on-avalanche-bnb-on-bsc-etc","33":"docs/pages/api/indexer/overview.mdx#indexer","34":"docs/pages/api/indexer/overview.mdx#supported-networks--endpoints","35":"docs/pages/api/indexer/overview.mdx#getting-started","36":"docs/pages/api/indexer/transaction-history.mdx#wallet-transaction-history","37":"docs/pages/api/indexer/transaction-history.mdx#fetch-the-transaction-history-for-any-wallet-address","38":"docs/pages/api/indexer/transation-history-token-contract.mdx#contract-token-history","39":"docs/pages/api/indexer/transation-history-token-contract.mdx#fetch--listen-to-the-transaction-history-for-any-erc20-erc721-erc1155-contract","40":"docs/pages/api/indexer/unique-tokens.mdx#tokens-in-a-contract","41":"docs/pages/api/indexer/unique-tokens.mdx#fetch-all-unique-tokens-in-a-particular-erc207211155-contract-including-total-supplies","42":"docs/pages/api/metadata/contract-metadata.mdx#contract-metadata","43":"docs/pages/api/metadata/contract-metadata.mdx#fetch-contract-metadata-of-any-erc20-erc721-or-erc1155-contract-address","44":"docs/pages/api/metadata/contract-metadata.mdx#contract-level-metadata-standards","45":"docs/pages/api/metadata/overview.mdx#metadata","46":"docs/pages/api/metadata/overview.mdx#web--nodejs-installation","47":"docs/pages/api/metadata/overview.mdx#go-installation","48":"docs/pages/api/metadata/overview.mdx#unity-or-unreal-installation","49":"docs/pages/api/metadata/rest-api.mdx#metadata-rest-api-reference--usage","50":"docs/pages/api/metadata/rest-api.mdx#example","51":"docs/pages/api/metadata/rest-api.mdx#usage","52":"docs/pages/api/metadata/rest-api.mdx#rest-endpoints","53":"docs/pages/api/metadata/rest-api.mdx#rpc-client","54":"docs/pages/api/metadata/rest-api.mdx#metadata-rpc-methods","55":"docs/pages/api/metadata/token-metadata.mdx#token-metadata","56":"docs/pages/api/metadata/token-metadata.mdx#fetch-token-metadata-for-any-erc721-or-erc1155-contract","57":"docs/pages/api/metadata/token-metadata.mdx#refreshing-token-metadata","58":"docs/pages/api/metadata/token-metadata.mdx#testing-instructions","59":"docs/pages/api/metadata/token-metadata.mdx#token-metadata-standards","60":"docs/pages/api/metadata/token-metadata.mdx#metadata-standards","61":"docs/pages/api/metadata/token-metadata.mdx#erc721","62":"docs/pages/api/metadata/token-metadata.mdx#erc1155","63":"docs/pages/api/metadata/token-metadata.mdx#attributes-vs-properties","64":"docs/pages/api/metadata/token-metadata.mdx#erc20","65":"docs/pages/guides/templates/02-building-relaying-server.mdx#building-a-relaying-server","66":"docs/pages/guides/templates/02-building-relaying-server.mdx#nodejs-server","67":"docs/pages/guides/templates/02-building-relaying-server.mdx#nodejs-server-with-gas-sponsoring-using-sequence-builder","68":"docs/pages/guides/templates/02-building-relaying-server.mdx#a-create-dapp","69":"docs/pages/guides/templates/02-building-relaying-server.mdx#b-new-dapp","70":"docs/pages/guides/templates/02-building-relaying-server.mdx#c1-gas-tank","71":"docs/pages/guides/templates/02-building-relaying-server.mdx#c2-add-gas","72":"docs/pages/guides/templates/02-building-relaying-server.mdx#c3-add-sponsored-address","73":"docs/pages/guides/templates/02-building-relaying-server.mdx#parallel-transactions","74":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#mint-collectibles-using-a-gasless-serverless-relayer","75":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#1-setup-cloudflare-environment-with-wrangler-cli-and-deploy-a-test","76":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#deploy-test","77":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#2-deploy-sponsor-and-update-metadata-for-an-erc1155-contract-with-builder","78":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#update-metadata","79":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#contract-sponsoring","80":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#3-use-ethauthproof-to-prevent-eoa-ddos","81":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#add-cloudflare-environment-variables","82":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#implement-window-object-in-wrangler-template","83":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#testing-the-deploy","84":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#using-the-ethauthproof-viewer-dapp","85":"docs/pages/guides/templates/03-mint-collectibles-serverless.mdx#4-mint-a-collectible-to-wallet","86":"docs/pages/guides/templates/template-embedded-wallet.mdx#quickstart","87":"docs/pages/guides/templates/template-embedded-wallet.mdx#try-a-demo","88":"docs/pages/guides/templates/template-embedded-wallet.mdx#template","89":"docs/pages/guides/templates/template-embedded-wallet.mdx#getting-started","90":"docs/pages/guides/templates/template-embedded-wallet.mdx#sdk-installation","91":"docs/pages/guides/templates/template-embedded-wallet.mdx#project-setup","92":"docs/pages/guides/templates/template-embedded-wallet.mdx#library-setup","93":"docs/pages/sdk/go/overview.mdx#go","94":"docs/pages/sdk/go/overview.mdx#ethkit","95":"docs/pages/sdk/sequence-kit/01-overview.mdx#sequencekit-sdk","96":"docs/pages/sdk/sequence-kit/01-overview.mdx#key-features","97":"docs/pages/sdk/sequence-kit/01-overview.mdx#next-steps","98":"docs/pages/sdk/sequence-kit/02-getting-started.mdx#getting-started-with-sequence-kit","99":"docs/pages/sdk/sequence-kit/02-getting-started.mdx#installing-sequence-kit-packages","100":"docs/pages/sdk/sequence-kit/02-getting-started.mdx#setting-up-the-kit-wrapper","101":"docs/pages/sdk/sequence-kit/02-getting-started.mdx#setting-up-the-embedded-wallet-wrapper","102":"docs/pages/sdk/sequence-kit/02-getting-started.mdx#triggering-the-connect-modal","103":"docs/pages/sdk/sequence-kit/02-getting-started.mdx#invoking-the-embedded-wallet-modal","104":"docs/pages/sdk/sequence-kit/02-getting-started.mdx#react-example","105":"docs/pages/sdk/sequence-kit/03-configuration.mdx#configuration-options","106":"docs/pages/sdk/sequence-kit/03-configuration.mdx#available-options","107":"docs/pages/sdk/sequence-kit/03-configuration.mdx#defaulttheme","108":"docs/pages/sdk/sequence-kit/03-configuration.mdx#position","109":"docs/pages/sdk/sequence-kit/03-configuration.mdx#sign-in-modal-configuration-signin","110":"docs/pages/sdk/sequence-kit/03-configuration.mdx#signinlogourl","111":"docs/pages/sdk/sequence-kit/03-configuration.mdx#signinprojectname","112":"docs/pages/sdk/sequence-kit/03-configuration.mdx#signinshowemailinput","113":"docs/pages/sdk/sequence-kit/03-configuration.mdx#signinsocialauthoptions","114":"docs/pages/sdk/sequence-kit/03-configuration.mdx#signinwalletauthoptions","115":"docs/pages/sdk/sequence-kit/03-configuration.mdx#displayedassets","116":"docs/pages/sdk/sequence-kit/04-checkout.mdx#overview","117":"docs/pages/sdk/sequence-kit/04-checkout.mdx#integration","118":"docs/pages/sdk/sequence-kit/04-checkout.mdx#opening-the-checkout-modal","119":"docs/pages/sdk/sequence-kit/04-checkout.mdx#configuring-the-checkout-modal","120":"docs/pages/sdk/sequence-kit/04-checkout.mdx#crypto-checkout-configuration-cryptocheckout","121":"docs/pages/sdk/sequence-kit/04-checkout.mdx#order-summary-configuration-ordersummaryitems","122":"docs/pages/sdk/sequence-kit/05-custom-connectors.mdx#custom-connectors-in-sequence-kit","123":"docs/pages/sdk/sequence-kit/05-custom-connectors.mdx#creating-a-custom-connector","124":"docs/pages/sdk/sequence-kit/05-custom-connectors.mdx#using-custom-connectors","125":"docs/pages/sdk/sequence-kit/05-custom-connectors.mdx#share-your-custom-connectors","126":"docs/pages/sdk/unity/01-overview.mdx#introduction","127":"docs/pages/sdk/unity/01-overview.mdx#requirements","128":"docs/pages/sdk/unity/02-installation.mdx#installation","129":"docs/pages/sdk/unity/02-installation.mdx#package-manager---recommended","130":"docs/pages/sdk/unity/02-installation.mdx#samples","131":"docs/pages/sdk/unity/02-installation.mdx#manual","132":"docs/pages/sdk/unity/03-setup.mdx#setup","133":"docs/pages/sdk/unity/04-authentication.mdx#authentication","134":"docs/pages/sdk/unity/04-authentication.mdx#1-email-sign-in","135":"docs/pages/sdk/unity/04-authentication.mdx#2-social-sign-in","136":"docs/pages/sdk/unity/04-authentication.mdx#ios","137":"docs/pages/sdk/unity/04-authentication.mdx#macos","138":"docs/pages/sdk/unity/04-authentication.mdx#pc","139":"docs/pages/sdk/unity/04-authentication.mdx#android","140":"docs/pages/sdk/unity/04-authentication.mdx#webgl","141":"docs/pages/sdk/unity/04-authentication.mdx#connecting-with-waas","142":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#write-to-blockchain","143":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#rawtransaction","144":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#senderc20","145":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#complex-erc20-interactions","146":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#senderc721","147":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#complex-erc721-interactions","148":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#senderc1155","149":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#complex-erc1155-interactions","150":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#delayedencode","151":"docs/pages/sdk/unity/05-write-to-blockchain.mdx#batch-transactions","152":"docs/pages/sdk/unity/06-read-from-blockchain.mdx#read-from-blockchain","153":"docs/pages/sdk/unity/07-sign-messages.mdx#sign-messages","154":"docs/pages/sdk/unity/08-deploy-contracts.mdx#contract-deployment","155":"docs/pages/sdk/unity/09-wallet-ui.mdx#wallet-ui","156":"docs/pages/sdk/unity/09-wallet-ui.mdx#how-it-works","157":"docs/pages/sdk/unity/09-wallet-ui.mdx#ui-customizability","158":"docs/pages/sdk/unity/09-wallet-ui.mdx#color-scheme-manager","159":"docs/pages/sdk/unity/09-wallet-ui.mdx#more-customization-tools-coming-soon","160":"docs/pages/sdk/unreal/01-overview.mdx#introduction","161":"docs/pages/sdk/unreal/01-overview.mdx#requirements","162":"docs/pages/sdk/unreal/02-installation.mdx#installation","163":"docs/pages/sdk/unreal/02-installation.mdx#credentials","164":"docs/pages/sdk/unreal/02-installation.mdx#security","165":"docs/pages/sdk/unreal/03-setup.mdx#setup","166":"docs/pages/sdk/unreal/04-authentication.mdx#authentication","167":"docs/pages/sdk/unreal/04-authentication.mdx#custom-ui-integration","168":"docs/pages/sdk/unreal/04-authentication.mdx#email-based-authentication","169":"docs/pages/sdk/unreal/04-authentication.mdx#social-signin-based-authentication-on-desktop","170":"docs/pages/sdk/unreal/04-authentication.mdx#social-signin-based-authentication-on-mobile","171":"docs/pages/sdk/unreal/05-api-integration.mdx#api-integration","172":"docs/pages/sdk/unreal/05-api-integration.mdx#sequence-api","173":"docs/pages/sdk/unreal/05-api-integration.mdx#sequence-unreal-api","174":"docs/pages/sdk/unreal/05-api-integration.mdx#usequencewallet","175":"docs/pages/sdk/unreal/05-api-integration.mdx#sequence-api-methods","176":"docs/pages/sdk/unreal/06-packaging.mdx#packaging","177":"docs/pages/sdk/unreal/06-packaging.mdx#google-sso-setup","178":"docs/pages/sdk/unreal/06-packaging.mdx#ios","179":"docs/pages/sdk/unreal/06-packaging.mdx#unreal-and-xcode-specifics","180":"docs/pages/solutions/marketplaces/overview.mdx#marketplaces-overview","181":"docs/pages/solutions/marketplaces/overview.mdx#what-are-the-differences-between-these-options","182":"docs/pages/solutions/marketplaces/overview.mdx#getting-started","183":"docs/pages/solutions/wallets/overview.mdx#sequence-wallets-overview","184":"docs/pages/solutions/wallets/overview.mdx#what-are-the-differences-between-these-options","185":"docs/pages/solutions/wallets/overview.mdx#what-are-the-benefits-of-each-and-how-can-i-leverage-them","186":"docs/pages/solutions/wallets/overview.mdx#getting-started","187":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#connect-wallet","188":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#connecting-your-dapp-with-0xsequence","189":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#wallet-login-and-connect-options","190":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#app","191":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#appprotocol","192":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#origin","193":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#expiry","194":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#authorize","195":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#authorizenonce","196":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#refresh","197":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#keepwalletopened","198":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#askforemail","199":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingstheme","200":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingsbannerurl","201":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingssigninwith","202":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingssigninwithemail","203":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingssigninoptions","204":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingsincludedpaymentproviders","205":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingsdefaultfundingcurrency","206":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingsdefaultpurchaseamount","207":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#settingslockfundingcurrencytodefault","208":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#connecting-your-dapp-with-web3js-or-ethersjs","209":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#connecting-to-any-ethereum-dapp-with-the-sequence-wallet-chrome-extension","210":"docs/pages/sdk/typescript/03-guides/01-connect-wallet.mdx#connecting-via-walletconnect","211":"docs/pages/sdk/typescript/03-guides/02-auth-address.mdx#authenticate-users-with-message-signature","212":"docs/pages/sdk/typescript/03-guides/02-auth-address.mdx#ask-for-the-wallet-address","213":"docs/pages/sdk/typescript/03-guides/02-auth-address.mdx#authenticate-wallet","214":"docs/pages/sdk/typescript/03-guides/02-auth-address.mdx#authenticate-wallet-server-side","215":"docs/pages/sdk/typescript/03-guides/03-sign-message.mdx#todo---replace-with-code-groups-from-vocs","216":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#no-wallet-confirmation-signatures","217":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#session-keys","218":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#using-session-keys-with-sequence","219":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#1-initialize-sequence-wallet-and-connect","220":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#2-generate-a-session-key","221":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#3-sign-authorization-message","222":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#4-verify-authorization-signature","223":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#5-sign-message-with-session-key","224":"docs/pages/sdk/typescript/03-guides/04-session-keys.mdx#6-verify-session-signature","225":"docs/pages/sdk/typescript/03-guides/05-send-transaction.mdx#sending-transactions","226":"docs/pages/sdk/typescript/03-guides/06-send-erc20.mdx#sending-erc-20-tokens","227":"docs/pages/sdk/typescript/03-guides/07-send-erc721.mdx#sending-erc-721-nft-tokens","228":"docs/pages/sdk/typescript/03-guides/08-send-erc1155.mdx#sending-erc-1155-collectible-tokens","229":"docs/pages/sdk/typescript/03-guides/09-send-batch-transactions.mdx#sending-a-batch-of-transactions","230":"docs/pages/sdk/typescript/03-guides/10-building-backends.mdx#building-backends-with-sequence","231":"docs/pages/sdk/typescript/03-guides/10-building-backends.mdx#nodejs","232":"docs/pages/sdk/typescript/03-guides/10-building-backends.mdx#go","233":"docs/pages/sdk/typescript/03-guides/10-building-backends.mdx#ethkit","234":"docs/pages/sdk/typescript/03-guides/10-building-backends.mdx#support-for-other-backend-languages","235":"docs/pages/sdk/typescript/03-guides/overview.mdx#install","236":"docs/pages/sdk/typescript/03-guides/overview.mdx#cdn-distribution-as-native-js","237":"docs/pages/sdk/typescript/connectors/01-overview.mdx#wallet-connectors","238":"docs/pages/sdk/typescript/connectors/02-sequence-kit.mdx#sequence-kit-seamlessly-integrate-web3-wallets-into-your-applications","239":"docs/pages/sdk/typescript/connectors/02-sequence-kit.mdx#key-features","240":"docs/pages/sdk/typescript/connectors/02-sequence-kit.mdx#next-steps","241":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#using-wagmi","242":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#installation","243":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#usage","244":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#parameters","245":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#chains","246":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#optionsconnect-optional","247":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#optionsdefaultnetwork-optional","248":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#using-older-versions-of-wagmi--012x","249":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#using-nextjs","250":"docs/pages/sdk/typescript/connectors/03-wagmi.mdx#examples","251":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#using-rainbowkit","252":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#installation","253":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#usage","254":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#parameters","255":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#chains","256":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#connect-optional","257":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#defaultnetwork-optional","258":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#using-nextjs","259":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#using-older-versions-of-wagmi--012x","260":"docs/pages/sdk/typescript/connectors/04-rainbow-kit.mdx#examples","261":"docs/pages/sdk/typescript/connectors/05-web3-onboard.mdx#using-web3-onboard","262":"docs/pages/sdk/typescript/connectors/05-web3-onboard.mdx#installation","263":"docs/pages/sdk/typescript/connectors/05-web3-onboard.mdx#usage","264":"docs/pages/sdk/typescript/connectors/05-web3-onboard.mdx#parameters","265":"docs/pages/sdk/typescript/connectors/05-web3-onboard.mdx#network-optional","266":"docs/pages/sdk/typescript/connectors/05-web3-onboard.mdx#appname-optional","267":"docs/pages/sdk/typescript/connectors/05-web3-onboard.mdx#example","268":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#using-web3-react-v6","269":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#installation","270":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#usage","271":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#initialization","272":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#activationdeactivation","273":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#options","274":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#chainid","275":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#appname-optional","276":"docs/pages/sdk/typescript/connectors/06-web3-react-v6.mdx#example","277":"docs/pages/sdk/typescript/connectors/07-web3modal.mdx#using-web3modal","278":"docs/pages/sdk/typescript/connectors/07-web3modal.mdx#usage","279":"docs/pages/sdk/typescript/connectors/07-web3modal.mdx#example","280":"docs/pages/sdk/typescript/connectors/08-FAQ.mdx#nextjs","281":"docs/pages/sdk/typescript/connectors/08-FAQ.mdx#why-does-my-wallet-integration-produce-an-error-when-used-with-nextjs","282":"docs/pages/sdk/typescript/connectors/08-FAQ.mdx#how-do-i-use-a-wallet-library-and-connector-with-nextjs-using-the-pages-directory-all-versions-of-nextjs","283":"docs/pages/sdk/typescript/connectors/08-FAQ.mdx#how-do-i-use-a-wallet-library-and-connector-with-nextjs-using-the-app-directory-version-13-and-above-only","284":"docs/pages/sdk/unity/Advanced/01-introduction.mdx#advanced---introduction","285":"docs/pages/sdk/unity/Advanced/01-introduction.mdx#important-components","286":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#wallets","287":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#1-ethwallet","288":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#2-waastowalletadapter","289":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#methods","290":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#getaddress","291":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#sendtransaction","292":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#sendtransactionandwaitforreceipt","293":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#sendtransactionbatch","294":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#sendtransactionbatchandwaitforreceipts","295":"docs/pages/sdk/unity/Advanced/02-wallets.mdx#signmessage","296":"docs/pages/sdk/unity/Advanced/03-clients.mdx#clients","297":"docs/pages/sdk/unity/Advanced/03-clients.mdx#methods","298":"docs/pages/sdk/unity/Advanced/03-clients.mdx#balanceat","299":"docs/pages/sdk/unity/Advanced/03-clients.mdx#blockbynumber","300":"docs/pages/sdk/unity/Advanced/03-clients.mdx#blockbyhash","301":"docs/pages/sdk/unity/Advanced/03-clients.mdx#blocknumber","302":"docs/pages/sdk/unity/Advanced/03-clients.mdx#blockrange","303":"docs/pages/sdk/unity/Advanced/03-clients.mdx#chainid","304":"docs/pages/sdk/unity/Advanced/03-clients.mdx#codeat","305":"docs/pages/sdk/unity/Advanced/03-clients.mdx#estimategas","306":"docs/pages/sdk/unity/Advanced/03-clients.mdx#feehistory","307":"docs/pages/sdk/unity/Advanced/03-clients.mdx#networkid","308":"docs/pages/sdk/unity/Advanced/03-clients.mdx#nonceat","309":"docs/pages/sdk/unity/Advanced/03-clients.mdx#sendrawtransaction","310":"docs/pages/sdk/unity/Advanced/03-clients.mdx#suggestgasprice","311":"docs/pages/sdk/unity/Advanced/03-clients.mdx#suggestgastipcap","312":"docs/pages/sdk/unity/Advanced/03-clients.mdx#transactionbyhash","313":"docs/pages/sdk/unity/Advanced/03-clients.mdx#transactioncount","314":"docs/pages/sdk/unity/Advanced/03-clients.mdx#waitfortransactionreceipt","315":"docs/pages/sdk/unity/Advanced/04-transfers.mdx#transfers","316":"docs/pages/sdk/unity/Advanced/05-contracts.mdx#contracts","317":"docs/pages/sdk/unity/Advanced/05-contracts.mdx#calling-smart-contract-functions","318":"docs/pages/sdk/unity/Advanced/05-contracts.mdx#understanding-data-type-mappings","319":"docs/pages/sdk/unity/Advanced/05-contracts.mdx#querying-contracts","320":"docs/pages/sdk/unity/Advanced/05-contracts.mdx#deploying-contracts","321":"docs/pages/sdk/unity/Advanced/06-tokens.mdx#tokens","322":"docs/pages/sdk/unity/Advanced/06-tokens.mdx#bonus-ownable","323":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#how-to-manage-item-metadata-in-sequence-builder","324":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#introduction","325":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-1-prepare-your-token-images-and-metadata","326":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-2-set-up-on-pinatacloud","327":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-3-upload-your-metadata-files","328":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-4-get-the-folder-url","329":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-5-set-up-on-sequence-builder","330":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-6-deploy-your-contract","331":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-7-move-to-contract-details","332":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-8-update-contract-attributes","333":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-9-set-the-base-metadata-uri","334":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-10-minting-time","335":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-11-finalize-and-admire","336":"docs/pages/solutions/collectibles/metadata/800-manage-metadata-builder.mdx#step-12-updating-metadata","337":"docs/pages/solutions/marketplaces/orderbook/02-quickstart.mdx#quickstart","338":"docs/pages/solutions/marketplaces/orderbook/02-quickstart.mdx#try-a-demo","339":"docs/pages/solutions/marketplaces/orderbook/02-quickstart.mdx#template","340":"docs/pages/solutions/marketplaces/orderbook/02-quickstart.mdx#try-an-api-call","341":"docs/pages/solutions/payments/onramps/01-fiat-on-ramps.mdx#fiat-on-ramps","342":"docs/pages/solutions/technical-references/wallet-contracts/01-why.mdx#why-smart-contracts-wallets","343":"docs/pages/solutions/technical-references/wallet-contracts/01-why.mdx#externally-owned-accounts","344":"docs/pages/solutions/technical-references/wallet-contracts/01-why.mdx#pros","345":"docs/pages/solutions/technical-references/wallet-contracts/01-why.mdx#popular-examples","346":"docs/pages/solutions/technical-references/wallet-contracts/01-why.mdx#smart-contract-wallets","347":"docs/pages/solutions/technical-references/wallet-contracts/01-why.mdx#pros-1","348":"docs/pages/solutions/technical-references/wallet-contracts/01-why.mdx#examples","349":"docs/pages/solutions/wallets/embedded-wallet/01-overview.mdx#sequence-embedded-wallet","350":"docs/pages/solutions/wallets/embedded-wallet/01-overview.mdx#architecture-overview","351":"docs/pages/solutions/wallets/embedded-wallet/01-overview.mdx#signer-1-sequence-auth","352":"docs/pages/solutions/wallets/embedded-wallet/01-overview.mdx#signer-2-sequence-guard","353":"docs/pages/solutions/wallets/embedded-wallet/01-overview.mdx#threat-model","354":"docs/pages/solutions/wallets/embedded-wallet/02-quickstart.mdx#quickstart","355":"docs/pages/solutions/wallets/embedded-wallet/02-quickstart.mdx#try-a-demo","356":"docs/pages/solutions/wallets/embedded-wallet/02-quickstart.mdx#template","357":"docs/pages/solutions/wallets/embedded-wallet/02-quickstart.mdx#getting-started","358":"docs/pages/solutions/wallets/embedded-wallet/02-quickstart.mdx#sdk-installation","359":"docs/pages/solutions/wallets/embedded-wallet/02-quickstart.mdx#project-setup","360":"docs/pages/solutions/wallets/embedded-wallet/02-quickstart.mdx#library-setup","361":"docs/pages/solutions/wallets/universal-wallet/02-quickstart.mdx#quickstart","362":"docs/pages/solutions/wallets/universal-wallet/02-quickstart.mdx#try-a-demo","363":"docs/pages/solutions/wallets/universal-wallet/02-quickstart.mdx#template","364":"docs/pages/solutions/wallets/universal-wallet/02-quickstart.mdx#install","365":"docs/pages/solutions/wallets/universal-wallet/02-quickstart.mdx#cdn-distribution-as-native-js","366":"docs/pages/solutions/wallets/universal-wallet/04-sequence-kit.mdx#sequence-kit-seamlessly-integrate-web3-wallets-into-your-applications","367":"docs/pages/solutions/wallets/universal-wallet/04-sequence-kit.mdx#key-features","368":"docs/pages/solutions/wallets/universal-wallet/04-sequence-kit.mdx#next-steps","369":"docs/pages/solutions/wallets/universal-wallet/05-platforms.mdx#platforms","370":"docs/pages/solutions/wallets/universal-wallet/05-platforms.mdx#web-wallet","371":"docs/pages/solutions/wallets/universal-wallet/05-platforms.mdx#mobile-wallet","372":"docs/pages/solutions/wallets/universal-wallet/05-platforms.mdx#browser-extension-wallet","373":"docs/pages/solutions/wallets/universal-wallet/06-fiat-on-ramps.mdx#fiat-on-ramps","374":"docs/pages/solutions/wallets/universal-wallet/07-key-management.mdx#key-management","375":"docs/pages/solutions/wallets/universal-wallet/07-key-management.mdx#social-login-wallets","376":"docs/pages/solutions/wallets/universal-wallet/07-key-management.mdx#session-keys","377":"docs/pages/solutions/wallets/universal-wallet/07-key-management.mdx#guard-key","378":"docs/pages/solutions/wallets/universal-wallet/07-key-management.mdx#torus-key","379":"docs/pages/solutions/marketplaces/orderbook/examples/05-get-user-activities.mdx#getuseractivities","380":"docs/pages/solutions/marketplaces/orderbook/examples/05-get-user-activities.mdx#example-implementation","381":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#wallet-configuration","382":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#configuration-layout","383":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#signer-layout","384":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#example","385":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#the-valid-combinations-of-signers-are","386":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#configuration-hash---imagehash","387":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#compute-image-hash","388":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#initial-wallet-configuration","389":"docs/pages/solutions/technical-references/internals/v1/04-wallet-configuration.mdx#compute-wallet-address","390":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#modules--wallet-update","391":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#wallet-implementation","392":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#_updateconfiguration","393":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#parameters","394":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#reading-current-implementation","395":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#wallet-configuration-validation","396":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#_isvalidimage","397":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#parameters-1","398":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#return-values","399":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#mainmoduleupgradeable","400":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#updateimagehash","401":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#parameters-2","402":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#first-configuration-update","403":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#delegatecall-false","404":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#revertonerror-true","405":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#to-wallet","406":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#value-ethersconstantszero","407":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#gaslimit-ethersconstantszero","408":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#subsequent-configuration-updates","409":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#retrieving-the-current-configuration","410":"docs/pages/solutions/technical-references/internals/v1/05-modules-and-updates.mdx#retrieving-the-wallet-configuration","411":"docs/pages/solutions/technical-references/internals/v1/06-main-module-upgradeable.mdx#mainmoduleupgradeable--configuration-migration","412":"docs/pages/solutions/technical-references/internals/v1/08-signature-encoding.mdx#signature-encoding","413":"docs/pages/solutions/technical-references/internals/v1/08-signature-encoding.mdx#erc-191-ethereum-signed-data","414":"docs/pages/solutions/technical-references/internals/v1/08-signature-encoding.mdx#erc-712-structured-data-signatures","415":"docs/pages/solutions/technical-references/internals/v1/08-signature-encoding.mdx#verification","416":"docs/pages/solutions/technical-references/internals/v1/09-nested-transaction-batching.mdx#nested-transaction-batching","417":"docs/pages/solutions/technical-references/internals/v1/10-guest-module.mdx#guestmodule-and-on-demand-deployment","418":"docs/pages/solutions/technical-references/internals/v1/11-wallet-context.mdx#wallet-context","419":"docs/pages/solutions/technical-references/internals/v1/12-contract-audits.mdx#contract-audits","420":"docs/pages/solutions/technical-references/internals/v1/12-contract-audits.mdx#quantstamp","421":"docs/pages/solutions/technical-references/internals/v1/12-contract-audits.mdx#consensys-diligence","422":"docs/pages/solutions/technical-references/internals/v1/12-contract-audits.mdx#zellic","423":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#wallet-configuration","424":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#top-level-properties","425":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#threshold","426":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#checkpoint","427":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#tree","428":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#signer","429":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#subdigest","430":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#subtree-nested-configuration","431":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#imagehash","432":"docs/pages/solutions/technical-references/internals/v2/04-configuration.mdx#initial-configuration","433":"docs/pages/solutions/wallets/embedded-wallet/examples/03-manage-sessions.mdx#session-management","434":"docs/pages/solutions/wallets/embedded-wallet/examples/03-manage-sessions.mdx#sign-in--sign-up","435":"docs/pages/solutions/wallets/embedded-wallet/examples/03-manage-sessions.mdx#email-sign-in--sign-up","436":"docs/pages/solutions/wallets/embedded-wallet/examples/03-manage-sessions.mdx#google--apple-auth","437":"docs/pages/solutions/wallets/embedded-wallet/examples/03-manage-sessions.mdx#list-sessions","438":"docs/pages/solutions/wallets/embedded-wallet/examples/03-manage-sessions.mdx#close-session","439":"docs/pages/solutions/wallets/embedded-wallet/examples/05-validation.mdx#validation","440":"docs/pages/solutions/wallets/embedded-wallet/examples/05-validation.mdx#email-login-one-time-code","441":"docs/pages/solutions/wallets/embedded-wallet/examples/05-validation.mdx#social-login","442":"docs/pages/solutions/wallets/embedded-wallet/examples/05-validation.mdx#validation-status","443":"docs/pages/solutions/wallets/embedded-wallet/examples/05-validation.mdx#trigger-session-validation","444":"docs/pages/solutions/wallets/embedded-wallet/examples/05-validation.mdx#onvalidationrequired-callback","445":"docs/pages/solutions/wallets/embedded-wallet/examples/05-validation.mdx#listen-for-session-validations","446":"docs/pages/solutions/wallets/embedded-wallet/examples/05-validation.mdx#automatic-session-validation","447":"docs/pages/solutions/wallets/embedded-wallet/examples/06-transaction-receipts.mdx#transaction-receipts","448":"docs/pages/solutions/wallets/embedded-wallet/examples/06-transaction-receipts.mdx#successful-transaction-response","449":"docs/pages/solutions/wallets/embedded-wallet/examples/06-transaction-receipts.mdx#failed-transaction-response","450":"docs/pages/solutions/wallets/universal-wallet/examples/02-auth-address.mdx#authenticate-users-with-message-signature","451":"docs/pages/solutions/wallets/universal-wallet/examples/02-auth-address.mdx#ask-for-the-wallet-address","452":"docs/pages/solutions/wallets/universal-wallet/examples/02-auth-address.mdx#authenticate-wallet","453":"docs/pages/solutions/wallets/universal-wallet/examples/02-auth-address.mdx#authenticate-wallet-server-side","454":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#no-wallet-confirmation-signatures","455":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#session-keys","456":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#using-session-keys-with-sequence","457":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#1-initialize-sequence-wallet-and-connect","458":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#2-generate-a-session-key","459":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#3-sign-authorization-message","460":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#4-verify-authorization-signature","461":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#5-sign-message-with-session-key","462":"docs/pages/solutions/wallets/universal-wallet/examples/04-session-keys.mdx#6-verify-session-signature","463":"docs/pages/solutions/wallets/universal-wallet/examples/05-send-transaction.mdx#sending-transactions","464":"docs/pages/solutions/wallets/universal-wallet/examples/06-send-erc20.mdx#sending-erc-20-tokens","465":"docs/pages/solutions/wallets/universal-wallet/examples/07-send-erc721.mdx#sending-erc-721-nft-tokens","466":"docs/pages/solutions/wallets/universal-wallet/examples/08-send-erc1155.mdx#sending-erc-1155-collectible-tokens","467":"docs/pages/solutions/wallets/universal-wallet/examples/09-send-batch-transactions.mdx#sending-a-batch-of-transactions","468":"docs/pages/solutions/wallets/universal-wallet/examples/10-building-backends.mdx#building-backends-with-sequence","469":"docs/pages/solutions/wallets/universal-wallet/examples/10-building-backends.mdx#nodejs","470":"docs/pages/solutions/wallets/universal-wallet/examples/10-building-backends.mdx#go","471":"docs/pages/solutions/wallets/universal-wallet/examples/10-building-backends.mdx#ethkit","472":"docs/pages/solutions/wallets/universal-wallet/examples/10-building-backends.mdx#support-for-other-backend-languages"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,58],"1":[2,1,39],"2":[2,1,48],"3":[6,2,100],"4":[6,2,147],"5":[3,2,22],"6":[2,1,46],"7":[4,2,76],"8":[2,1,114],"9":[6,1,1],"10":[3,1,1],"11":[6,1,41],"12":[4,1,1],"13":[4,1,1],"14":[4,1,1],"15":[5,1,1],"16":[5,1,1],"17":[4,1,1],"18":[5,1,1],"19":[7,1,1],"20":[8,1,1],"21":[4,1,1],"22":[2,1,29],"23":[13,3,179],"24":[11,3,142],"25":[2,1,56],"26":[1,2,105],"27":[4,2,69],"28":[2,2,63],"29":[4,2,15],"30":[6,1,144],"31":[8,1,29],"32":[16,8,101],"33":[1,1,129],"34":[4,1,11],"35":[2,1,47],"36":[3,1,29],"37":[8,3,160],"38":[3,1,29],"39":[13,4,130],"40":[4,1,29],"41":[14,5,158],"42":[2,1,37],"43":[10,2,115],"44":[4,2,14],"45":[1,1,35],"46":[4,2,41],"47":[2,2,28],"48":[4,2,15],"49":[6,1,81],"50":[1,6,176],"51":[1,6,35],"52":[2,6,45],"53":[2,6,49],"54":[3,6,31],"55":[2,1,44],"56":[9,2,111],"57":[3,2,142],"58":[3,5,19],"59":[3,2,57],"60":[2,2,1],"61":[1,3,164],"62":[1,3,144],"63":[3,3,82],"64":[1,3,55],"65":[4,1,37],"66":[2,4,226],"67":[8,4,62],"68":[3,11,1],"69":[3,11,1],"70":[4,11,1],"71":[4,11,1],"72":[5,11,131],"73":[2,4,121],"74":[7,1,114],"75":[11,7,123],"76":[2,18,37],"77":[12,7,171],"78":[2,20,25],"79":[2,20,12],"80":[7,7,212],"81":[4,15,47],"82":[6,15,39],"83":[3,15,67],"84":[5,15,94],"85":[6,7,175],"86":[1,1,1],"87":[3,1,11],"88":[1,1,11],"89":[2,1,1],"90":[2,3,32],"91":[2,3,41],"92":[2,3,62],"93":[1,1,33],"94":[1,1,36],"95":[2,1,40],"96":[2,2,78],"97":[2,1,33],"98":[5,1,23],"99":[4,5,48],"100":[5,1,83],"101":[6,1,72],"102":[4,1,46],"103":[5,1,26],"104":[2,1,18],"105":[2,1,38],"106":[2,1,1],"107":[1,2,40],"108":[1,2,22],"109":[6,2,12],"110":[2,8,12],"111":[2,8,12],"112":[2,8,14],"113":[2,8,48],"114":[2,8,48],"115":[1,2,39],"116":[1,1,11],"117":[1,1,46],"118":[4,1,30],"119":[4,1,12],"120":[5,5,39],"121":[5,5,22],"122":[5,1,30],"123":[4,5,89],"124":[3,1,85],"125":[4,1,34],"126":[1,1,67],"127":[1,1,48],"128":[1,1,1],"129":[3,1,95],"130":[1,4,145],"131":[1,1,137],"132":[1,1,102],"133":[1,1,112],"134":[4,1,46],"135":[4,1,70],"136":[1,5,41],"137":[1,5,43],"138":[1,5,5],"139":[1,5,155],"140":[1,5,3],"141":[3,1,91],"142":[3,1,104],"143":[1,3,103],"144":[1,3,87],"145":[3,4,94],"146":[1,3,53],"147":[3,4,92],"148":[1,3,76],"149":[3,4,93],"150":[1,3,190],"151":[2,3,119],"152":[3,1,54],"153":[2,1,76],"154":[2,1,139],"155":[2,1,93],"156":[3,2,12],"157":[2,2,25],"158":[3,3,118],"159":[5,3,46],"160":[1,1,71],"161":[1,1,11],"162":[1,1,1],"163":[1,1,46],"164":[1,1,47],"165":[1,1,113],"166":[1,1,1],"167":[3,2,160],"168":[3,2,67],"169":[6,2,50],"170":[6,2,2],"171":[2,1,1],"172":[2,3,135],"173":[3,3,51],"174":[1,3,72],"175":[3,3,83],"176":[1,1,19],"177":[3,2,55],"178":[1,2,13],"179":[4,2,140],"180":[2,1,26],"181":[8,3,111],"182":[2,3,50],"183":[3,1,27],"184":[8,4,101],"185":[13,4,80],"186":[2,4,44],"187":[2,1,145],"188":[5,2,205],"189":[5,2,26],"190":[1,6,22],"191":[1,6,8],"192":[1,6,23],"193":[1,6,20],"194":[1,6,19],"195":[1,6,23],"196":[1,6,17],"197":[1,6,20],"198":[1,6,26],"199":[2,6,21],"200":[2,6,38],"201":[2,6,36],"202":[2,6,29],"203":[2,6,28],"204":[2,6,27],"205":[2,6,31],"206":[2,6,27],"207":[2,6,40],"208":[8,2,25],"209":[11,2,5],"210":[3,2,106],"211":[5,1,1],"212":[5,5,17],"213":[2,5,121],"214":[4,5,139],"215":[7,1,1],"216":[4,1,28],"217":[2,1,95],"218":[5,1,1],"219":[6,6,17],"220":[5,6,33],"221":[4,6,28],"222":[4,6,35],"223":[6,6,25],"224":[4,6,49],"225":[2,1,42],"226":[4,1,72],"227":[5,1,85],"228":[5,1,93],"229":[5,1,82],"230":[4,1,1],"231":[1,5,22],"232":[1,5,33],"233":[1,5,36],"234":[5,5,72],"235":[1,1,93],"236":[5,2,32],"237":[2,1,105],"238":[9,1,40],"239":[2,9,78],"240":[2,1,33],"241":[2,1,34],"242":[1,2,32],"243":[1,2,38],"244":[1,2,1],"245":[1,3,18],"246":[4,3,29],"247":[4,3,27],"248":[11,2,37],"249":[2,2,51],"250":[1,2,34],"251":[2,1,38],"252":[1,2,17],"253":[1,2,38],"254":[1,2,1],"255":[1,3,18],"256":[3,3,28],"257":[3,3,27],"258":[2,2,54],"259":[11,2,37],"260":[1,2,23],"261":[3,1,39],"262":[1,3,17],"263":[1,3,21],"264":[1,3,1],"265":[3,4,12],"266":[3,4,20],"267":[1,3,14],"268":[4,1,26],"269":[1,4,16],"270":[1,4,1],"271":[1,5,31],"272":[2,5,33],"273":[1,4,1],"274":[1,5,15],"275":[3,5,16],"276":[1,4,11],"277":[2,1,33],"278":[1,2,23],"279":[1,2,18],"280":[1,1,1],"281":[14,2,75],"282":[21,2,88],"283":[21,2,159],"284":[2,1,90],"285":[2,2,24],"286":[1,1,21],"287":[2,1,29],"288":[2,1,41],"289":[1,1,15],"290":[1,2,9],"291":[1,2,17],"292":[1,2,20],"293":[1,2,62],"294":[1,2,64],"295":[1,2,48],"296":[1,1,64],"297":[1,1,50],"298":[1,2,73],"299":[1,2,31],"300":[1,2,17],"301":[1,2,18],"302":[1,2,39],"303":[1,2,19],"304":[1,2,37],"305":[1,2,18],"306":[1,2,35],"307":[1,2,20],"308":[1,2,38],"309":[1,2,19],"310":[1,2,14],"311":[1,2,17],"312":[1,2,14],"313":[1,2,20],"314":[1,2,20],"315":[1,1,51],"316":[1,1,79],"317":[4,1,107],"318":[4,1,64],"319":[2,1,69],"320":[2,1,24],"321":[1,1,107],"322":[2,1,47],"323":[8,1,1],"324":[1,8,25],"325":[8,8,61],"326":[7,8,54],"327":[6,8,31],"328":[6,8,25],"329":[7,8,25],"330":[5,8,20],"331":[6,8,17],"332":[5,8,58],"333":[7,8,66],"334":[4,8,65],"335":[5,8,28],"336":[4,8,62],"337":[1,1,1],"338":[3,1,12],"339":[1,1,11],"340":[4,1,41],"341":[3,1,63],"342":[5,1,35],"343":[3,5,20],"344":[1,7,11],"345":[2,7,5],"346":[3,5,46],"347":[1,6,23],"348":[1,5,5],"349":[3,1,57],"350":[2,3,38],"351":[4,5,109],"352":[4,5,116],"353":[2,3,86],"354":[1,1,1],"355":[3,1,11],"356":[1,1,11],"357":[2,1,1],"358":[2,3,32],"359":[2,3,41],"360":[2,3,63],"361":[1,1,1],"362":[3,1,11],"363":[1,1,9],"364":[1,1,68],"365":[5,3,32],"366":[9,1,40],"367":[2,9,78],"368":[2,1,33],"369":[1,1,1],"370":[2,1,27],"371":[2,1,48],"372":[3,1,5],"373":[3,1,65],"374":[2,1,69],"375":[3,2,76],"376":[2,5,32],"377":[2,5,45],"378":[2,5,102],"379":[1,1,158],"380":[2,2,24],"381":[2,1,18],"382":[2,2,26],"383":[2,3,26],"384":[1,4,21],"385":[7,4,31],"386":[3,3,51],"387":[3,5,28],"388":[3,2,23],"389":[3,7,65],"390":[4,1,40],"391":[2,4,25],"392":[2,6,44],"393":[2,7,42],"394":[3,6,53],"395":[3,4,58],"396":[2,7,42],"397":[2,8,9],"398":[3,8,12],"399":[1,4,18],"400":[1,5,20],"401":[2,6,88],"402":[3,4,82],"403":[2,7,31],"404":[2,7,32],"405":[2,7,19],"406":[4,7,20],"407":[4,7,73],"408":[3,6,37],"409":[4,6,35],"410":[4,9,49],"411":[4,1,1],"412":[2,1,17],"413":[5,2,72],"414":[5,2,96],"415":[1,2,87],"416":[3,1,1],"417":[5,1,1],"418":[2,1,20],"419":[2,1,30],"420":[1,2,7],"421":[2,2,3],"422":[1,2,3],"423":[2,1,35],"424":[3,2,37],"425":[1,5,34],"426":[1,5,41],"427":[1,5,37],"428":[1,6,41],"429":[1,6,49],"430":[4,6,127],"431":[1,2,69],"432":[2,2,68],"433":[2,1,40],"434":[3,2,102],"435":[4,5,107],"436":[3,5,173],"437":[2,2,94],"438":[2,2,51],"439":[1,1,17],"440":[6,2,29],"441":[2,2,68],"442":[2,1,34],"443":[3,2,49],"444":[2,5,60],"445":[4,2,35],"446":[3,1,51],"447":[2,1,21],"448":[3,2,124],"449":[3,2,133],"450":[5,1,1],"451":[5,5,17],"452":[2,5,121],"453":[4,5,139],"454":[4,1,28],"455":[2,1,95],"456":[5,1,1],"457":[6,6,17],"458":[5,6,33],"459":[4,6,28],"460":[4,6,35],"461":[6,6,25],"462":[4,6,49],"463":[2,1,42],"464":[4,1,72],"465":[5,1,85],"466":[5,1,93],"467":[5,1,82],"468":[4,1,1],"469":[1,5,22],"470":[1,5,33],"471":[1,5,36],"472":[5,5,72]},"averageFieldLength":[3.1099365750528527,3.260042283298098,48.95560253699788],"storedFields":{"0":{"href":"/support#support","html":"\n
Sequence has a front line Support Team in multiple timezones to tackle problems that arise with the Stack, as well as answer any question for new projects in order to integrate web3 experiences in games and applications.
\n
If one of the members of the team does not know the answer, we'll further investigate (with backup support from the Sequence dev team) to get to the bottom of your troubles.
","isPage":true,"text":"\nSequence has a front line Support Team in multiple timezones to tackle problems that arise with the Stack, as well as answer any question for new projects in order to integrate web3 experiences in games and applications.\nIf one of the members of the team does not know the answer, we'll further investigate (with backup support from the Sequence dev team) to get to the bottom of your troubles.\nStart talking to support today","title":"Support","titles":[]},"1":{"href":"/api/marketplace#marketplace-api","html":"\n\n
The Sequence Marketplace API service offers a simple and fast way to interact with sequence marketplace protocols. The API is designed to be easy to use and to have all the features you need to build a fully functional marketplace.
\n
#TODO add example from solutions
","isPage":true,"text":"\nMarketplace API documentation and testing\nThe Sequence Marketplace API service offers a simple and fast way to interact with sequence marketplace protocols. The API is designed to be easy to use and to have all the features you need to build a fully functional marketplace.\n#TODO add example from solutions","title":"Marketplace API","titles":[]},"2":{"href":"/api/metadata#metadata-api","html":"\n\n
The Sequence Metadata API service offers a simple and fast API to query, manage, and update collections, token & NFT metadata for Ethereum-compatible chains.
\n\n","isPage":true,"text":"\nMetadata API documentation and endpoints\nThe Sequence Metadata API service offers a simple and fast API to query, manage, and update collections, token & NFT metadata for Ethereum-compatible chains.\nOur Metadata service is managed through Sequence Builder and requires a Service Account & Token in order to call the corresponding endpoints. Please follow the [section](/api/metadata#Obtaining a Service Account & Token) below prior to calling the endpoints\n","title":"Metadata API","titles":[]},"3":{"href":"/api/metadata#obtaining-a-service-account--token","html":"\n
Since the Metadata API requires write access in order to update on-chain state, you will need to first obtain a Service Account & Token to call this from your backend. Importantly, this is a secret key and should not be exposed publicly.
\n\n
Create a New Project using our Builder. Navigate to Settings > API Keys > Add Service Account.
\n
In the modal that pops up, click the dropdown for Permission and change to Write. After completed click Add.
\n
On the next screen, you will be given your Secret API Token. Copy the key and store it securely as it is not possible to see it again. Once this is done, click Confirm and you are all set to utilize the API.
\n\n
Keep in mind, in contrast to our Public API Access key - this Secret API Token should be stored securely and not be used publicly. You will pass this token as a normal JWT in the Request Headers as X-Access-Key
\n","isPage":false,"text":"\nSince the Metadata API requires write access in order to update on-chain state, you will need to first obtain a Service Account & Token to call this from your backend. Importantly, this is a secret key and should not be exposed publicly.\n\nCreate a New Project using our Builder. Navigate to Settings > API Keys > Add Service Account.\nIn the modal that pops up, click the dropdown for Permission and change to Write. After completed click Add.\nOn the next screen, you will be given your Secret API Token. Copy the key and store it securely as it is not possible to see it again. Once this is done, click Confirm and you are all set to utilize the API.\n\nKeep in mind, in contrast to our Public API Access key - this Secret API Token should be stored securely and not be used publicly. You will pass this token as a normal JWT in the Request Headers as X-Access-Key\n","title":"Obtaining a Service Account & Token","titles":["Metadata API"]},"4":{"href":"/api/metadata#creating-collections-tokens-and-managing-metadata","html":"\n
The below steps walk through an end to end example utilizing our Metadata API in order to deploy an NFT collection, create tokens within that collection, and deploy asset metadata to such as an image to that token.
CreateToken - use returned collectionId from previous request
\n
\n
\n
CreateAsset - use collectionId and your tokenId
\n
\n
set metadataField (assetType) to one of the following\n
\n
image
\n
animation_url
\n
audio
\n
video
\n
\n
\n
\n
\n
\n
Upload file with PUT method to this endpoint PUT {metadata-server}/projects/{projectId}/collections/{collectionId}/tokens/{tokenId}/upload/{assetIdOrAssetType}- use assetId that is returned in step 3 OR, you can pass assetType, such as "image"
Asset is now privately accessible with JWT token at GET {metadata-server}/projects/{projectID}/collections/{collectionID}/tokens/{tokenID}/asset/{assetType}
Finally, to use the metadata in your contract, simply update your contract's metadata base URIs to the values above, and everything will simply work.
\n\n
Below is an architecture demonstrating the steps above of how an NFT collection (ERC721 or ERC1155) is created and managed.\n
\n","isPage":false,"text":"\nThe below steps walk through an end to end example utilizing our Metadata API in order to deploy an NFT collection, create tokens within that collection, and deploy asset metadata to such as an image to that token.\n\n\nCall CreateCollection endpoint - ensure you pass in the Secret Service Token created in the prior section.\n\n\nCreateToken - use returned collectionId from previous request\n\n\nCreateAsset - use collectionId and your tokenId\n\nset metadataField (assetType) to one of the following\n\nimage\nanimation_url\naudio\nvideo\n\n\n\n\n\nUpload file with PUT method to this endpoint PUT {metadata-server}/projects/{projectId}/collections/{collectionId}/tokens/{tokenId}/upload/{assetIdOrAssetType}- use assetId that is returned in step 3 OR, you can pass assetType, such as "image"\n\n\n\nFor example you can upload to https://metadata.sequence.app/projects/486/collections/1/tokens/1/upload/image which will find the asset of the type "image" for the token, and will upload there.\n\nYou can also pass in the assetId if you prefer, i.e., PUT https://metadata.sequence.app/projects/486/collections/1/assets/1/upload\n\n\nAsset types include: image, audio, video, animation_url\n\n\n\nAsset is now privately accessible with JWT token at GET {metadata-server}/projects/{projectID}/collections/{collectionID}/tokens/{tokenID}/asset/{assetType}\n\nfor example: https://metadata.sequence.app/projects/486/collections/1/tokens/1/asset/image\n\n\n\nPublishCollection -- this sets the collection to be accessible by the public\n\n\nGetCollection -- will return both baseURIs for contract and token level metadata.\n\n\n\nCollection-level metadata (aka contract-level) metadata: https://metadata.sequence.app/projects/486/collections/1 or https://metadata.sequence.app/projects/486/collections/1.json\nToken-level metadata: https://metadata.sequence.app/projects/486/collections/1/tokens/{tokenId}\n\nie. https://metadata.sequence.app/projects/486/collections/1/tokens/1 or https://metadata.sequence.app/projects/486/collections/1/tokens/1.json\n\n\n\n\nFinally, to use the metadata in your contract, simply update your contract's metadata base URIs to the values above, and everything will simply work.\n\nBelow is an architecture demonstrating the steps above of how an NFT collection (ERC721 or ERC1155) is created and managed.\n\n","title":"Creating Collections, Tokens, and Managing Metadata","titles":["Metadata API"]},"5":{"href":"/api/metadata#pricing--usage","html":"\n
The Sequence Metadata is available for free with moderate request limits, but if your project requires higher limits, please contact the Sequence team.
","isPage":false,"text":"\nThe Sequence Metadata is available for free with moderate request limits, but if your project requires higher limits, please contact the Sequence team.","title":"Pricing & Usage","titles":["Metadata API"]},"6":{"href":"/api/node-gateway#node-gateway","html":"\n
Sequence Node gateway infrastructure enables you to have fail-over resilient RPC endpoints that can scale with your application.
\n
By using our infrastructure, you save money for not having to deploy your own stack, and benefits from the feature of aggregating multiple public RPC providers into a single endpoint for use.
\n","isPage":true,"text":"\nSequence Node gateway infrastructure enables you to have fail-over resilient RPC endpoints that can scale with your application.\nBy using our infrastructure, you save money for not having to deploy your own stack, and benefits from the feature of aggregating multiple public RPC providers into a single endpoint for use.\n","title":"Node Gateway","titles":[]},"7":{"href":"/api/node-gateway#give-it-a-try","html":"\n
Install ethers with pnpm install ethers or yarn add ethers
And acquire a Builder access key to authenticate your connection and append to the endpoint
\n
// Import the ethers library\nimport { ethers } from "ethers";\n\n// Function to create a provider and fetch the latest block\nasync function getLatestBlock() {\n // Replace the following URL with your actual RPC endpoint\n const rpcUrl =\n "https://nodes.sequence.app/<chain_handle>/<project_access_key>";\n\n // Create a provider using the RPC URL\n const provider = new ethers.providers.JsonRpcProvider(rpcUrl);\n\n // Fetch the latest block\n const latestBlock = await provider.getBlock("latest");\n\n console.log("Latest Block:", latestBlock);\n}\n\n// Call the function to get the latest block\ngetLatestBlock().catch(console.error);
","isPage":false,"text":"\nInstall ethers with pnpm install ethers or yarn add ethers\nEnsure to choose a network handle from our network options\nAnd acquire a Builder access key to authenticate your connection and append to the endpoint\n// Import the ethers library\nimport { ethers } from "ethers";\n \n// Function to create a provider and fetch the latest block\nasync function getLatestBlock() {\n // Replace the following URL with your actual RPC endpoint\n const rpcUrl =\n "https://nodes.sequence.app/<chain_handle>/<project_access_key>";\n \n // Create a provider using the RPC URL\n const provider = new ethers.providers.JsonRpcProvider(rpcUrl);\n \n // Fetch the latest block\n const latestBlock = await provider.getBlock("latest");\n \n console.log("Latest Block:", latestBlock);\n}\n \n// Call the function to get the latest block\ngetLatestBlock().catch(console.error);","title":"Give it a try","titles":["Node Gateway"]},"8":{"href":"/api/relayer#relayer-api","html":"\n\n
The Sequence Relayer service offers a simple interface for dispatching meta-transactions on Ethereum-compatible networks.
\n
Meta-transactions are the idea of a transaction inside of a transaction. The benefits of Sequence meta-transactions are that they allow:
\n
\n
Gas abstraction -- whereby users can pay for network gas in a variety of tokens (ie. USDC, DAI, etc.)
\n
Sponsored gas -- projects may sponsor the gas of specific contracts to allow free gas for their users
\n
Batched transactions -- group a bunch of independent transactions and allow them to be mined as a single transaction
\n
Parallel transactions -- parallelize the dispatch of transactions in some cases
\n
Fire + forget model -- easily send transactions to the relayer which will automatically manage nonces, bump gas, and other features which will ensure fast delivery
\n
Optimal gas pricing for transactions
\n
\n
The best part: transactions with Sequence Relayer are compatible with any existing/deployed Ethereum contract, and thus, integrating the Sequence Relayer doesn't require any changes to your contracts or dapp.
\n
The Sequence Relayer is usable by frontend dapps, or even in your backends.
","isPage":true,"text":"\nRelayer API documentation and endpoints\nThe Sequence Relayer service offers a simple interface for dispatching meta-transactions on Ethereum-compatible networks.\nMeta-transactions are the idea of a transaction inside of a transaction. The benefits of Sequence meta-transactions are that they allow:\n\nGas abstraction -- whereby users can pay for network gas in a variety of tokens (ie. USDC, DAI, etc.)\nSponsored gas -- projects may sponsor the gas of specific contracts to allow free gas for their users\nBatched transactions -- group a bunch of independent transactions and allow them to be mined as a single transaction\nParallel transactions -- parallelize the dispatch of transactions in some cases\nFire + forget model -- easily send transactions to the relayer which will automatically manage nonces, bump gas, and other features which will ensure fast delivery\nOptimal gas pricing for transactions\n\nThe best part: transactions with Sequence Relayer are compatible with any existing/deployed Ethereum contract, and thus, integrating the Sequence Relayer doesn't require any changes to your contracts or dapp.\nThe Sequence Relayer is usable by frontend dapps, or even in your backends.","title":"Relayer API","titles":[]},"9":{"href":"/guides/lootbox#deploy-an-in-game-collectibles-contract","html":"\n","isPage":true,"text":"\n","title":"Deploy an in-game collectibles contract","titles":[null]},"10":{"href":"/guides/lootbox#query-contract-details","html":"\n","isPage":false,"text":"\n","title":"Query contract details","titles":[null]},"11":{"href":"/guides/lootbox#fetch-token-balances-of-a-wallet","html":"\n\n
\n
Builder Signup & Project Creation
\n
\n
\n
Access Key Management
\n
\n
\n
Deploy a Contract
\n
\n
\n
Sponsor contract gas
\n
\n
\n
Deploying a cloudflare worker
\n
\n
\n
Generating AI Prompts & Images
\n
\n
\n
Uploading metadata to Sequence Metadata Service
\n
\n
\n
Minting Onchain with Relayer
\n
\n
\n
iframe-to-Webapp Communication
\n
\n
\n
Secure your cloudflare relayer from outside requests
\n
\n","isPage":false,"text":"\n\n\nBuilder Signup & Project Creation\n\n\nAccess Key Management\n\n\nDeploy a Contract\n\n\nSponsor contract gas\n\n\nDeploying a cloudflare worker\n\n\nGenerating AI Prompts & Images\n\n\nUploading metadata to Sequence Metadata Service\n\n\nMinting Onchain with Relayer\n\n\niframe-to-Webapp Communication\n\n\nSecure your cloudflare relayer from outside requests\n\n","title":"Fetch token balances of a wallet","titles":[null]},"12":{"href":"/guides/unity-guide#integrate-sequencekit-with-waas","html":"\n","isPage":true,"text":"\n","title":"Integrate SequenceKit with WaaS","titles":[null]},"13":{"href":"/guides/unity-guide#deploy-a-collectibles-contract","html":"\n","isPage":false,"text":"\n","title":"Deploy a collectibles contract","titles":[null]},"14":{"href":"/guides/unity-guide#deploy-a-remote-minter","html":"\n","isPage":false,"text":"\n","title":"Deploy a remote minter","titles":[null]},"15":{"href":"/guides/unity-guide#mint-in-game-achievement-tokens","html":"\n","isPage":false,"text":"\n","title":"Mint in-game achievement tokens","titles":[null]},"16":{"href":"/guides/unity-guide#burn-in-game-achievement-tokens","html":"\n","isPage":false,"text":"\n","title":"Burn in-game achievement tokens","titles":[null]},"17":{"href":"/guides/unity-guide#integrate-an-embedded-marketplace","html":"\n","isPage":false,"text":"\n","title":"Integrate an embedded marketplace","titles":[null]},"18":{"href":"/solutions/minter#mint-tokens-using-builder-manually","html":"\n","isPage":true,"text":"\n","title":"Mint tokens using Builder manually","titles":[null]},"19":{"href":"/solutions/minter#deploy-a-serverless-minter-on-cloudflare-workers","html":"\n","isPage":false,"text":"\n","title":"Deploy a serverless minter on Cloudflare Workers","titles":[null]},"20":{"href":"/solutions/nft-checkout#integrate-nft-checkout-on-web-coming-soon","html":"\n","isPage":true,"text":"\n","title":"Integrate NFT Checkout on web (coming soon)","titles":[null]},"21":{"href":"/solutions/onramps#integrate-onramp-on-web","html":"\n","isPage":true,"text":"\n","title":"Integrate onramp on web","titles":[null]},"22":{"href":"/api/indexer/fetch-tokens#tokens-api","html":"\n\n","isPage":true,"text":"\nINTRODUCING THE SEQUENCE BUILDER - Our Indexer service is now managed through Sequence Builder. Sign up to grab your API access key.Get started with the Sequence Builder Free Plan today!\n","title":"Tokens API","titles":[]},"23":{"href":"/api/indexer/fetch-tokens#fetches-list-of-erc20-erc721-and-erc1155-tokens-and-metadata-in-any-wallet","html":"\n
Sequence Indexer GetTokenBalances Method:
\n
\n
Request: POST /rpc/Indexer/GetTokenBalances
\n
Content-Type: application/json
\n
Body (in JSON):\n
\n
accountAddress (string) -- the wallet account address
\n
includeMetadata (boolean - optional - default: false) -- toggle token metadata to be included in the response
\n
metadataOptions (object - optional) -- additional options for metadata\n
\n
verifiedOnly (boolean - optional) -- return only contracts which are 'verified' to help reduce spam
\n
includeContracts ([]string - optional) -- list of specific contract addresses to always be included, even if verifiedOnly is enabled.
\n
\n
\n
\n
\n
\n \nExample: GetTokenBalances of a wallet account address on Polygon using an API_Access_Key\n\n
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n\nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n\n// try any account address you'd like :)\nconst accountAddress = '0xabc...'\n\n// query Sequence Indexer for all token balances of the account on Polygon\nconst tokenBalances = await indexer.getTokenBalances({\n\taccountAddress: accountAddress,\n\tincludeMetadata: true\n})\nconsole.log('tokens in your account:', tokenBalances)
Please [contact our team](/support) for assistance with integrations to another target.
\n \n\n","isPage":false,"text":"\nSequence Indexer GetTokenBalances Method:\n\nRequest: POST /rpc/Indexer/GetTokenBalances\nContent-Type: application/json\nBody (in JSON):\n\naccountAddress (string) -- the wallet account address\nincludeMetadata (boolean - optional - default: false) -- toggle token metadata to be included in the response\nmetadataOptions (object - optional) -- additional options for metadata\n\nverifiedOnly (boolean - optional) -- return only contracts which are 'verified' to help reduce spam\nincludeContracts ([]string - optional) -- list of specific contract addresses to always be included, even if verifiedOnly is enabled.\n\n\n\n\n\n\nExample: GetTokenBalances of a wallet account address on Polygon using an API_Access_Key\nThis code requires an API Access Key from Sequence Builder.\ncurl -X POST -H "Content-Type: application/json" -H "X-Access-Key: c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA" https://polygon-indexer.sequence.app/rpc/Indexer/GetTokenBalances -d '{ "accountAddress": "0x8e3E38fe7367dd3b52D1e281E4e8400447C8d8B9", "includeMetadata": true }'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n \nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n \n// try any account address you'd like :)\nconst accountAddress = '0xabc...'\n \n// query Sequence Indexer for all token balances of the account on Polygon\nconst tokenBalances = await indexer.getTokenBalances({\n\taccountAddress: accountAddress,\n\tincludeMetadata: true\n})\nconsole.log('tokens in your account:', tokenBalances)import (\n\t"context"\n\t"fmt"\n\t"log"\n\t"net/http"\n \n\t"github.com/0xsequence/go-sequence/indexer"\n)\n \nfunc GetTokenBalances(accountAddress string) {\n\tseqIndexer := indexer.NewIndexer("https://polygon-indexer.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \n\tincludeMetadata := true\n \n\ttokenBalances, _, err := seqIndexer.GetTokenBalances(context.Background(), &accountAddress, nil, &includeMetadata, nil)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println("tokenBalances:", tokenBalances)\n}Please [contact our team](/support) for assistance with integrations to another target.\n\nPRO TIP: fetching ERC721/1155 token IDsYou'll notice that, by default, GetTokenBalances will return at most one token instance from each contract.\nIn order to fetch ERC721/1155 token balances, you must pass the contractAddress to the GetTokenBalances method.\nThis will return all of the tokens owned by accountAddress from the specified contractAddress.\nSee section below for more information.\n","title":"Fetches list of ERC20, ERC721 and ERC1155 tokens and metadata in any wallet.","titles":["Tokens API",null]},"24":{"href":"/api/indexer/fetch-tokens#fetch-token-ids-balances-and-metadata-of-erc721-and-erc1155-collections","html":"\n
Sequence Indexer GetTokenBalances Method:
\n
\n
Request: POST /rpc/Indexer/GetTokenBalances
\n
Content-Type: application/json
\n
Body (in JSON):\n
\n
accountAddress (string) -- the wallet account address
\n
contractAddress (string) -- the contract address of the ERC721 / ERC1155 collection
\n
includeMetadata (boolean - optional - default: false) -- toggle token metadata to be included in the response
\n
metadataOptions (object - optional) -- additional options for metadata\n
\n
verifiedOnly (boolean - optional) -- return only contracts which are 'verified' to help reduce spam
\n
includeContracts ([]string - optional) -- list of specific contract addresses to always be included, even if verifiedOnly is enabled.
\n
\n
\n
\n
\n
\n \nExample: GetTokenBalances of a contract + account address on Polygon using an c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA\n
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n\nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n\n// try any contract and account address you'd like :)\nconst contractAddress = '0x631998e91476DA5B870D741192fc5Cbc55F5a52E'\nconst accountAddress = '0xabc...'\n\n// query Sequence Indexer for all nft balances of the account on Polygon\nconst nftBalances = await indexer.getTokenBalances({\n\tcontractAddress: contractAddress,\n\taccountAddress: accountAddress,\n\tincludeMetadata: true\n})\n\nconsole.log('collection of items:', nftBalances)
","isPage":false,"text":"\nSequence Indexer GetTokenBalances Method:\n\nRequest: POST /rpc/Indexer/GetTokenBalances\nContent-Type: application/json\nBody (in JSON):\n\naccountAddress (string) -- the wallet account address\ncontractAddress (string) -- the contract address of the ERC721 / ERC1155 collection\nincludeMetadata (boolean - optional - default: false) -- toggle token metadata to be included in the response\nmetadataOptions (object - optional) -- additional options for metadata\n\nverifiedOnly (boolean - optional) -- return only contracts which are 'verified' to help reduce spam\nincludeContracts ([]string - optional) -- list of specific contract addresses to always be included, even if verifiedOnly is enabled.\n\n\n\n\n\n\nExample: GetTokenBalances of a contract + account address on Polygon using an c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA\ncurl -X POST -H "Content-Type: application/json" -H "X-Access-Key: c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA" https://polygon-indexer.sequence.app/rpc/Indexer/GetTokenBalances -d '{ "contractAddress": "0x631998e91476DA5B870D741192fc5Cbc55F5a52E", "accountAddress": "0x8e3E38fe7367dd3b52D1e281E4e8400447C8d8B9", "includeMetadata": true }'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n \nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n \n// try any contract and account address you'd like :)\nconst contractAddress = '0x631998e91476DA5B870D741192fc5Cbc55F5a52E'\nconst accountAddress = '0xabc...'\n \n// query Sequence Indexer for all nft balances of the account on Polygon\nconst nftBalances = await indexer.getTokenBalances({\n\tcontractAddress: contractAddress,\n\taccountAddress: accountAddress,\n\tincludeMetadata: true\n})\n \nconsole.log('collection of items:', nftBalances)import (\n\t"context"\n\t"fmt"\n\t"log"\n\t"net/http"\n \n\t"github.com/0xsequence/go-sequence/indexer"\n)\n \nfunc GetTokenBalances(contractAddress, accountAddress string) {\n\tseqIndexer := indexer.NewIndexer("https://polygon-indexer.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \n\tincludeMetadata := true\n \n\tnftBalances, _, err := seqIndexer.GetTokenBalances(context.Background(), &accountAddress, &contractAddress, &includeMetadata, nil)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println("nftBalances:", nftBalances)\n}","title":"Fetch token IDs, balances and metadata of ERC721 and ERC1155 collections.","titles":["Tokens API",null]},"25":{"href":"/api/indexer/installation#indexer-installation","html":"\n\n
Sequence Indexer is a simple API to query any blockchain token and NFT data. Below are instructions\non how to integrate the Sequence Indexer API into your Webapps, Games, and backends. In case you missed\nit, please also see the Indexer Overview.
\n","isPage":true,"text":"\nINTRODUCING THE SEQUENCE BUILDER - Our Indexer service is managed through Sequence Builder. Sign up to grab your API access key.Get started with the Sequence Builder Free Plan today!\nSequence Indexer is a simple API to query any blockchain token and NFT data. Below are instructions\non how to integrate the Sequence Indexer API into your Webapps, Games, and backends. In case you missed\nit, please also see the Indexer Overview.\n","title":"Indexer Installation","titles":[]},"26":{"href":"/api/indexer/installation#installation","html":"\n
The Sequence Indexer is built as a HTTP API with RPC endpoints that you may call directly\nfrom your Webapp, Game or server backend. Below you'll find information on the RPC endpoint\nschema with sample curl commands, along with examples in both Javascript/Typescript and Go.
\n
We provide SDKs for Web / node.js and Go.\nOr if you'd like to integrate the Indexer with another language target, simply follow the API reference below\nto implement the HTTP requests. Additionally, read the Typescript client source code as reference\nimplementation of the Indexer API client as well.
\n\n \n","isPage":false,"text":"\nThe Sequence Indexer is built as a HTTP API with RPC endpoints that you may call directly\nfrom your Webapp, Game or server backend. Below you'll find information on the RPC endpoint\nschema with sample curl commands, along with examples in both Javascript/Typescript and Go.\nWe provide SDKs for Web / node.js and Go.\nOr if you'd like to integrate the Indexer with another language target, simply follow the API reference below\nto implement the HTTP requests. Additionally, read the Typescript client source code as reference\nimplementation of the Indexer API client as well.\nSequence Indexer offers the same API across a variety of EVM networks. Make sure to check the Indexer endpoints\nand use the corresponding host for your dapp/game. For example, on Ethereum mainnet the Sequence Indexer endpoint is\nhttps://mainnet-indexer.sequence.app and Polygon is https://polygon-indexer.sequence.app.🌄 View the full list of supported networks and Indexer endpoints here\n\n","title":"Installation","titles":["Indexer Installation"]},"27":{"href":"/api/indexer/installation#web--nodejs-installation","html":"\n
npm install 0xsequence ethers
\n
or
\n
pnpm install 0xsequence ethers
\n
or
\n
yarn add 0xsequence ethers
\n\n
import { SequenceIndexer } from '@0xsequence/indexer'\n\n// see https://docs.sequence.xyz/solutions/technical-references/chain-support for list of\n// indexer hosts for the chain you'd like to query\nconst indexer = new SequenceIndexer('https://mainnet-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n\n// see examples below for the kinds of queries you can make\nconst tokenBalances = await indexer.getTokenBalances(...)
\n
NOTE: if you're using @0xsequence/indexer from node.js, we recommend using node v18.x or newer.
\n \n","isPage":false,"text":"\nnpm install 0xsequence ethers\nor\npnpm install 0xsequence ethers\nor\nyarn add 0xsequence ethers\nThis code requires an API Access Key from Sequence Builder.\nimport { SequenceIndexer } from '@0xsequence/indexer'\n \n// see https://docs.sequence.xyz/solutions/technical-references/chain-support for list of\n// indexer hosts for the chain you'd like to query\nconst indexer = new SequenceIndexer('https://mainnet-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n \n// see examples below for the kinds of queries you can make\nconst tokenBalances = await indexer.getTokenBalances(...)\nNOTE: if you're using @0xsequence/indexer from node.js, we recommend using node v18.x or newer.\n\n","title":"Web / node.js Installation","titles":["Indexer Installation","Installation"]},"28":{"href":"/api/indexer/installation#go-installation","html":"\n
go get -u github.com/0xsequence/go-sequence@latest
\n
then in your app,
\n
import (\n\t"github.com/0xsequence/go-sequence/indexer"\n)\n\n// see https://docs.sequence.xyz/solutions/technical-references/chain-support for list of\n// indexer hosts for the chain you'd like to query\nseqIndexer := indexer.NewIndexer("https://polygon-indexer.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n\n// see examples below for the kinds of queries you can make\naccountAddress := "ACCOUNT_ADDRESS"\nincludeMetadata := true\nmetadataOptions := indexer.MetadataOptions{\n\tVerifiedOnly: true,\n}\n\n_, tokenBalances, err := seqIndexer.GetTokenBalances(context.Background(), &accountAddress, nil, nil, &includeMetadata, &metadataOptions, nil)
\n \n","isPage":false,"text":"\ngo get -u github.com/0xsequence/go-sequence@latest\nthen in your app,\nimport (\n\t"github.com/0xsequence/go-sequence/indexer"\n)\n \n// see https://docs.sequence.xyz/solutions/technical-references/chain-support for list of\n// indexer hosts for the chain you'd like to query\nseqIndexer := indexer.NewIndexer("https://polygon-indexer.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \n// see examples below for the kinds of queries you can make\naccountAddress := "ACCOUNT_ADDRESS"\nincludeMetadata := true\nmetadataOptions := indexer.MetadataOptions{\n\tVerifiedOnly: true,\n}\n \n_, tokenBalances, err := seqIndexer.GetTokenBalances(context.Background(), &accountAddress, nil, nil, &includeMetadata, &metadataOptions, nil)\n\n","title":"Go Installation","titles":["Indexer Installation","Installation"]},"29":{"href":"/api/indexer/installation#unity-or-unreal-installation","html":"\n
\n ","isPage":false,"text":"\nThe Sequence Indexer is integrated directly inside of the respective Sequence Unity and Sequence Unreal SDKs.\n","title":"Unity or Unreal Installation","titles":["Indexer Installation","Installation"]},"30":{"href":"/api/indexer/metadata-tips#metadata-tips--notes-on-spam","html":"\n
The Sequence Indexer and Sequence Metadata services will pick up everything and anything\nthat is published on a blockchain. Our services are designed to provide data in real-time\nas blocks are mined, and adhere to all popular ERC20, ERC721 and ERC1155 metadata\nstandards so things just work.
\n
This is very helpful for your applications to be able to have access to the complete set of data\non-chain, but it also means it will include spam tokens when querying with default settings.
\n
To combat spam, we introduced metadataOptions arguments which can be passed to Indexer RPC\ncalls to control the results returned.
\n
The Sequence Metadata service keeps track of contracts which are "verified" by checking popular\nsources like Coingecko, OpenSea, Sequence Builder (https://sequence.build) and the Sequence Token\nDirectory (https://github.com/0xsequence/token-directory). By calling the Indexer RPC methods with\n"metadataOptions": { "verifiedOnly": true }, any contract address which has not been verified, will\nbe omitted from the results. We recommend using this option all the time, but, the downside is\nif your project's contracts are unverified, then they will also be omitted from the results. To help\nwith this, your options are to get verified with one of the sources above, or in your RPC calls to pass\n"metadataOptions": { "verifiedOnly": true, "includeContracts": ["0x631998e91476DA5B870D741192fc5Cbc55F5a52E", "0x8bb759bb68995343ff1e9d57ac85ff5c5fb79334"] }\nas an example.
","isPage":true,"text":"\nThe Sequence Indexer and Sequence Metadata services will pick up everything and anything\nthat is published on a blockchain. Our services are designed to provide data in real-time\nas blocks are mined, and adhere to all popular ERC20, ERC721 and ERC1155 metadata\nstandards so things just work.\nThis is very helpful for your applications to be able to have access to the complete set of data\non-chain, but it also means it will include spam tokens when querying with default settings.\nTo combat spam, we introduced metadataOptions arguments which can be passed to Indexer RPC\ncalls to control the results returned.\nThe Sequence Metadata service keeps track of contracts which are "verified" by checking popular\nsources like Coingecko, OpenSea, Sequence Builder (https://sequence.build) and the Sequence Token\nDirectory (https://github.com/0xsequence/token-directory). By calling the Indexer RPC methods with\n"metadataOptions": { "verifiedOnly": true }, any contract address which has not been verified, will\nbe omitted from the results. We recommend using this option all the time, but, the downside is\nif your project's contracts are unverified, then they will also be omitted from the results. To help\nwith this, your options are to get verified with one of the sources above, or in your RPC calls to pass\n"metadataOptions": { "verifiedOnly": true, "includeContracts": ["0x631998e91476DA5B870D741192fc5Cbc55F5a52E", "0x8bb759bb68995343ff1e9d57ac85ff5c5fb79334"] }\nas an example.","title":"Metadata Tips & Notes on Spam","titles":[]},"31":{"href":"/api/indexer/native-network-balance#native-network-balances-ie-eth-matic-etc","html":"\n\n","isPage":true,"text":"\nINTRODUCING THE SEQUENCE BUILDER - Our Indexer service is now managed through Sequence Builder. Sign up to grab your API access key.Get started with the Sequence Builder Free Plan today!\n","title":"Native network balances (ie. ETH, MATIC, etc.)","titles":[]},"32":{"href":"/api/indexer/native-network-balance#fetch-native-network-balance-aka-eth-on-ethereum-matic-on-polygon-avax-on-avalanche-bnb-on-bsc-etc","html":"\n
Sequence Indexer GetEtherBalance Method:
\n
\n
Request: POST /rpc/Indexer/GetEtherBalance
\n
Content-Type: application/json
\n
Body (in JSON):\n
\n
accountAddress (string) -- the wallet account address
\n
\n
\n
\n \nExample: GetEtherBalance MATIC balance of a wallet account address on Polygon using an API_Access_Key\n
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n\nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n\n// try any account address you'd like :)\nconst accountAddress = '0xabc...'\n\n// query Sequence Indexer for the MATIC balance on Polygon\nconst balance = await indexer.getEtherBalance({\n\taccountAddress: accountAddress,\n})\n\t\nconsole.log('tokens in your account:', tokenBalances)
","isPage":false,"text":"\nSequence Indexer GetEtherBalance Method:\n\nRequest: POST /rpc/Indexer/GetEtherBalance\nContent-Type: application/json\nBody (in JSON):\n\naccountAddress (string) -- the wallet account address\n\n\n\n\nExample: GetEtherBalance MATIC balance of a wallet account address on Polygon using an API_Access_Key\ncurl -X POST -H "Content-Type: application/json" -H "X-Access-Key: c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA" https://polygon-indexer.sequence.app/rpc/Indexer/GetEtherBalance -d '{ "accountAddress": "0x8e3E38fe7367dd3b52D1e281E4e8400447C8d8B9" }'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n \nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n \n// try any account address you'd like :)\nconst accountAddress = '0xabc...'\n \n// query Sequence Indexer for the MATIC balance on Polygon\nconst balance = await indexer.getEtherBalance({\n\taccountAddress: accountAddress,\n})\n\t\nconsole.log('tokens in your account:', tokenBalances)import (\n\t"context"\n\t"fmt"\n\t"log"\n\t"net/http"\n \n\t"github.com/0xsequence/go-sequence/indexer"\n)\n \nfunc GetTokenBalances(accountAddress string) {\n\tseqIndexer := indexer.NewIndexer("https://polygon-indexer.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \n\tincludeMetadata := true\n \n\ttokenBalances, _, err := seqIndexer.GetTokenBalances(context.Background(), &accountAddress, nil, &includeMetadata, nil)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println("tokenBalances:", tokenBalances)\n}","title":"Fetch native network balance (aka ETH on Ethereum, MATIC on Polygon, AVAX on Avalanche, BNB on BSC, etc.)","titles":["Native network balances (ie. ETH, MATIC, etc.)",null]},"33":{"href":"/api/indexer/overview#indexer","html":"\n\n
The Sequence Indexer is a modular web3 service that makes it easy to query blockchain token and NFT data from Ethereum-compatible networks. The Indexer automatically indexes every ERC20, ERC721 and ERC1155 token from Ethereum-compatible chains.
\n\n
The Sequence Indexer is a modular web3 service that makes it easy to query blockchain token\nand NFT data from Ethereum-compatible networks. The Indexer automatically indexes every\nERC20, ERC721 and ERC1155 token from Ethereum-compatible chains.
\n
In fact, the Sequence Wallet uses the Indexer behind the scenes so it can seamlessly\nrender all token information in any wallet. But of course, the Indexer is a modular piece\nof infrastructure, and you may use it directly from your dapp, game, or even from\na server.
\nFeatures:\n
\n
Super-fast API to query all token balances, history, metadata and NFTs with multi-chain support
\n
Real-time indexing of ERC20, ERC721 and ERC1155 transactions across EVM-compatible chains
\n
Automatically detects all tokens on the chain, without the need for a contract registry
\n
Resilient to node failures and chain re-organizations
\n
Easily listen for specific events and transactions on-chain accurately with a simple API
\n
Built-in token / nft metadata support to easily render tokens in your apps / games
\n
High uptime and availability
\n
\n","isPage":true,"text":"\nIndexer API documentation and testing\nThe Sequence Indexer is a modular web3 service that makes it easy to query blockchain token and NFT data from Ethereum-compatible networks. The Indexer automatically indexes every ERC20, ERC721 and ERC1155 token from Ethereum-compatible chains.\nINTRODUCING THE SEQUENCE BUILDER - Our Indexer service is now managed through Sequence Builder. Sign up to grab your API access key.Get started with the Sequence Builder Free Plan today!\nThe Sequence Indexer is a modular web3 service that makes it easy to query blockchain token\nand NFT data from Ethereum-compatible networks. The Indexer automatically indexes every\nERC20, ERC721 and ERC1155 token from Ethereum-compatible chains.\nIn fact, the Sequence Wallet uses the Indexer behind the scenes so it can seamlessly\nrender all token information in any wallet. But of course, the Indexer is a modular piece\nof infrastructure, and you may use it directly from your dapp, game, or even from\na server.\nFeatures:\n\nSuper-fast API to query all token balances, history, metadata and NFTs with multi-chain support\nReal-time indexing of ERC20, ERC721 and ERC1155 transactions across EVM-compatible chains\nAutomatically detects all tokens on the chain, without the need for a contract registry\nResilient to node failures and chain re-organizations\nEasily listen for specific events and transactions on-chain accurately with a simple API\nBuilt-in token / nft metadata support to easily render tokens in your apps / games\nHigh uptime and availability\n\n","title":"Indexer","titles":[]},"34":{"href":"/api/indexer/overview#supported-networks--endpoints","html":"\n
\n","isPage":false,"text":"\nYou can see the full list of supported networks here.\n","title":"Supported Networks & Endpoints","titles":["Indexer"]},"35":{"href":"/api/indexer/overview#getting-started","html":"\n
Here are a few example queries you can make to a blockchain from your dapp, game, or wallet:
","isPage":false,"text":"\nHere are a few example queries you can make to a blockchain from your dapp, game, or wallet:\n\nFetch all tokens & NFTS in any wallet including all metadata\nFetch the transaction history for any wallet address\nFetch all unique tokens in a particular ERC20/721/1155 contract, including total supplies\nWhat is the total token supply of an ERC20 token? What is the total token supply of\nall the ERC1155 tokens in a particular contract?\nFetch the transaction history for any token contract address\n","title":"Getting Started","titles":["Indexer"]},"36":{"href":"/api/indexer/transaction-history#wallet-transaction-history","html":"\n\n","isPage":true,"text":"\nINTRODUCING THE SEQUENCE BUILDER - Our Indexer service is now managed through Sequence Builder. Sign up to grab your API access key.Get started with the Sequence Builder Free Plan today!\n","title":"Wallet transaction history","titles":[]},"37":{"href":"/api/indexer/transaction-history#fetch-the-transaction-history-for-any-wallet-address","html":"\n
Fetches the transaction / token history for any wallet address of any ERC20, ERC721 and ERC1155 token.\nThe response includes decoded transaction details for easy consumption / rendering.
\n
Sequence Indexer GetTransactionHistory Method:
\n
\n
Request: POST /rpc/Indexer/GetTransactionHistory
\n
Content-Type: application/json
\n
Body (in JSON):\n
\n
filter (object)\n
\n
accountAddress (string) -- the wallet account address
\n
contractAddress (string) -- optionally specify a contract address to filter
\n
accountAddresses (string array) -- optionally specify a list of wallet account addresses
\n
contractAddresses (string array) -- optionally specify a list of contract address
\n
transactionHashes (string array) -- optionally specify a list of transaction hashes
\n
metaTransactionIDs (string array) -- optionally specify a list of meta transaction IDs
\n
\n
\n
includeMetadata (boolean - optional - default: false) -- toggle token metadata to be included in the response
\n
metadataOptions (object - optional) -- additional options for metadata\n
\n
verifiedOnly (boolean - optional) -- return only contracts which are 'verified' to help reduce spam
\n
includeContracts ([]string - optional) -- list of specific contract addresses to always be included, even if verifiedOnly is enabled.
\n
\n
\n
\n
\n
\n \nExample: GetTransactionHistory of a wallet account address on Polygon using an API_Access_Key\n
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n\nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n\n// try any account address you'd like :)\nconst filter = {\n\taccountAddress: "0xabc..."\n}\n\n// query Sequence Indexer for all token transaction history on Polygon\nconst transactionHistory = await indexer.getTransactionHistory({\n\tfilter: filter,\n\tincludeMetadata: true\n})\n\t\nconsole.log('transaction history in account:', transactionHistory)
","isPage":false,"text":"\nFetches the transaction / token history for any wallet address of any ERC20, ERC721 and ERC1155 token.\nThe response includes decoded transaction details for easy consumption / rendering.\nSequence Indexer GetTransactionHistory Method:\n\nRequest: POST /rpc/Indexer/GetTransactionHistory\nContent-Type: application/json\nBody (in JSON):\n\nfilter (object)\n\naccountAddress (string) -- the wallet account address\ncontractAddress (string) -- optionally specify a contract address to filter\naccountAddresses (string array) -- optionally specify a list of wallet account addresses\ncontractAddresses (string array) -- optionally specify a list of contract address\ntransactionHashes (string array) -- optionally specify a list of transaction hashes\nmetaTransactionIDs (string array) -- optionally specify a list of meta transaction IDs\n\n\nincludeMetadata (boolean - optional - default: false) -- toggle token metadata to be included in the response\nmetadataOptions (object - optional) -- additional options for metadata\n\nverifiedOnly (boolean - optional) -- return only contracts which are 'verified' to help reduce spam\nincludeContracts ([]string - optional) -- list of specific contract addresses to always be included, even if verifiedOnly is enabled.\n\n\n\n\n\n\nExample: GetTransactionHistory of a wallet account address on Polygon using an API_Access_Key\ncurl -X POST -H "Content-Type: application/json" -H "X-Access-Key: c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA" https://polygon-indexer.sequence.app/rpc/Indexer/GetTransactionHistory -d '{ "filter": { "accountAddress": "0x8e3E38fe7367dd3b52D1e281E4e8400447C8d8B9" }, "includeMetadata": true }'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n \nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n \n// try any account address you'd like :)\nconst filter = {\n\taccountAddress: "0xabc..."\n}\n \n// query Sequence Indexer for all token transaction history on Polygon\nconst transactionHistory = await indexer.getTransactionHistory({\n\tfilter: filter,\n\tincludeMetadata: true\n})\n\t\nconsole.log('transaction history in account:', transactionHistory)import (\n\t"context"\n\t"fmt"\n\t"log"\n\t"net/http"\n \n\t"github.com/0xsequence/go-sequence/indexer"\n)\n \nfunc GetTransactionHistory(accountAddress string) {\n\tseqIndexer := indexer.NewIndexer("https://polygon-indexer.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \n\tfilter := &indexer.TransactionHistoryFilter{\n\t\tAccountAddress: &accountAddress,\n\t}\n\tincludeMetadata := true\n \n\t_, history, err := seqIndexer.GetTransactionHistory(context.Background(), filter, nil, &includeMetadata)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println("transaction history:", history)\n}","title":"Fetch the transaction history for any wallet address","titles":["Wallet transaction history"]},"38":{"href":"/api/indexer/transation-history-token-contract#contract-token-history","html":"\n\n","isPage":true,"text":"\nINTRODUCING THE SEQUENCE BUILDER - Our Indexer service is now managed through Sequence Builder. Sign up to grab your API access key.Get started with the Sequence Builder Free Plan today!\n","title":"Contract token history","titles":[]},"39":{"href":"/api/indexer/transation-history-token-contract#fetch--listen-to-the-transaction-history-for-any-erc20-erc721-erc1155-contract","html":"\n
This query is helpful to track transaction history of a particular token contract.\nIn this example, we use the Skyweaver token contract address 0x631998e91476DA5B870D741192fc5Cbc55F5a52E\non the Polygon network. You may query any contract address on any of the supported networks (but make\nsure to query the indexer of the corresponding network).
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n\nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n\n// here we query the Skyweaver contract address, but you can use any\nconst contractAddress = '0x631998e91476DA5B870D741192fc5Cbc55F5a52E'\n\n// query Sequence Indexer for all token details / supplies\n// try any contract address you'd like :)\nconst filter = {\n\tcontractAddress: contractAddress\n}\n\n// query Sequence Indexer for all token transaction history on Polygon\nconst transactionHistory = await indexer.getTransactionHistory({\n\tfilter: filter\n})\n\t\nconsole.log('transaction history of contract:', transactionHistory)
","isPage":false,"text":"\nThis query is helpful to track transaction history of a particular token contract.\nIn this example, we use the Skyweaver token contract address 0x631998e91476DA5B870D741192fc5Cbc55F5a52E\non the Polygon network. You may query any contract address on any of the supported networks (but make\nsure to query the indexer of the corresponding network).\nSequence Indexer GetTransactionHistory Method:\n\nRequest: POST /rpc/Indexer/GetTransactionHistory\nContent-Type: application/json\nBody (in JSON):\n\nfilter (object)\n\ncontractAddress (string) -- a ERC20 / ERC721 / ERC1155 contract address\n\n\n\n\n\n\nExample: GetTransactionHistory of Skyweaver contract on Polygon using an c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA\ncurl -X POST -H "Content-Type: application/json" -H "X-Access-Key: c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA" https://polygon-indexer.sequence.app/rpc/Indexer/GetTransactionHistory -d '{ "filter": { "accountAddress": "0x631998e91476DA5B870D741192fc5Cbc55F5a52E" }, "includeMetadata": true }'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n \nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n \n// here we query the Skyweaver contract address, but you can use any\nconst contractAddress = '0x631998e91476DA5B870D741192fc5Cbc55F5a52E'\n \n// query Sequence Indexer for all token details / supplies\n// try any contract address you'd like :)\nconst filter = {\n\tcontractAddress: contractAddress\n}\n \n// query Sequence Indexer for all token transaction history on Polygon\nconst transactionHistory = await indexer.getTransactionHistory({\n\tfilter: filter\n})\n\t\nconsole.log('transaction history of contract:', transactionHistory)import (\n\t"context"\n\t"fmt"\n\t"log"\n\t"net/http"\n \n\t"github.com/0xsequence/go-sequence/indexer"\n)\n \nfunc GetTransactionHistory(accountAddress string) {\n\tseqIndexer := indexer.NewIndexer("https://polygon-indexer.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \n\tfilter := &indexer.TransactionHistoryFilter{\n\t\tContractAddress: &contractAddress,\n\t}\n\tincludeMetadata := true\n \n\t_, history, err := seqIndexer.GetTransactionHistory(context.Background(), filter, nil, &includeMetadata)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println("transaction history:", history)\n}","title":"Fetch / listen to the transaction history for any ERC20, ERC721, ERC1155 contract.","titles":["Contract token history",null]},"40":{"href":"/api/indexer/unique-tokens#tokens-in-a-contract","html":"\n\n","isPage":true,"text":"\nINTRODUCING THE SEQUENCE BUILDER - Our Indexer service is now managed through Sequence Builder. Sign up to grab your API access key.Get started with the Sequence Builder Free Plan today!\n","title":"Tokens in a contract","titles":[]},"41":{"href":"/api/indexer/unique-tokens#fetch-all-unique-tokens-in-a-particular-erc207211155-contract-including-total-supplies","html":"\nFetches token supplies and metadata for any ERC20, ERC721, ERC1155 contract.\n
This query is helpful to render all tokens in a token contract, or to query the total token supplies.\nIn this example, we use the Skyweaver token contract address 0x631998e91476DA5B870D741192fc5Cbc55F5a52E\non the Polygon network. You may query any contract address on any of the supported networks (but make\nsure to query the indexer of the corresponding network).
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n\nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n\n// here we query the Skyweaver contract address, but you can use any\nconst contractAddress = '0x631998e91476DA5B870D741192fc5Cbc55F5a52E'\n\n// query Sequence Indexer for all token details / supplies\nconst tokenDetails = await indexer.getTokenSupplies({\n\tcontractAddress: contractAddress,\n\tincludeMetadata: true\n})\nconsole.log('token details of contract:', tokenDetails)
","isPage":false,"text":"\nFetches token supplies and metadata for any ERC20, ERC721, ERC1155 contract.\nThis query is helpful to render all tokens in a token contract, or to query the total token supplies.\nIn this example, we use the Skyweaver token contract address 0x631998e91476DA5B870D741192fc5Cbc55F5a52E\non the Polygon network. You may query any contract address on any of the supported networks (but make\nsure to query the indexer of the corresponding network).\nSequence Indexer GetTokenSupplies Method:\n\nRequest: POST /rpc/Indexer/GetTokenSupplies\nContent-Type: application/json\nBody (in JSON):\n\ncontractAddress (string) -- a ERC20 / ERC721 / ERC1155 contract address\nincludeMetadata (boolean - optional - default: false) -- toggle token metadata to be included in the response\nmetadataOptions (object - optional) -- additional options for metadata\n\nverifiedOnly (boolean - optional) -- return only contracts which are 'verified' to help reduce spam\nincludeContracts ([]string - optional) -- list of specific contract addresses to always be included, even if verifiedOnly is enabled.\n\n\n\n\n\n\nExample: GetTokenSupplies of Skyweaver contract on Polygon using an c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA\ncurl -X POST -H "Content-Type: application/json" -H "X-Access-Key: c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA" https://polygon-indexer.sequence.app/rpc/Indexer/GetTokenSupplies -d '{ "contractAddress": "0x631998e91476DA5B870D741192fc5Cbc55F5a52E", "includeMetadata": true }'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceIndexer } from '@0xsequence/indexer'\n \nconst indexer = new SequenceIndexer('https://polygon-indexer.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\n \n// here we query the Skyweaver contract address, but you can use any\nconst contractAddress = '0x631998e91476DA5B870D741192fc5Cbc55F5a52E'\n \n// query Sequence Indexer for all token details / supplies\nconst tokenDetails = await indexer.getTokenSupplies({\n\tcontractAddress: contractAddress,\n\tincludeMetadata: true\n})\nconsole.log('token details of contract:', tokenDetails)go\nimport (\n\t"context"\n\t"fmt"\n\t"log"\n\t"net/http"\n \n\t"github.com/0xsequence/go-sequence/indexer"\n)\n \nfunc GetTokenSupplies(contractAddress string) {\n\tseqIndexer := indexer.NewIndexer("https://polygon-indexer.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \n\tfilter := &indexer.TransactionHistoryFilter{\n\t\tContractAddress: &contractAddress,\n\t}\n\tincludeMetadata := true\n \n\t_, tokenDetails, err := seqIndexer.GetTokenSupplies(context.Background(), filter, nil, &includeMetadata)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println("token details:", tokenDetails)\n}","title":"Fetch all unique tokens in a particular ERC20/721/1155 contract, including total supplies","titles":["Tokens in a contract",null]},"42":{"href":"/api/metadata/contract-metadata#contract-metadata","html":"\n
\n\n","isPage":true,"text":"\n\nLearn how to query contract-level metadata directly for any contract\nLearn about contract-level metadata for ERC20, ERC721 and ERC1155 tokens\n\nPRO TIP: Sequence Indexer also returns token metadataWhen using the Sequence Indexer, pass "includeMetadata": true to your request to\nquery token metadata for any ERC20, ERC721 or ERC1155 contract. See below how to fetch\ncontract-level metadata directly.\n","title":"Contract Metadata","titles":[]},"43":{"href":"/api/metadata/contract-metadata#fetch-contract-metadata-of-any-erc20-erc721-or-erc1155-contract-address","html":"\n
Sequence Metadata GetContractInfoBatch Method:
\n
\n
Request: POST /rpc/Metadata/GetContractInfoBatch
\n
Content-Type: application/json
\n
Body (in JSON):\n
\n
chainID (string) -- the chain id, as a name or number (ie. "1" or "mainnet", "137" or "polygon", etc.)
\n
contractAddresses (string of strings) -- array of contract addresses
\n
\n
\n
\n \nExample: GetContractInfoBatch of some contracts on Polygon using an c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA\n\n
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceMetadata } from '@0xsequence/metadata'\n\nconst metadataClient = new SequenceMetadata("https://metadata.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n\nconst contractMetadata = await metadataClient.getContractInfoBatch({\n chainID: 'polygon',\n contractAddresses: [\n '0x631998e91476DA5B870D741192fc5Cbc55F5a52E',\n '0x17b66009af459dc8ebf37acf8a8b355379be2fe5',\n '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',\n '0x2953399124f0cbb46d2cbacd8a89cf0599974963',\n '0x7227e371540cf7b8e512544ba6871472031f3335',\n '0x7c0ebabfc394ec6d926e801fe0e69a1f15a7fe4d',\n '0x8f3cf7ad23cd3cadbd9735aff958023239c6a063',\n '0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4'\n ]\n})\n\nconsole.log('Contract info for above addresses:', contractMetadata)
Please [contact our team](/support) for assistance with integrations to another target.
\n \n","isPage":false,"text":"\nSequence Metadata GetContractInfoBatch Method:\n\nRequest: POST /rpc/Metadata/GetContractInfoBatch\nContent-Type: application/json\nBody (in JSON):\n\nchainID (string) -- the chain id, as a name or number (ie. "1" or "mainnet", "137" or "polygon", etc.)\ncontractAddresses (string of strings) -- array of contract addresses\n\n\n\n\nExample: GetContractInfoBatch of some contracts on Polygon using an c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA\nThis code requires an API Access Key from Sequence Builder.\ncurl -X POST -H "Content-Type: application/json" -H "X-Access-Key: c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA" https://metadata.sequence.app/rpc/Metadata/GetContractInfoBatch -d '{ "chainID": "polygon", "contractAddresses": ["0x631998e91476DA5B870D741192fc5Cbc55F5a52E", "0x17b66009af459dc8ebf37acf8a8b355379be2fe5", "0x2791bca1f2de4661ed88a30c99a7a9449aa84174", "0x2953399124f0cbb46d2cbacd8a89cf0599974963", "0x7227e371540cf7b8e512544ba6871472031f3335", "0x7c0ebabfc394ec6d926e801fe0e69a1f15a7fe4d", "0x8f3cf7ad23cd3cadbd9735aff958023239c6a063", "0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4"] }'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceMetadata } from '@0xsequence/metadata'\n \nconst metadataClient = new SequenceMetadata("https://metadata.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \nconst contractMetadata = await metadataClient.getContractInfoBatch({\n chainID: 'polygon',\n contractAddresses: [\n '0x631998e91476DA5B870D741192fc5Cbc55F5a52E',\n '0x17b66009af459dc8ebf37acf8a8b355379be2fe5',\n '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',\n '0x2953399124f0cbb46d2cbacd8a89cf0599974963',\n '0x7227e371540cf7b8e512544ba6871472031f3335',\n '0x7c0ebabfc394ec6d926e801fe0e69a1f15a7fe4d',\n '0x8f3cf7ad23cd3cadbd9735aff958023239c6a063',\n '0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4'\n ]\n})\n \nconsole.log('Contract info for above addresses:', contractMetadata)import (\n\t"github.com/0xsequence/go-sequence/metadata"\n)\n \nseqMetadata := metadata.NewMetadata("c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \ncontractInfo, err := seqMetadata.GetContractInfo(context.Background(), "polygon", "0x631998e91476DA5B870D741192fc5Cbc55F5a52E")Please [contact our team](/support) for assistance with integrations to another target.\n\n","title":"Fetch contract metadata of any ERC20, ERC721 or ERC1155 contract address","titles":["Contract Metadata"]},"44":{"href":"/api/metadata/contract-metadata#contract-level-metadata-standards","html":"\n
\n\n","isPage":true,"text":"\nThe Sequence Metadata API service offers a simple and fast API to query token & NFT metadata\nfor Ethereum-compatible chains.\nTo learn how to use the Sequence Metadata service, please read:\n\nToken metadata API & standards\nContract-level metadata API & standards\nAlternative, REST API Usage\n\n\n","title":"Metadata","titles":[]},"46":{"href":"/api/metadata/overview#web--nodejs-installation","html":"\n
npm install 0xsequence
\n
or
\n
npm install @0xsequence/metadata
\n\n
then in your app (using your API Access Key),
\n
import { SequenceMetadata } from '@0xsequence/metadata'\n\nconst metadata = new SequenceMetadata('https://metadata.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')
\n
NOTE: if you're using @0xsequence/metadata from node.js, we recommend using node v18.x or newer.
\n","isPage":false,"text":"\nnpm install 0xsequence\nor\nnpm install @0xsequence/metadata\nThis installation requires an API Access Key from Sequence Builder.\nthen in your app (using your API Access Key),\nimport { SequenceMetadata } from '@0xsequence/metadata'\n \nconst metadata = new SequenceMetadata('https://metadata.sequence.app', 'c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA')\nNOTE: if you're using @0xsequence/metadata from node.js, we recommend using node v18.x or newer.\n","title":"Web / node.js Installation","titles":["Metadata",null]},"47":{"href":"/api/metadata/overview#go-installation","html":"\n
go get -u github.com/0xsequence/go-sequence@latest
\n ","isPage":false,"text":"\nThe Sequence Metadata is integrated directly inside of the respective Sequence Unity and Sequence Unreal SDKs.\n","title":"Unity or Unreal Installation","titles":["Metadata",null]},"49":{"href":"/api/metadata/rest-api#metadata-rest-api-reference--usage","html":"\n
The Sequence Metadata API service offers a simple and fast API to query token & NFT metadata\nfor Ethereum-compatible chains.
\n
Quite simply, the Metadata API allows you to query the token metadata of any ERC20, ERC721 or ERC1155\ncontract on a number of supported Ethereum chains.
\n
As well, the Sequence Metadata service is automatically integrated in the Sequence Indexer.\nBut as we demonstrate below, it's also useful to be able to query the token/contract metadata directly too :)
\n\n","isPage":true,"text":"\nThe Sequence Metadata API service offers a simple and fast API to query token & NFT metadata\nfor Ethereum-compatible chains.\nQuite simply, the Metadata API allows you to query the token metadata of any ERC20, ERC721 or ERC1155\ncontract on a number of supported Ethereum chains.\nAs well, the Sequence Metadata service is automatically integrated in the Sequence Indexer.\nBut as we demonstrate below, it's also useful to be able to query the token/contract metadata directly too :)\nPRO TIP: RPC vs REST endpointsSequence Metadata service is available with both RPC and REST endpoints. We recommend the RPC endpoints\nfor your application, but the REST endpoints are an available option for convenience.For RPC endpoint see Token metadata RPC and Contract metadata RPC.\n","title":"Metadata REST API Reference & Usage","titles":[]},"50":{"href":"/api/metadata/rest-api#example","html":"\n
Let's say you'd like to query the metadata of a Skyweaver 1155 card on the Polygon network. Of course, the\nbelow example will work for any network / contract / token combination as well.
\n
First, the Skyweaver 1155 assets contract is located at address 0x631998e91476DA5B870D741192fc5Cbc55F5a52E\non the Polygon network. Second, let's build the metadata lookup endpoint to query Skyweaver's contract\nfor token ID 20:
Feel free to try tweaking the metadata.sequence.app URL above for your own contract, or another popular\nproject to see how the responses come back. You can change the network to one of our supported networks\nand specify any contract and/or token id.
\n
In addition to easily querying token-level metadata like in the above example, you can also query contract-level metadata.\nContract-level metadata provides you more information about a contract address such as a name, contract type, logo, and description.\nSimply change the metadata URL above to just query the contract address: https://metadata.sequence.app/tokens/polygon/0x631998e91476DA5B870D741192fc5Cbc55F5a52E
\n
and see result:
\n
{\n "chainId": 137,\n "address": "0x631998e91476da5b870d741192fc5cbc55f5a52e",\n "name": "Skyweaver",\n "type": "ERC1155",\n "symbol": "SKYWVR",\n "logoURI": "https://assets.skyweaver.net/_tX5dRVi/webapp/icons/skyweaver-token.png",\n "extensions": {\n "link": "https://www.skyweaver.net/",\n "description": "Skyweaver is a Free-to-Play, trading card game powered by Polygon and Ethereum.",\n "ogImage": "https://skyweaver.net/images/skyweavercover.jpg",\n "originAddress": "0x631998e91476da5b870d741192fc5cbc55f5a52e"\n }\n}
\n \n","isPage":false,"text":"\nLet's say you'd like to query the metadata of a Skyweaver 1155 card on the Polygon network. Of course, the\nbelow example will work for any network / contract / token combination as well.\nFirst, the Skyweaver 1155 assets contract is located at address 0x631998e91476DA5B870D741192fc5Cbc55F5a52E\non the Polygon network. Second, let's build the metadata lookup endpoint to query Skyweaver's contract\nfor token ID 20:\nRequest:\nhttps://metadata.sequence.app/tokens/polygon/0x631998e91476DA5B870D741192fc5Cbc55F5a52E/20\nResponse:\n[\n {\n "tokenId": "20",\n "contractAddress": "0x631998e91476da5b870d741192fc5cbc55f5a52e",\n "name": "Unstoppable Chop",\n "description": "Attach Silence to target unit. Do 4 damage to it.",\n "image": "https://assets.skyweaver.net/TNqWLuJZ/webapp/cards/full-cards/6x/20-silver.png",\n "decimals": 2,\n "properties": {\n "baseCardId": 20,\n "goldCardId": 131092,\n "grade": "oldSilver",\n "id": 20,\n "silverCardId": 65556\n },\n "attributes": null\n }\n]\nIf you'd like to query a number of tokens at the same time, you can include more token ids comma-separated:\nhttps://metadata.sequence.app/tokens/polygon/0x631998e91476DA5B870D741192fc5Cbc55F5a52E/20,21,22 -- click\nto see the JSON response to query token ids 20, 21, and 22 in a single batched request.\nFeel free to try tweaking the metadata.sequence.app URL above for your own contract, or another popular\nproject to see how the responses come back. You can change the network to one of our supported networks\nand specify any contract and/or token id.\nIn addition to easily querying token-level metadata like in the above example, you can also query contract-level metadata.\nContract-level metadata provides you more information about a contract address such as a name, contract type, logo, and description.\nSimply change the metadata URL above to just query the contract address: https://metadata.sequence.app/tokens/polygon/0x631998e91476DA5B870D741192fc5Cbc55F5a52E\nand see result:\n{\n "chainId": 137,\n "address": "0x631998e91476da5b870d741192fc5cbc55f5a52e",\n "name": "Skyweaver",\n "type": "ERC1155",\n "symbol": "SKYWVR",\n "logoURI": "https://assets.skyweaver.net/_tX5dRVi/webapp/icons/skyweaver-token.png",\n "extensions": {\n "link": "https://www.skyweaver.net/",\n "description": "Skyweaver is a Free-to-Play, trading card game powered by Polygon and Ethereum.",\n "ogImage": "https://skyweaver.net/images/skyweavercover.jpg",\n "originAddress": "0x631998e91476da5b870d741192fc5cbc55f5a52e"\n }\n}\n\n","title":"Example","titles":["Metadata REST API Reference & Usage"]},"51":{"href":"/api/metadata/rest-api#usage","html":"\n
The Metadata API service is accessible either with a simple REST interface, or a RPC client.\nFor the RPC client, we offer Web browser, node and Go clients. We recommend the RPC client for most integrations, but\nmake the REST interface available for convenience.
\n \n","isPage":false,"text":"\nThe Metadata API service is accessible either with a simple REST interface, or a RPC client.\nFor the RPC client, we offer Web browser, node and Go clients. We recommend the RPC client for most integrations, but\nmake the REST interface available for convenience.\n\n","title":"Usage","titles":["Metadata REST API Reference & Usage"]},"52":{"href":"/api/metadata/rest-api#rest-endpoints","html":"\n
As mentioned in the example above. The general format of the REST endpoint is:
\n
GET https://metadata.sequence.app/tokens/<network>/<contractAddress>[/<tokenID>]
\n \n","isPage":false,"text":"\nAs mentioned in the example above. The general format of the REST endpoint is:\nGET https://metadata.sequence.app/tokens/<network>/<contractAddress>[/<tokenID>]\nWhere <network> must be one of the Chain ID or Chain Handle of the supported networks.\n\nFetch contract-level metadata:\nGET https://metadata.sequence.app/tokens/<network>/<contractAddress>\nExample: https://metadata.sequence.app/tokens/polygon/0x631998e91476DA5B870D741192fc5Cbc55F5a52E\n\nFetch token-level metadata:\nGET https://metadata.sequence.app/tokens/<network>/<contractAddress>/<tokenID>[,<tokenID>,...]\nExamples:\n\nhttps://metadata.sequence.app/tokens/polygon/0x631998e91476DA5B870D741192fc5Cbc55F5a52E/20\nhttps://metadata.sequence.app/tokens/polygon/0x631998e91476DA5B870D741192fc5Cbc55F5a52E/20,21\n\n\n","title":"REST endpoints","titles":["Metadata REST API Reference & Usage"]},"53":{"href":"/api/metadata/rest-api#rpc-client","html":"\n
The Metadata RPC interface offers the full capabilities of the Metadata service.
\n
We provide SDKs for Web / node.js and Go.\nOr if you'd like to integrate the Metadata service with another language target, simply follow the API reference below\nto implement the HTTP requests. Additionally, read the Typescript client source code as reference\nimplementation of the Metadata RPC client as well.
\n","isPage":false,"text":"\nThe Metadata RPC interface offers the full capabilities of the Metadata service.\nWe provide SDKs for Web / node.js and Go.\nOr if you'd like to integrate the Metadata service with another language target, simply follow the API reference below\nto implement the HTTP requests. Additionally, read the Typescript client source code as reference\nimplementation of the Metadata RPC client as well.\n","title":"RPC Client","titles":["Metadata REST API Reference & Usage"]},"54":{"href":"/api/metadata/rest-api#metadata-rpc-methods","html":"\n
GetTokenMetadata - fetch token metadata of ERC721 or ERC1155 tokens from a single contract
\n
GetTokenMetadataBatch - fetch token metadata of ERC721 or ERC1155 token from a batch of contracts
\n
GetContractInfo - fetch contract metadata of an ERC20, ERC721 or ERC1155 contract address
\n
GetContractInfoBatch - fetch contract metadata of a batch of ERC20, ERC721 or ERC1155 contract addresses
\n
","isPage":false,"text":"\nMetadata API endpoint: https://metadata.sequence.app\nMetadata RPC methods:\n\nGetTokenMetadata - fetch token metadata of ERC721 or ERC1155 tokens from a single contract\nGetTokenMetadataBatch - fetch token metadata of ERC721 or ERC1155 token from a batch of contracts\nGetContractInfo - fetch contract metadata of an ERC20, ERC721 or ERC1155 contract address\nGetContractInfoBatch - fetch contract metadata of a batch of ERC20, ERC721 or ERC1155 contract addresses\n","title":"Metadata RPC Methods","titles":["Metadata REST API Reference & Usage"]},"55":{"href":"/api/metadata/token-metadata#token-metadata","html":"\n
Sequence provides a metadata service for fetching token metadata for any ERC721 or ERC1155 contract, on any EVM chain.
\n\n","isPage":true,"text":"\nSequence provides a metadata service for fetching token metadata for any ERC721 or ERC1155 contract, on any EVM chain.\n\nLearn how to query token metadata directly for any contract\nLearn about token metadata standards and formats for ERC721 and ERC1155 tokens\n\nPRO TIP: Sequence Indexer also supports token metadataWhen using the Sequence Indexer, pass "includeMetadata": true to your request to\nquery token metadata for any ERC721 or ERC1155 contract. See below how to fetch\ntoken metadata directly.\n","title":"Token Metadata","titles":[]},"56":{"href":"/api/metadata/token-metadata#fetch-token-metadata-for-any-erc721-or-erc1155-contract","html":"\n
Sequence Metadata GetTokenMetadata Method:
\n
\n
Request: POST /rpc/Metadata/GetTokenMetadata
\n
Content-Type: application/json
\n
Body (in JSON):\n
\n
chainID (string) -- the chain id, as a name or number (ie. "1" or "mainnet", "137" or "polygon", etc.)
\n
contractAddress (string) -- the contract address
\n
tokenIDs (array of strings) -- array of strings containing token ids to fetch metadata
\n
\n
\n
\n \nExample: GetTokenMetadata of some tokens using an c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA\n\n
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceMetadata } from '@0xsequence/metadata'\n\nconst metadataClient = new SequenceMetadata("https://metadata.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n\nconst tokenMetadata = await metadataClient.getTokenMetadata({\n chainID: 'polygon',\n contractAddress: '0x631998e91476DA5B870D741192fc5Cbc55F5a52E',\n tokenIDs: ['65537', '65538', '65539']\n})\n\nconsole.log('token metadata: ', tokenMetadata)
Please [contact our team](/support) for assistance with integrations to another target.
\n","isPage":false,"text":"\nSequence Metadata GetTokenMetadata Method:\n\nRequest: POST /rpc/Metadata/GetTokenMetadata\nContent-Type: application/json\nBody (in JSON):\n\nchainID (string) -- the chain id, as a name or number (ie. "1" or "mainnet", "137" or "polygon", etc.)\ncontractAddress (string) -- the contract address\ntokenIDs (array of strings) -- array of strings containing token ids to fetch metadata\n\n\n\n\nExample: GetTokenMetadata of some tokens using an c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA\nThis code requires an API Access Key from Sequence Builder.\ncurl -X POST -H "Content-Type: application/json" -H "X-Access-Key: c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA" https://metadata.sequence.app/rpc/Metadata/GetTokenMetadata -d '{"chainID":"polygon", "contractAddress": "0x631998e91476DA5B870D741192fc5Cbc55F5a52E", "tokenIDs": ["65537", "65538", "65539"] }'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceMetadata } from '@0xsequence/metadata'\n \nconst metadataClient = new SequenceMetadata("https://metadata.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \nconst tokenMetadata = await metadataClient.getTokenMetadata({\n chainID: 'polygon',\n contractAddress: '0x631998e91476DA5B870D741192fc5Cbc55F5a52E',\n tokenIDs: ['65537', '65538', '65539']\n})\n \nconsole.log('token metadata: ', tokenMetadata)import (\n\t"github.com/0xsequence/go-sequence/metadata"\n)\n \nseqMetadata := metadata.NewMetadata("c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \ncollectibleInfo, err := seqMetadata.GetTokenMetadata(context.Background(), "polygon", "0x631998e91476DA5B870D741192fc5Cbc55F5a52E", []string{"1", "2"})TODOTODOPlease [contact our team](/support) for assistance with integrations to another target.\n","title":"Fetch token metadata for any ERC721 or ERC1155 contract","titles":["Token Metadata"]},"57":{"href":"/api/metadata/token-metadata#refreshing-token-metadata","html":"\n
When deploying new contracts or metadata updates the refresh token metadata url should be called with an access key from (the Sequence Builder) via a HTTPS POST request by command line or via metadata SDK in a program for data to indexeable in the Sequence Indexer metadata service.
\n
Sequence Metadata enqueueTokensForRefresh Method:
\n
\n
Request: POST /rpc/Metadata/EnqueueTokensForRefresh
\n
Content-Type: application/json
\n
Body (in JSON):\n
\n
chainID (string) -- the chain id, as a name or number (ie. "1" or "mainnet", "137" or "polygon", etc.)
\n
contractAddress (string) -- the contract address
\n
tokenIDs (array of strings) -- array of strings containing token ids to fetch metadata
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceMetadata } from '@0xsequence/metadata'\n\nconst metadataClient = new SequenceMetadata("https://metadata.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n\nconst jobID = await metadataClient.enqueueTokensForRefresh({\n chainID: 'polygon',\n contractAddress: '0x631998e91476DA5B870D741192fc5Cbc55F5a52E',\n tokenIDs: ['65537', '65538', '65539']\n})\n\nconsole.log('refresh job id: ', tokenMetadata)
// Works in both a Webapp (browser) or Node.js:\nimport { SequenceMetadata } from '@0xsequence/metadata'\n\nconst metadataClient = new SequenceMetadata("https://metadata.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n\nconst refreshJobStatus = await metadataClient.getTokenRefreshStatus({\n taskId: 1234\n})\n\nconsole.log('refresh job status: ', refreshJobStatus)
Please [contact our team](/support) for assistance with integrations to another target.
\n","isPage":false,"text":"\nWhen deploying new contracts or metadata updates the refresh token metadata url should be called with an access key from (the Sequence Builder) via a HTTPS POST request by command line or via metadata SDK in a program for data to indexeable in the Sequence Indexer metadata service.\nSequence Metadata enqueueTokensForRefresh Method:\n\nRequest: POST /rpc/Metadata/EnqueueTokensForRefresh\nContent-Type: application/json\nBody (in JSON):\n\nchainID (string) -- the chain id, as a name or number (ie. "1" or "mainnet", "137" or "polygon", etc.)\ncontractAddress (string) -- the contract address\ntokenIDs (array of strings) -- array of strings containing token ids to fetch metadata\n\n\n\ncurl -v -X POST -H "Content-type: application/json" -H "X-Access-Key: wuELppeX0pttvJABl8bIuxPAAAAAAAAAA" https://metadata.sequence.app/rpc/Metadata/EnqueueTokensForRefresh -d '{"chainID":"polygon", "contractAddress":"0x631998e91476DA5B870D741192fc5Cbc55F5a52E", "tokenIDs": ["1","2"]}'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceMetadata } from '@0xsequence/metadata'\n \nconst metadataClient = new SequenceMetadata("https://metadata.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \nconst jobID = await metadataClient.enqueueTokensForRefresh({\n chainID: 'polygon',\n contractAddress: '0x631998e91476DA5B870D741192fc5Cbc55F5a52E',\n tokenIDs: ['65537', '65538', '65539']\n})\n \nconsole.log('refresh job id: ', tokenMetadata)import (\n\t"github.com/0xsequence/go-sequence/metadata"\n)\n \nseqMetadata := metadata.NewMetadata("c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \nrefreshJob, err := seqMetadata.EnqueueTokensForRefresh(context.Background(), "polygon", "0x631998e91476DA5B870D741192fc5Cbc55F5a52E", []string{"1", "2"}, nil)Please [contact our team](/support) for assistance with integrations to another target.\nSequence Metadata getTokenRefreshStatus Method:\n\nRequest: POST /rpc/Metadata/GetTokenRefreshStatus\nContent-Type: application/json\nBody (in JSON):\n\ntaskId (uint) -- the task id returned from enqueueTokensForRefresh\n\n\n\ncurl -v -X POST -H "Content-type: application/json" -H "X-Access-Key: wuELppeX0pttvJABl8bIuxPAAAAAAAAAA" https://metadata.sequence.app/rpc/Metadata/GetTokenRefreshStatus -d '{"taskId": 1234}'// Works in both a Webapp (browser) or Node.js:\nimport { SequenceMetadata } from '@0xsequence/metadata'\n \nconst metadataClient = new SequenceMetadata("https://metadata.sequence.app", "c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \nconst refreshJobStatus = await metadataClient.getTokenRefreshStatus({\n taskId: 1234\n})\n \nconsole.log('refresh job status: ', refreshJobStatus)import (\n\t"github.com/0xsequence/go-sequence/metadata"\n)\n \nseqMetadata := metadata.NewMetadata("c3bgcU3LkFR9Bp9jFssLenPAAAAAAAAAA")\n \nrefreshJobStatus, err := seqMetadata.GetTokenRefreshStatus(context.Background(), uint64(1234))Please [contact our team](/support) for assistance with integrations to another target.\n","title":"Refreshing token metadata","titles":["Token Metadata"]},"58":{"href":"/api/metadata/token-metadata#testing-instructions","html":"\n\n
\n\n","isPage":false,"text":"\n\nCheck current token metadata using token metadata fetch\nModify token metadata content either onchain or via token baseURI\nCall refresh token ID endpoints using refresh metadata\nCheck token metadata changes using token metadata fetch\n\n","title":"Testing instructions:","titles":["Token Metadata","Refreshing token metadata"]},"59":{"href":"/api/metadata/token-metadata#token-metadata-standards","html":"\n
Popular token standards like EIP721 and EIP1155 both\nhave similar metadata standard formats with some subtle differences. In addition to the standards, we've seen in practice that projects\noften slightly deviate from the standards but are sensical, easy to parse and well supported in the ecosystem, include the Sequence Metadata service.\nBelow we describe the standards and common practices across projects to help demystify how to format your token metadata for your projects.
\n","isPage":false,"text":"\nPopular token standards like EIP721 and EIP1155 both\nhave similar metadata standard formats with some subtle differences. In addition to the standards, we've seen in practice that projects\noften slightly deviate from the standards but are sensical, easy to parse and well supported in the ecosystem, include the Sequence Metadata service.\nBelow we describe the standards and common practices across projects to help demystify how to format your token metadata for your projects.\n","title":"Token Metadata Standards","titles":["Token Metadata"]},"60":{"href":"/api/metadata/token-metadata#metadata-standards","html":"\n","isPage":false,"text":"\n","title":"Metadata Standards","titles":["Token Metadata"]},"61":{"href":"/api/metadata/token-metadata#erc721","html":"\n
ERC721 token contracts contain a method on the contract called tokenURI(uint256) string. When querying the tokenURI method on the contract, it will return a URI which contains additional metadata for that asset.
In the case of this Bored Ape, it appears there is no name or description set,\nbut they do have "attributes" as an array of { "trait_type": string, "value: string }.
Note that OpenSea technically breaks the ERC1155 standard by suggesting to use "attributes", where in fact,\nthe ERC1155 calls uses the field name "properties" instead of "attributes", see\nhttps://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema (read section below).\nHowever this is completely okay and mixed use of properties / attributes is compatible in practice.\nOn Sequence Metadata, we support both structures for token contracts which use either format for their properties/attributes.
\n","isPage":false,"text":"\nERC721 token contracts contain a method on the contract called tokenURI(uint256) string. When querying the tokenURI method on the contract, it will return a URI which contains additional metadata for that asset.\nSee EIP for specific details: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\nHere is an example Bored Ape (token id 9):\nhttps://metadata.sequence.app/tokens/mainnet/0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d/9\nresponse:\n{\n "tokenId": "9",\n "contractAddress": "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d",\n "name": "",\n "description": "",\n "image": "https://ipfs.sequence.info/ipfs/QmUQgKka8EW7exiUHnMwZ4UoXA11wV7NFjHAogVAbasSYy",\n "decimals": 0,\n "properties": null,\n "attributes": [\n {\n "trait_type": "Earring",\n "value": "Silver Stud"\n },\n {\n "trait_type": "Eyes",\n "value": "Sleepy"\n },\n {\n "trait_type": "Mouth",\n "value": "Small Grin"\n },\n {\n "trait_type": "Fur",\n "value": "Brown"\n },\n {\n "trait_type": "Hat",\n "value": "Seaman's Hat"\n },\n {\n "trait_type": "Clothes",\n "value": "Stunt Jacket"\n },\n {\n "trait_type": "Background",\n "value": "Purple"\n }\n ]\n}\nIn the case of this Bored Ape, it appears there is no name or description set,\nbut they do have "attributes" as an array of { "trait_type": string, "value: string }.\nAdditionally, see OpenSea for more information: https://docs.opensea.io/docs/metadata-standards\nNote that OpenSea technically breaks the ERC1155 standard by suggesting to use "attributes", where in fact,\nthe ERC1155 calls uses the field name "properties" instead of "attributes", see\nhttps://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema (read section below).\nHowever this is completely okay and mixed use of properties / attributes is compatible in practice.\nOn Sequence Metadata, we support both structures for token contracts which use either format for their properties/attributes.\nAnother example is from Neon District: https://metadata.sequence.app/tokens/polygon/0x7227e371540CF7b8e512544Ba6871472031F3335/158456331411102687640546264635\n","title":"ERC721","titles":["Token Metadata","Metadata Standards"]},"62":{"href":"/api/metadata/token-metadata#erc1155","html":"\n
ERC1155 token contracts contain a method on the contract called uri(uint256) string. When querying the uri method on the\ncontract, it will return a URI which contains additional metadata for that asset.
{\n "tokenId": "65548",\n "contractAddress": "0x27a11c1563a5dda238379b95c91b3abbad9c0cf6",\n "name": "Weighted Die (Silver)",\n "description": "Give +1/+1, armor, and guard to a random ally unit, six times.\\n\\n\\"I will not bow to fate. If the dice fall against me, I'll cut off the hand that cast them.\\"\\n -Horik",\n "image": "https://assets.skyweaver.net/LV7xNcQh/webapp/cards/full-cards/6x/12-silver.png",\n "decimals": 2,\n "properties": {\n "artists": {\n "name": "Artist",\n "value": [\n {\n "id": "xavi",\n "name": "Henrique Xavier",\n "url": "https://www.artstation.com/kitexavier"\n }\n ]\n },\n "baseCardId": 12,\n "cardType": "Spell",\n "element": "Metal",\n "mana": 8,\n "prism": "Strength",\n "type": "Silver"\n },\n "attributes": null\n}
\n
As you can see, Skyweaver an ERC1155 token's metadata uses the properties object, which is an object/dictionary type of arbitrary data.
\n","isPage":false,"text":"\nERC1155 token contracts contain a method on the contract called uri(uint256) string. When querying the uri method on the\ncontract, it will return a URI which contains additional metadata for that asset.\nSee EIP for specific details: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema\nHere is an example Skyweaver card (token id 65548):\nhttps://metadata.sequence.app/tokens/polygon/0x27A11C1563a5dDa238379B95c91B3AbBaD9C0cf6/65548\n{\n "tokenId": "65548",\n "contractAddress": "0x27a11c1563a5dda238379b95c91b3abbad9c0cf6",\n "name": "Weighted Die (Silver)",\n "description": "Give +1/+1, armor, and guard to a random ally unit, six times.\\n\\n\\"I will not bow to fate. If the dice fall against me, I'll cut off the hand that cast them.\\"\\n -Horik",\n "image": "https://assets.skyweaver.net/LV7xNcQh/webapp/cards/full-cards/6x/12-silver.png",\n "decimals": 2,\n "properties": {\n "artists": {\n "name": "Artist",\n "value": [\n {\n "id": "xavi",\n "name": "Henrique Xavier",\n "url": "https://www.artstation.com/kitexavier"\n }\n ]\n },\n "baseCardId": 12,\n "cardType": "Spell",\n "element": "Metal",\n "mana": 8,\n "prism": "Strength",\n "type": "Silver"\n },\n "attributes": null\n}\nAs you can see, Skyweaver an ERC1155 token's metadata uses the properties object, which is an object/dictionary type of arbitrary data.\n","title":"ERC1155","titles":["Token Metadata","Metadata Standards"]},"63":{"href":"/api/metadata/token-metadata#attributes-vs-properties","html":"\n
As you can see, the standard format of token metadata contains both attributes and properties. The attributes field is an array of\nobjects. The properties field is an object/dictionary of arbitrary data. In technical terms, the attributes type is defined as\n[]map<string,any> and the properties type is defined as map<string,any>.
\n
In practice, we've seen that many projects use both attributes and properties to store the same data, and in some cases, they use\nattributes to store data that should be in properties and vice versa. Sometimes project use both fields, and this is completely fine\nin practice, as marketplaces and services will parse both areas.
\n
Finally, if you are looking to extend the metadata format to suit your project, we recommend to utilize either or both the attributes\nand properties fields for either ERC721 or ERC1155.
\n","isPage":false,"text":"\nAs you can see, the standard format of token metadata contains both attributes and properties. The attributes field is an array of\nobjects. The properties field is an object/dictionary of arbitrary data. In technical terms, the attributes type is defined as\n[]map<string,any> and the properties type is defined as map<string,any>.\nIn practice, we've seen that many projects use both attributes and properties to store the same data, and in some cases, they use\nattributes to store data that should be in properties and vice versa. Sometimes project use both fields, and this is completely fine\nin practice, as marketplaces and services will parse both areas.\nFinally, if you are looking to extend the metadata format to suit your project, we recommend to utilize either or both the attributes\nand properties fields for either ERC721 or ERC1155.\n","title":"Attributes vs Properties","titles":["Token Metadata","Metadata Standards"]},"64":{"href":"/api/metadata/token-metadata#erc20","html":"\n
Finally, a note on ERC20 tokens. ERC20 tokens are just a single token, so they themselves do not have a token ID, but\nare represented entirely by their contract address. We can infer some information about the token by querying the contract\nmethods such as name and decimals. Additionally, ERC20 tokens can take advantage of the contractURI extension used\nby OpenSea and described in more detail in our Contract metadata section.
","isPage":false,"text":"\nFinally, a note on ERC20 tokens. ERC20 tokens are just a single token, so they themselves do not have a token ID, but\nare represented entirely by their contract address. We can infer some information about the token by querying the contract\nmethods such as name and decimals. Additionally, ERC20 tokens can take advantage of the contractURI extension used\nby OpenSea and described in more detail in our Contract metadata section.","title":"ERC20","titles":["Token Metadata","Metadata Standards"]},"65":{"href":"/guides/templates/02-building-relaying-server#building-a-relaying-server","html":"\n
With Sequence, you can create a smart contract wallet your server can use to dispatch transactions for your users\nwithout you having to be worried about transaction speed, throughput and re-orgs.
\n
:::info Sequentual Transactions\nBy default, Sequence transactions will be executed sequentially.\n:::
\n","isPage":true,"text":"\nWith Sequence, you can create a smart contract wallet your server can use to dispatch transactions for your users\nwithout you having to be worried about transaction speed, throughput and re-orgs.\n:::info Sequentual Transactions\nBy default, Sequence transactions will be executed sequentially.\n:::\n","title":"Building a Relaying Server","titles":[]},"66":{"href":"/guides/templates/02-building-relaying-server#nodejs-server","html":"\n
Your server will need an EOA wallet that will be able to sign messages. It will be the owner of your server-side Sequence\nwallet which will be used to dispatch transactions.
\n
This Sequence wallet should have the correct ownership at your contract level, not the EOA.\nAlso, the Sequence wallet should be sufficiently funded in order to pay fees needed by the relayer to dispatch your transactions.
\n
Using this approach - versus the next section (with sponsoring) - includes the ability to pay for gas in any available currency by our relayer (e.g. 'MATIC', 'DAI', 'USDC', 'WETH').
\n
import { Session } from "@0xsequence/auth";\n\n// Create your server EOA\nconst walletEOA = new ethers.Wallet(serverPrivateKey, provider);\n\n// Open a Sequence session, this will find or create\n// a Sequence wallet controlled by your server EOA\nconst session = await Session.singleSigner({\n signer: walletEOA,\n projectAccessKey: "<access_key>",\n});\n\n// Get the Sequence wallet address\nconsole.log(session.account.address);\n\n// Get a signer for a specific network\n// - 1: Ethereum Mainnet\n// - 137: Polygon Mainnet\n// - 42161: Arbitrum One\n// See https://chainid.network/ for more\nconst signer = session.account.getSigner(137);\n\n// Craft your transaction\nconst erc721Interface = new ethers.utils.Interface([\n "function safeTransferFrom(address _from, address _to, uint256 _tokenId)",\n]);\n\nconst data = erc721Interface.encodeFunctionData("safeTransferFrom", [\n senderAddress,\n recipientAddress,\n id,\n]);\n\nconst txn = {\n to: erc721TokenAddress,\n data,\n};\n\n// Send the transaction\nconst txnResponse = await signer.sendTransaction(txn);\n\n// Check if transaction was successful\nif (txnReceipt.status != 1) {\n console.log(`Unexpected status: ${txnReceipt.status}`);\n}
\n
You can also enforce a specific way to pay for gas fees, or the openning of a specific Sequence wallet.
\n
import { Session } from '@0xsequence/auth'\n\n// Create your server EOA\nconst walletEOA = new ethers.Wallet(serverPrivateKey, provider)\n\n// Open a Sequence session, this will find or create\n// a Sequence wallet controlled by your server EOA\nconst session = await Session.singleSigner({\n signer: walletEOA,\n projectAccessKey: '<access_key>'\n // OPTIONAL: Multiple wallets could be found for the same EOA\n // to enforce a specific wallet you can use the following callback\n selectWallet: async (wallets: string[]) => {\n const found = wallets.find(w => w === EXPECTED_WALLET_ADDRESS)\n if (!found) throw Error('wallet not found')\n // Returning the wallet address will make the session use it\n // returning undefined will make the session create a new wallet\n return found\n }\n})\n\nconst signer = session.account.getSigner(137, {\n // OPTIONAL: You can also enforce a specific way to pay for gas fees\n // if not provided the sdk will select one for you\n selectFee: async (\n _txs: any,\n options: FeeOption[]\n ) => {\n // Find the option to pay with native tokens\n const found = options.find(o => !o.token.contractAddress)\n if (!found) throw Error('fee option not found')\n return found\n }\n})\n\n// Initialize the contract\nconst usdc = new ethers.Contract(\n '0x2791bca1f2de4661ed88a30c99a7a9449aa84174', // USDC on Polygon\n ERC_20_ABI,\n signer\n)\n\n// Send the transaction\nconst txnResponse = await usdc.transfer(recipient, 1)\n\n// Check if transaction was successful\nif (txnReceipt.status != 1) {\n console.log(`Unexpected status: ${txnReceipt.status}`)\n}
\n
:::caution Triggers migration
\n
Openning a session may trigger a migration of your Sequence wallet to a new version, this could be v1 to v2 or v2 to future versions.
\n
Migration is a one-way process, once your wallet is migrated it cannot be reverted to a previous version.
\n
To catch any unwanted migration, you can use the onMigration callback.\n:::
\n","isPage":false,"text":"\nYour server will need an EOA wallet that will be able to sign messages. It will be the owner of your server-side Sequence\nwallet which will be used to dispatch transactions.\nThis Sequence wallet should have the correct ownership at your contract level, not the EOA.\nAlso, the Sequence wallet should be sufficiently funded in order to pay fees needed by the relayer to dispatch your transactions.\nUsing this approach - versus the next section (with sponsoring) - includes the ability to pay for gas in any available currency by our relayer (e.g. 'MATIC', 'DAI', 'USDC', 'WETH').\nimport { Session } from "@0xsequence/auth";\n \n// Create your server EOA\nconst walletEOA = new ethers.Wallet(serverPrivateKey, provider);\n \n// Open a Sequence session, this will find or create\n// a Sequence wallet controlled by your server EOA\nconst session = await Session.singleSigner({\n signer: walletEOA,\n projectAccessKey: "<access_key>",\n});\n \n// Get the Sequence wallet address\nconsole.log(session.account.address);\n \n// Get a signer for a specific network\n// - 1: Ethereum Mainnet\n// - 137: Polygon Mainnet\n// - 42161: Arbitrum One\n// See https://chainid.network/ for more\nconst signer = session.account.getSigner(137);\n \n// Craft your transaction\nconst erc721Interface = new ethers.utils.Interface([\n "function safeTransferFrom(address _from, address _to, uint256 _tokenId)",\n]);\n \nconst data = erc721Interface.encodeFunctionData("safeTransferFrom", [\n senderAddress,\n recipientAddress,\n id,\n]);\n \nconst txn = {\n to: erc721TokenAddress,\n data,\n};\n \n// Send the transaction\nconst txnResponse = await signer.sendTransaction(txn);\n \n// Check if transaction was successful\nif (txnReceipt.status != 1) {\n console.log(`Unexpected status: ${txnReceipt.status}`);\n}\nYou can also enforce a specific way to pay for gas fees, or the openning of a specific Sequence wallet.\nimport { Session } from '@0xsequence/auth'\n \n// Create your server EOA\nconst walletEOA = new ethers.Wallet(serverPrivateKey, provider)\n \n// Open a Sequence session, this will find or create\n// a Sequence wallet controlled by your server EOA\nconst session = await Session.singleSigner({\n signer: walletEOA,\n projectAccessKey: '<access_key>'\n // OPTIONAL: Multiple wallets could be found for the same EOA\n // to enforce a specific wallet you can use the following callback\n selectWallet: async (wallets: string[]) => {\n const found = wallets.find(w => w === EXPECTED_WALLET_ADDRESS)\n if (!found) throw Error('wallet not found')\n // Returning the wallet address will make the session use it\n // returning undefined will make the session create a new wallet\n return found\n }\n})\n \nconst signer = session.account.getSigner(137, {\n // OPTIONAL: You can also enforce a specific way to pay for gas fees\n // if not provided the sdk will select one for you\n selectFee: async (\n _txs: any,\n options: FeeOption[]\n ) => {\n // Find the option to pay with native tokens\n const found = options.find(o => !o.token.contractAddress)\n if (!found) throw Error('fee option not found')\n return found\n }\n})\n \n// Initialize the contract\nconst usdc = new ethers.Contract(\n '0x2791bca1f2de4661ed88a30c99a7a9449aa84174', // USDC on Polygon\n ERC_20_ABI,\n signer\n)\n \n// Send the transaction\nconst txnResponse = await usdc.transfer(recipient, 1)\n \n// Check if transaction was successful\nif (txnReceipt.status != 1) {\n console.log(`Unexpected status: ${txnReceipt.status}`)\n}\n:::caution Triggers migration\nOpenning a session may trigger a migration of your Sequence wallet to a new version, this could be v1 to v2 or v2 to future versions.\nMigration is a one-way process, once your wallet is migrated it cannot be reverted to a previous version.\nTo catch any unwanted migration, you can use the onMigration callback.\n:::\n","title":"Nodejs Server","titles":["Building a Relaying Server"]},"67":{"href":"/guides/templates/02-building-relaying-server#nodejs-server-with-gas-sponsoring-using-sequence-builder","html":"\n
If you want to have your transactions sponsored & paid for with a credit card, you can follow the below steps before beginning your code, at the following link: https://sequence.build/
\n
By sponsoring your transaction, you can now just send the transaction without a fee object and not have to fund the smart contract wallet before relaying any transactions.
\n
:::info Already Deployed Contract\nFor this example, we assume you have a smart contract deployed with a contract address to include in the last step.\n:::
\n","isPage":false,"text":"\nIf you want to have your transactions sponsored & paid for with a credit card, you can follow the below steps before beginning your code, at the following link: https://sequence.build/\nBy sponsoring your transaction, you can now just send the transaction without a fee object and not have to fund the smart contract wallet before relaying any transactions.\n:::info Already Deployed Contract\nFor this example, we assume you have a smart contract deployed with a contract address to include in the last step.\n:::\n","title":"Nodejs Server with Gas Sponsoring using Sequence Builder","titles":["Building a Relaying Server"]},"68":{"href":"/guides/templates/02-building-relaying-server#a-create-dapp","html":"\n
\n","isPage":false,"text":"\n\n","title":"A. Create Dapp","titles":["Building a Relaying Server","Nodejs Server with Gas Sponsoring using Sequence Builder"]},"69":{"href":"/guides/templates/02-building-relaying-server#b-new-dapp","html":"\n
\n","isPage":false,"text":"\n\n","title":"B. New Dapp","titles":["Building a Relaying Server","Nodejs Server with Gas Sponsoring using Sequence Builder"]},"70":{"href":"/guides/templates/02-building-relaying-server#c1-gas-tank","html":"\n
\n","isPage":false,"text":"\n\n","title":"C.1 Gas Tank","titles":["Building a Relaying Server","Nodejs Server with Gas Sponsoring using Sequence Builder"]},"71":{"href":"/guides/templates/02-building-relaying-server#c2-add-gas","html":"\n
\n","isPage":false,"text":"\n\n","title":"C.2 Add Gas","titles":["Building a Relaying Server","Nodejs Server with Gas Sponsoring using Sequence Builder"]},"72":{"href":"/guides/templates/02-building-relaying-server#c3-add-sponsored-address","html":"\n
\n
The following is example code that implements a relayed transaction, same as the above example (i.e. Nodejs Server) but without fees, taken care of by the Sequence Builder.
\n
import { Session } from "@0xsequence/auth";\n\n// Create your server EOA\nconst walletEOA = new ethers.Wallet(serverPrivateKey, provider);\n\n// Open a Sequence session, this will find or create\n// a Sequence wallet controlled by your server EOA\nconst session = await Session.singleSigner({\n signer: walletEOA,\n projectAccessKey: "<access_key>",\n});\n\n// Get the Sequence wallet address\nconsole.log(session.account.address);\n\n// Get a signer for a specific network\n// - 1: Ethereum Mainnet\n// - 137: Polygon Mainnet\n// - 42161: Arbitrum One\n// See https://chainid.network/ for more\nconst signer = session.account.getSigner(137, {\n // OPTIONAL: This ensures that the transaction is paid for by the gas tank\n // but if not provided, the gas tank will be used anyway\n selectFee: async (_txs: any, _options: FeeOption[]) => {\n return undefined;\n },\n});\n\n// Craft your transaction\nconst erc721Interface = new ethers.utils.Interface([\n "function safeTransferFrom(address _from, address _to, uint256 _tokenId)",\n]);\n\nconst data = erc721Interface.encodeFunctionData("safeTransferFrom", [\n senderAddress,\n recipientAddress,\n id,\n]);\n\nconst txn = {\n to: erc721TokenAddress,\n data,\n};\n\n// Send the transaction\nconst txnResponse = await signer.sendTransaction(txn);\n\n// Check if transaction was successful\nif (txnReceipt.status != 1) {\n console.log(`Unexpected status: ${txnReceipt.status}`);\n}
\n","isPage":false,"text":"\n\nThe following is example code that implements a relayed transaction, same as the above example (i.e. Nodejs Server) but without fees, taken care of by the Sequence Builder.\nimport { Session } from "@0xsequence/auth";\n \n// Create your server EOA\nconst walletEOA = new ethers.Wallet(serverPrivateKey, provider);\n \n// Open a Sequence session, this will find or create\n// a Sequence wallet controlled by your server EOA\nconst session = await Session.singleSigner({\n signer: walletEOA,\n projectAccessKey: "<access_key>",\n});\n \n// Get the Sequence wallet address\nconsole.log(session.account.address);\n \n// Get a signer for a specific network\n// - 1: Ethereum Mainnet\n// - 137: Polygon Mainnet\n// - 42161: Arbitrum One\n// See https://chainid.network/ for more\nconst signer = session.account.getSigner(137, {\n // OPTIONAL: This ensures that the transaction is paid for by the gas tank\n // but if not provided, the gas tank will be used anyway\n selectFee: async (_txs: any, _options: FeeOption[]) => {\n return undefined;\n },\n});\n \n// Craft your transaction\nconst erc721Interface = new ethers.utils.Interface([\n "function safeTransferFrom(address _from, address _to, uint256 _tokenId)",\n]);\n \nconst data = erc721Interface.encodeFunctionData("safeTransferFrom", [\n senderAddress,\n recipientAddress,\n id,\n]);\n \nconst txn = {\n to: erc721TokenAddress,\n data,\n};\n \n// Send the transaction\nconst txnResponse = await signer.sendTransaction(txn);\n \n// Check if transaction was successful\nif (txnReceipt.status != 1) {\n console.log(`Unexpected status: ${txnReceipt.status}`);\n}\n","title":"C.3 Add Sponsored Address","titles":["Building a Relaying Server","Nodejs Server with Gas Sponsoring using Sequence Builder"]},"73":{"href":"/guides/templates/02-building-relaying-server#parallel-transactions","html":"\n
If you want to send multiple independent transactions without needing to batch them, you can also send them in distinct nonce spaces.\nUsing distinct nonce spaces for your transactions signals to the relayer that there's no dependency between them and that\nthey can be executed on-chain in any order.
\n
This allows the transactions to be dispatched immediately in an unbuffered way without having to wait for a full batch.\nHere is an example of how to do that:
\n
// Generate random nonce spaces with ~0% probability of collision\nconst randomNonceSpace1 = ethers.BigNumber.from(\n ethers.utils.hexlify(ethers.utils.randomBytes(20))\n);\nconst randomNonceSpace2 = ethers.BigNumber.from(\n ethers.utils.hexlify(ethers.utils.randomBytes(20))\n);\n\n// Create signers for each nonce space\nconst signer1 = session.account.getSigner(137, {\n nonceSpace: randomNonceSpace1,\n});\n\nconst signer2 = session.account.getSigner(137, {\n nonceSpace: randomNonceSpace2,\n});\n\n// Generate transactions\nconst txn1 = {\n to: tokenContract.address,\n data: erc20Interface.encodeFunctionData("transfer", [recipient1, amount1]),\n};\n\nconst txn2 = {\n to: tokenContract.address,\n data: erc20Interface.encodeFunctionData("transfer", [recipient2, amount2]),\n};\n\n// Dispatch transactions, which can now be executed in parallel\nawait Promise.all([\n signer1.sendTransaction(txn1),\n signer2.sendTransaction(txn2),\n]);
\n
If batching transactions is not a problem for your use-case, you can call await wallet.sendTransaction(txns).\nYou can read more about batch transactions in Sending Batched Transactions.
","isPage":false,"text":"\nIf you want to send multiple independent transactions without needing to batch them, you can also send them in distinct nonce spaces.\nUsing distinct nonce spaces for your transactions signals to the relayer that there's no dependency between them and that\nthey can be executed on-chain in any order.\nThis allows the transactions to be dispatched immediately in an unbuffered way without having to wait for a full batch.\nHere is an example of how to do that:\n// Generate random nonce spaces with ~0% probability of collision\nconst randomNonceSpace1 = ethers.BigNumber.from(\n ethers.utils.hexlify(ethers.utils.randomBytes(20))\n);\nconst randomNonceSpace2 = ethers.BigNumber.from(\n ethers.utils.hexlify(ethers.utils.randomBytes(20))\n);\n \n// Create signers for each nonce space\nconst signer1 = session.account.getSigner(137, {\n nonceSpace: randomNonceSpace1,\n});\n \nconst signer2 = session.account.getSigner(137, {\n nonceSpace: randomNonceSpace2,\n});\n \n// Generate transactions\nconst txn1 = {\n to: tokenContract.address,\n data: erc20Interface.encodeFunctionData("transfer", [recipient1, amount1]),\n};\n \nconst txn2 = {\n to: tokenContract.address,\n data: erc20Interface.encodeFunctionData("transfer", [recipient2, amount2]),\n};\n \n// Dispatch transactions, which can now be executed in parallel\nawait Promise.all([\n signer1.sendTransaction(txn1),\n signer2.sendTransaction(txn2),\n]);\nIf batching transactions is not a problem for your use-case, you can call await wallet.sendTransaction(txns).\nYou can read more about batch transactions in Sending Batched Transactions.","title":"Parallel Transactions","titles":["Building a Relaying Server"]},"74":{"href":"/guides/templates/03-mint-collectibles-serverless#mint-collectibles-using-a-gasless-serverless-relayer","html":"\n
Time to complete: 20-30 minutes
\n
The Sequence Relayer can be implemented on a serverless Cloudflare worker so a game or app user interaction is seamless without a confirmation signature or gas payment. You'll also benefit from not having to be worried about transaction speed, throughput and re-orgs by the relayer, and experience automatic scaling with Cloudflare.
\n
The following steps will guide you through how to build your hosted minter API in 4 steps:
The result, a secure API with the following specs:
\n
\n
HTTPS GET: returns blockNumber
\n
HTTPS POST(proof, address): mints a collectible & returns transaction hash
\n
\n
:::info Difficulty\nYou need basic knowledge of wrangler cli, npm, and Sequence Builder in order to complete this implementation.\n:::
\n","isPage":true,"text":"\nTime to complete: 20-30 minutes\nThe Sequence Relayer can be implemented on a serverless Cloudflare worker so a game or app user interaction is seamless without a confirmation signature or gas payment. You'll also benefit from not having to be worried about transaction speed, throughput and re-orgs by the relayer, and experience automatic scaling with Cloudflare.\nThe following steps will guide you through how to build your hosted minter API in 4 steps:\n\nSetup Cloudflare environment with wrangler cli and deploy a test\nDeploy, sponsor and update Metadata for an ERC1155 contract with Builder\nUse EthAuthProof to prevent EOA DDoS\nMint a collectible to wallet\n\nThe result, a secure API with the following specs:\n\nHTTPS GET: returns blockNumber\nHTTPS POST(proof, address): mints a collectible & returns transaction hash\n\n:::info Difficulty\nYou need basic knowledge of wrangler cli, npm, and Sequence Builder in order to complete this implementation.\n:::\n","title":"Mint Collectibles Using a Gasless Serverless Relayer","titles":[]},"75":{"href":"/guides/templates/03-mint-collectibles-serverless#1-setup-cloudflare-environment-with-wrangler-cli-and-deploy-a-test","html":"\n
In order to create the project from scratch, first create a project with mkdir, cd into the project, and run pnpm init to create a package.json.
\n
Next, make sure wrangler cli is installed in your project and set the wrangler keyword as an alias in your local bash session.
Create an account on the Cloudflare site and perform a login step to login to your Cloudflare dashboard to connect the Cloudflare platform to your local development environment.
\n
wrangler login
\n
Once logged in, initialize the project in the directory by accepting one of the randomly generated project folder names provided that you like, and follow the prompts to initialize your git tracked typescript "Hello World" Worker application.
\n
wrangler init
\n
To complete this step, you should press enter 4 times after wrangler init with the last step answered as No to decline deployment.
\n
This will clone down a starter repository that can be used to deploy code to the cloud.
\n
:::info Local API Testing\nAt any point in the guide, you can use the wrangler dev command in the project folder for local testing\n:::
\n","isPage":false,"text":"\nIn order to create the project from scratch, first create a project with mkdir, cd into the project, and run pnpm init to create a package.json.\nNext, make sure wrangler cli is installed in your project and set the wrangler keyword as an alias in your local bash session.\npnpm install wrangler --save-dev\nalias wrangler='./node_modules/.bin/wrangler'\nCreate an account on the Cloudflare site and perform a login step to login to your Cloudflare dashboard to connect the Cloudflare platform to your local development environment.\nwrangler login\nOnce logged in, initialize the project in the directory by accepting one of the randomly generated project folder names provided that you like, and follow the prompts to initialize your git tracked typescript "Hello World" Worker application.\nwrangler init\nTo complete this step, you should press enter 4 times after wrangler init with the last step answered as No to decline deployment.\nThis will clone down a starter repository that can be used to deploy code to the cloud.\n:::info Local API Testing\nAt any point in the guide, you can use the wrangler dev command in the project folder for local testing\n:::\n","title":"1. Setup Cloudflare environment with wrangler cli and deploy a test","titles":["Mint Collectibles Using a Gasless Serverless Relayer"]},"76":{"href":"/guides/templates/03-mint-collectibles-serverless#deploy-test","html":"\n
Finally, cd into the randomly generated project folder, and perform a wrangler deploy command.
\n
This should print a URL, which you can enter in the browser the URL https://<app>.<account>.workers.dev to view the Hello World! result.
\n","isPage":false,"text":"\nFinally, cd into the randomly generated project folder, and perform a wrangler deploy command.\nThis should print a URL, which you can enter in the browser the URL https://<app>.<account>.workers.dev to view the Hello World! result.\n","title":"Deploy Test","titles":["Mint Collectibles Using a Gasless Serverless Relayer","1. Setup Cloudflare environment with wrangler cli and deploy a test",null]},"77":{"href":"/guides/templates/03-mint-collectibles-serverless#2-deploy-sponsor-and-update-metadata-for-an-erc1155-contract-with-builder","html":"\n
Then, one must update the role access of the contract in the Builder to only receive requests from the minter wallet address, which can be done in 2 steps.
\n
You can do this in Sequence Builder by providing minter permission to your Sequence Wallet Relayer Address.
\n
In order to know what the relayer address you are working with is, one must first either:
\n\n
Have one generated for you using this dapp by selecting your network, and generating a wallet keypair with the generate local wallet button
\n
Or, you can print locally the account address produced from an EOA wallet private key using the following code snippet:
\n\n
import { Session } from "@0xsequence/auth";\nimport { ethers } from "ethers";\n\n(async () => {\n // Generate a new EOA\n // const wallet = ethers.Wallet.createRandom()\n // const privateKey = wallet.privateKey\n\n // Or, use an existing EOA private key\n const privateKey = "";\n const provider = new ethers.providers.JsonRpcProvider(\n "https://nodes.sequence.app/mainnet"\n );\n\n // Create your server EOA\n const walletEOA = new ethers.Wallet(privateKey, provider);\n\n // Open a Sequence session, this will find or create\n // a Sequence wallet controlled by your server EOA\n const session = await Session.singleSigner({\n signer: walletEOA,\n projectAccessKey: "access_key",\n });\n\n const signer = session.account.getSigner(1);\n console.log(`Your relayer wallet address: ${signer.account.address}`);\n})();
\n
To do so, open your project, navigate to the Contracts page, select your Linked contracts and under Write Contract tab expand the grantRole method.
Where the role string inputted is the result of keccak256("MINTER_ROLE") in solidity or ethers.utils.keccak256(ethers.utils.toUtf8Bytes("MINTER_ROLE")) in javascript
\n
This makes it so that only your specific address can mint from the contract, it will error otherwise.
\n
Complete the role update by clicking write and sign the sponsored transaction.
\n","isPage":false,"text":"\nFirst, follow this guide to deploy a contract.\nThen, one must update the role access of the contract in the Builder to only receive requests from the minter wallet address, which can be done in 2 steps.\nYou can do this in Sequence Builder by providing minter permission to your Sequence Wallet Relayer Address.\nIn order to know what the relayer address you are working with is, one must first either:\n\nHave one generated for you using this dapp by selecting your network, and generating a wallet keypair with the generate local wallet button\nOr, you can print locally the account address produced from an EOA wallet private key using the following code snippet:\n\nimport { Session } from "@0xsequence/auth";\nimport { ethers } from "ethers";\n \n(async () => {\n // Generate a new EOA\n // const wallet = ethers.Wallet.createRandom()\n // const privateKey = wallet.privateKey\n \n // Or, use an existing EOA private key\n const privateKey = "";\n const provider = new ethers.providers.JsonRpcProvider(\n "https://nodes.sequence.app/mainnet"\n );\n \n // Create your server EOA\n const walletEOA = new ethers.Wallet(privateKey, provider);\n \n // Open a Sequence session, this will find or create\n // a Sequence wallet controlled by your server EOA\n const session = await Session.singleSigner({\n signer: walletEOA,\n projectAccessKey: "access_key",\n });\n \n const signer = session.account.getSigner(1);\n console.log(`Your relayer wallet address: ${signer.account.address}`);\n})();\nTo do so, open your project, navigate to the Contracts page, select your Linked contracts and under Write Contract tab expand the grantRole method.\nComplete with the following details:\nbytes32 role: 0x9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6\naddress account: <Generated Sequence Relayer Wallet Address>\n\nWhere the role string inputted is the result of keccak256("MINTER_ROLE") in solidity or ethers.utils.keccak256(ethers.utils.toUtf8Bytes("MINTER_ROLE")) in javascript\nThis makes it so that only your specific address can mint from the contract, it will error otherwise.\nComplete the role update by clicking write and sign the sponsored transaction.\n","title":"2. Deploy, Sponsor and Update Metadata for an ERC1155 Contract with Builder","titles":["Mint Collectibles Using a Gasless Serverless Relayer"]},"78":{"href":"/guides/templates/03-mint-collectibles-serverless#update-metadata","html":"\n
Next, you'll need to update the metadata with your media or assets for your contract, which can be done by following this guide.
\n","isPage":false,"text":"\nNext, you'll need to update the metadata with your media or assets for your contract, which can be done by following this guide.\n","title":"Update metadata","titles":["Mint Collectibles Using a Gasless Serverless Relayer","2. Deploy, Sponsor and Update Metadata for an ERC1155 Contract with Builder",null]},"79":{"href":"/guides/templates/03-mint-collectibles-serverless#contract-sponsoring","html":"\n
Finally, in order to sponsor the contract follow this guide to sponsor a contract.
\n","isPage":false,"text":"\nFinally, in order to sponsor the contract follow this guide to sponsor a contract.\n","title":"Contract sponsoring","titles":["Mint Collectibles Using a Gasless Serverless Relayer","2. Deploy, Sponsor and Update Metadata for an ERC1155 Contract with Builder",null]},"80":{"href":"/guides/templates/03-mint-collectibles-serverless#3-use-ethauthproof-to-prevent-eoa-ddos","html":"\n
Now that we have a contract deployed, we can return to the cloudflare worker directory and project, and install ethers and 0xsequence to get access to sequence APIs in order to perform a proof validation that the request is coming from a trusted source, a sequence wallet.
\n
pnpm install 0xsequence @0xsequence/network
\n
Then, we have to add a type of middleware, after we check if it's a POST or GET request. If it's a POST request, verify that the passed in proofString and address are valid, as well as the environment variables.
\n
The code scaffold placed into src/index.ts would look like this, with callContract and getBlockNumber mocked out, using the mentioned verification step of calling verify before any contract call.
\n
import { sequence } from "0xsequence";\nimport { networks, findSupportedNetwork } from "@0xsequence/network";\n\nexport interface Env {\n PKEY: string; // Private key for EOA wallet\n CONTRACT_ADDRESS: string; // Deployed ERC1155 or ERC721 contract address\n PROJECT_ACCESS_KEY: string; // From sequence.build\n CHAIN_HANDLE: string; // Standardized chain name – See https://docs.sequence.xyz/multi-chain-support\n}\n\n// use the sequence api to verify proof came from a sequence wallet\nconst verify = async (\n chainId: string,\n walletAddress: string,\n ethAuthProofString: string\n): Promise<Boolean> => {\n const api = new sequence.api.SequenceAPIClient("https://api.sequence.app");\n const { isValid } = await api.isValidETHAuthProof({\n chainId,\n walletAddress,\n ethAuthProofString,\n });\n return isValid;\n};\n\nasync function handleRequest(\n request: Request,\n env: Env,\n ctx: ExecutionContext\n): Promise<Response> {\n if (env.PKEY === undefined || env.PKEY === "") {\n return new Response("Make sure PKEY is configured in your environment", {\n status: 400,\n });\n }\n\n if (env.CONTRACT_ADDRESS === undefined || env.CONTRACT_ADDRESS === "") {\n return new Response(\n "Make sure CONTRACT_ADDRESS is configured in your environment",\n { status: 400 }\n );\n }\n\n if (env.PROJECT_ACCESS_KEY === undefined || env.PROJECT_ACCESS_KEY === "") {\n return new Response(\n "Make sure PROJECT_ACCESS_KEY is configured in your environment",\n { status: 400 }\n );\n }\n\n if (env.CHAIN_HANDLE === undefined || env.CHAIN_HANDLE === "") {\n return new Response(\n "Make sure CHAIN_HANDLE is configured in your environment",\n { status: 400 }\n );\n }\n\n const chainConfig = findSupportedNetwork(env.CHAIN_HANDLE);\n\n if (chainConfig === undefined) {\n return new Response("Unsupported network or unknown CHAIN_HANDLE", {\n status: 400,\n });\n }\n\n // POST request\n if (request.method === "POST") {\n // parse the request body as JSON\n const body = await request.json();\n const { proof, address, tokenId }: any = body;\n try {\n // check that the proof is valid\n if (await verify(env.CHAIN_HANDLE, address, proof)) {\n try {\n // mocked call\n const res = await callContract(request, env, address, tokenId);\n return new Response(`${res.hash}`, { status: 200 });\n } catch (err: any) {\n console.log(err);\n return new Response(`Something went wrong: ${JSON.stringify(err)}`, {\n status: 400,\n });\n }\n } else {\n return new Response(`Unauthorized`, { status: 401 });\n }\n } catch (err: any) {\n return new Response(`Unauthorized ${JSON.stringify(err)}`, {\n status: 401,\n });\n }\n }\n // GET request\n else {\n try {\n // mocked call\n const res = await getBlockNumber(env.CHAIN_HANDLE, request);\n return new Response(`Block Number: ${res}`);\n } catch (err: any) {\n return new Response(`Something went wrong: ${JSON.stringify(err)}`, {\n status: 500,\n });\n }\n }\n}\n\nconst getBlockNumber = async (\n chainId: string,\n request: Request\n): Promise<number> => {\n return chainId;\n};\n\nconst callContract = async (\n request: Request,\n env: Env,\n address: string,\n tokenId: number\n): Promise<ethers.providers.TransactionResponse> => {\n return { hash: "0x" } as any;\n};\n\nexport default {\n async fetch(request: Request, env: Env, ctx: ExecutionContext) {\n // Process the request and create a response\n const response = await handleRequest(request, env, ctx);\n\n // Set CORS headers\n response.headers.set("Access-Control-Allow-Origin", "*");\n response.headers.set(\n "Access-Control-Allow-Methods",\n "GET, POST, PUT, DELETE, OPTIONS"\n );\n response.headers.set("Access-Control-Allow-Headers", "Content-Type");\n\n // return response\n return response;\n },\n};
\n","isPage":false,"text":"\nNow that we have a contract deployed, we can return to the cloudflare worker directory and project, and install ethers and 0xsequence to get access to sequence APIs in order to perform a proof validation that the request is coming from a trusted source, a sequence wallet.\npnpm install 0xsequence @0xsequence/network\nThen, we have to add a type of middleware, after we check if it's a POST or GET request. If it's a POST request, verify that the passed in proofString and address are valid, as well as the environment variables.\nThe code scaffold placed into src/index.ts would look like this, with callContract and getBlockNumber mocked out, using the mentioned verification step of calling verify before any contract call.\nimport { sequence } from "0xsequence";\nimport { networks, findSupportedNetwork } from "@0xsequence/network";\n \nexport interface Env {\n PKEY: string; // Private key for EOA wallet\n CONTRACT_ADDRESS: string; // Deployed ERC1155 or ERC721 contract address\n PROJECT_ACCESS_KEY: string; // From sequence.build\n CHAIN_HANDLE: string; // Standardized chain name – See https://docs.sequence.xyz/multi-chain-support\n}\n \n// use the sequence api to verify proof came from a sequence wallet\nconst verify = async (\n chainId: string,\n walletAddress: string,\n ethAuthProofString: string\n): Promise<Boolean> => {\n const api = new sequence.api.SequenceAPIClient("https://api.sequence.app");\n const { isValid } = await api.isValidETHAuthProof({\n chainId,\n walletAddress,\n ethAuthProofString,\n });\n return isValid;\n};\n \nasync function handleRequest(\n request: Request,\n env: Env,\n ctx: ExecutionContext\n): Promise<Response> {\n if (env.PKEY === undefined || env.PKEY === "") {\n return new Response("Make sure PKEY is configured in your environment", {\n status: 400,\n });\n }\n \n if (env.CONTRACT_ADDRESS === undefined || env.CONTRACT_ADDRESS === "") {\n return new Response(\n "Make sure CONTRACT_ADDRESS is configured in your environment",\n { status: 400 }\n );\n }\n \n if (env.PROJECT_ACCESS_KEY === undefined || env.PROJECT_ACCESS_KEY === "") {\n return new Response(\n "Make sure PROJECT_ACCESS_KEY is configured in your environment",\n { status: 400 }\n );\n }\n \n if (env.CHAIN_HANDLE === undefined || env.CHAIN_HANDLE === "") {\n return new Response(\n "Make sure CHAIN_HANDLE is configured in your environment",\n { status: 400 }\n );\n }\n \n const chainConfig = findSupportedNetwork(env.CHAIN_HANDLE);\n \n if (chainConfig === undefined) {\n return new Response("Unsupported network or unknown CHAIN_HANDLE", {\n status: 400,\n });\n }\n \n // POST request\n if (request.method === "POST") {\n // parse the request body as JSON\n const body = await request.json();\n const { proof, address, tokenId }: any = body;\n try {\n // check that the proof is valid\n if (await verify(env.CHAIN_HANDLE, address, proof)) {\n try {\n // mocked call\n const res = await callContract(request, env, address, tokenId);\n return new Response(`${res.hash}`, { status: 200 });\n } catch (err: any) {\n console.log(err);\n return new Response(`Something went wrong: ${JSON.stringify(err)}`, {\n status: 400,\n });\n }\n } else {\n return new Response(`Unauthorized`, { status: 401 });\n }\n } catch (err: any) {\n return new Response(`Unauthorized ${JSON.stringify(err)}`, {\n status: 401,\n });\n }\n }\n // GET request\n else {\n try {\n // mocked call\n const res = await getBlockNumber(env.CHAIN_HANDLE, request);\n return new Response(`Block Number: ${res}`);\n } catch (err: any) {\n return new Response(`Something went wrong: ${JSON.stringify(err)}`, {\n status: 500,\n });\n }\n }\n}\n \nconst getBlockNumber = async (\n chainId: string,\n request: Request\n): Promise<number> => {\n return chainId;\n};\n \nconst callContract = async (\n request: Request,\n env: Env,\n address: string,\n tokenId: number\n): Promise<ethers.providers.TransactionResponse> => {\n return { hash: "0x" } as any;\n};\n \nexport default {\n async fetch(request: Request, env: Env, ctx: ExecutionContext) {\n // Process the request and create a response\n const response = await handleRequest(request, env, ctx);\n \n // Set CORS headers\n response.headers.set("Access-Control-Allow-Origin", "*");\n response.headers.set(\n "Access-Control-Allow-Methods",\n "GET, POST, PUT, DELETE, OPTIONS"\n );\n response.headers.set("Access-Control-Allow-Headers", "Content-Type");\n \n // return response\n return response;\n },\n};\n","title":"3. Use EthAuthProof to prevent EOA DDoS","titles":["Mint Collectibles Using a Gasless Serverless Relayer"]},"81":{"href":"/guides/templates/03-mint-collectibles-serverless#add-cloudflare-environment-variables","html":"\n
Then, pass in the environment variables for your build by updating the [vars] section in your wrangler.toml.
\n
[vars]\nPKEY = "" # Private key for EOA wallet\nCONTRACT_ADDRESS = "" # // Deployed ERC1155 or ERC721 contract address\nPROJECT_ACCESS_KEY = "" # From sequence.build\nCHAIN_HANDLE = "" # // Standardized chain name – See https://docs.sequence.xyz/multi-chain-support
\n","isPage":false,"text":"\nThen, pass in the environment variables for your build by updating the [vars] section in your wrangler.toml.\n[vars]\nPKEY = "" # Private key for EOA wallet\nCONTRACT_ADDRESS = "" # // Deployed ERC1155 or ERC721 contract address\nPROJECT_ACCESS_KEY = "" # From sequence.build\nCHAIN_HANDLE = "" # // Standardized chain name – See https://docs.sequence.xyz/multi-chain-support\n","title":"Add cloudflare environment variables","titles":["Mint Collectibles Using a Gasless Serverless Relayer","3. Use EthAuthProof to prevent EOA DDoS",null]},"82":{"href":"/guides/templates/03-mint-collectibles-serverless#implement-window-object-in-wrangler-template","html":"\n
It should be noted, if you try to deploy this you'll get a missing window object required by the web3 modules.
\n
To prevent this, add the following line to your wrangler.toml file to make the environment compatible.
\n
...\nnode_compat = true # add this line\n...
\n","isPage":false,"text":"\nIt should be noted, if you try to deploy this you'll get a missing window object required by the web3 modules.\nTo prevent this, add the following line to your wrangler.toml file to make the environment compatible.\n...\nnode_compat = true # add this line\n...\n","title":"Implement window object in wrangler template","titles":["Mint Collectibles Using a Gasless Serverless Relayer","3. Use EthAuthProof to prevent EOA DDoS",null]},"83":{"href":"/guides/templates/03-mint-collectibles-serverless#testing-the-deploy","html":"\n
You can now redeploy using wrangler deploy
\n
And perform a curl request to test your endpoint like such:
\n
curl -X POST https://your-worker.your-subdomain.workers.dev \\\n-H "Content-Type: application/json" \\\n-d '{"proof": "<some_proof>", "address": "<some_address>", "tokenId": 0 }'\n\n... invalid proof string ...\n\n# and if you replace with actual proof (from a wallet client login) and address on polygon, it should return\nsuccess
\n
You can acquire your wallet address proof by using this dapp and follow the below steps.
\n","isPage":false,"text":"\nYou can now redeploy using wrangler deploy\nAnd perform a curl request to test your endpoint like such:\ncurl -X POST https://your-worker.your-subdomain.workers.dev \\\n-H "Content-Type: application/json" \\\n-d '{"proof": "<some_proof>", "address": "<some_address>", "tokenId": 0 }'\n\n... invalid proof string ...\n\n# and if you replace with actual proof (from a wallet client login) and address on polygon, it should return\nsuccess\nYou can acquire your wallet address proof by using this dapp and follow the below steps.\n","title":"Testing the deploy","titles":["Mint Collectibles Using a Gasless Serverless Relayer","3. Use EthAuthProof to prevent EOA DDoS",null]},"84":{"href":"/guides/templates/03-mint-collectibles-serverless#using-the-ethauthproof-viewer-dapp","html":"\n
When you arrive on the page, the first thing you should do is select a network.
\n
Then you have an option to either connect and generate the Proof, or, generate a local wallet
\n
\n
Press the connect button and then copy to clipboard.
\n
\n
It should be noted, it is best not to share this ETHAuthProof with anyone as this means someone can prove ownership of your wallet and interact with specific APIs.
\n
Finally, replace the url with your app from this step, the <some_proof> with the generated value copied from the viewer dapp, and <some_address> with your wallet address and it should return just the mocked 0x string.
\n","isPage":false,"text":"\nWhen you arrive on the page, the first thing you should do is select a network.\nThen you have an option to either connect and generate the Proof, or, generate a local wallet\n\nPress the connect button and then copy to clipboard.\n\nIt should be noted, it is best not to share this ETHAuthProof with anyone as this means someone can prove ownership of your wallet and interact with specific APIs.\nFinally, replace the url with your app from this step, the <some_proof> with the generated value copied from the viewer dapp, and <some_address> with your wallet address and it should return just the mocked 0x string.\ncurl -X POST https://your-worker.your-subdomain.workers.dev \\\n-H "Content-Type: application/json" \\\n-d '{"proof": "<some_proof>", "address": "<some_address>", "tokenId": 0 }'\n","title":"Using the ETHAuthProof Viewer dapp","titles":["Mint Collectibles Using a Gasless Serverless Relayer","3. Use EthAuthProof to prevent EOA DDoS",null]},"85":{"href":"/guides/templates/03-mint-collectibles-serverless#4-mint-a-collectible-to-wallet","html":"\n
Finally, to deploy and mint a collectible from the sponsored contract address, we install the following packages
\n
pnpm install @0xsequence/auth ethers@5.7.2
\n
and implement the callContract and getBlockNumber methods previously mocked out as follows:
Once these steps are complete, you can redeploy and test with the steps outlined in this prior step, and this time the POST request should return a transaction hash for the completed mint and the GET request would return a block number.
","isPage":false,"text":"\nFinally, to deploy and mint a collectible from the sponsored contract address, we install the following packages\npnpm install @0xsequence/auth ethers@5.7.2\nand implement the callContract and getBlockNumber methods previously mocked out as follows:\nimport { ethers } from 'ethers'\nimport { Session, SessionSettings } from '@0xsequence/auth'\n \n...\n \nconst getBlockNumber = async (chainId: string, request: Request): Promise<number> => {\n\tconst nodeUrl = `https://nodes.sequence.app/${chainId}`\n\tconst provider = new ethers.providers.JsonRpcProvider({ url: nodeUrl, skipFetchSetup: true })\n\treturn await provider.getBlockNumber()\n}\n \nconst callContract = async (request: Request, env: Env, address: string, tokenId: number): Promise<ethers.providers.TransactionResponse> => {\n \n\tconst nodeUrl = `https://nodes.sequence.app/${env.CHAIN_HANDLE}`\n\tconst relayerUrl = `https://{env.CHAIN_HANDLE}-relayer.sequence.app`\n\tconst provider = new ethers.providers.JsonRpcProvider({ url: nodeUrl, skipFetchSetup: true })\n const contractAddress = env.CONTRACT_ADDRESS\n \n // create EOA from private key\n\tconst walletEOA = new ethers.Wallet(env.PKEY, provider);\n \n\t// instantiate settings\n\tconst settings: Partial<SessionSettings> = {\n\t\tnetworks: [{\n\t\t\t...networks[findSupportedNetwork(env.CHAIN_HANDLE)!.chainId],\n\t\t\trpcUrl: findSupportedNetwork(env.CHAIN_HANDLE)!.rpcUrl,\n\t\t\tprovider: provider,\n\t\t\trelayer: {\n\t\t\t\turl: relayerUrl,\n\t\t\t\tprovider: {\n\t\t\t\t\turl: findSupportedNetwork(env.CHAIN_HANDLE)!.rpcUrl\n\t\t\t\t}\n\t\t\t}\n\t\t}],\n\t}\n \n // create a single signer sequence wallet session\n\tconst session = await Session.singleSigner({\n\t\tsettings: settings,\n\t\tsigner: walletEOA,\n\t\tprojectAccessKey: env.PROJECT_ACCESS_KEY\n\t})\n \n\t// get signer\n\tconst signer = session.account.getSigner(findSupportedNetwork(env.CHAIN_HANDLE)!.chainId)\n \n\t// create interface from partial abi\n\tconst collectibleInterface = new ethers.utils.Interface([\n\t\t'function mint(address to, uint256 tokenId, uint256 amount, bytes data)'\n\t])\n \n\t// create calldata\n\tconst data = collectibleInterface.encodeFunctionData(\n\t\t'mint', [address, tokenId, 1, "0x00"]\n\t)\n \n\t// create transaction object\n\tconst txn = { to: contractAddress, data }\n \n\ttry {\n\t\treturn await signer.sendTransaction(txn)\n\t} catch (err) {\n\t\tthrow err\n\t}\n}\nOnce these steps are complete, you can redeploy and test with the steps outlined in this prior step, and this time the POST request should return a transaction hash for the completed mint and the GET request would return a block number.\nIf you want to browse the full code, see an example implementation here","title":"4. Mint a collectible to wallet","titles":["Mint Collectibles Using a Gasless Serverless Relayer"]},"86":{"href":"/guides/templates/template-embedded-wallet#quickstart","html":"\n","isPage":true,"text":"\n","title":"Quickstart","titles":[]},"87":{"href":"/guides/templates/template-embedded-wallet#try-a-demo","html":"\n\n","isPage":false,"text":"\nTry out seamless UX of our embedded wallet at our demo\n","title":"Try a Demo","titles":["Quickstart"]},"88":{"href":"/guides/templates/template-embedded-wallet#template","html":"\n\n","isPage":false,"text":"\nGet started quickly with a template leveraging our embedded wallet.\n","title":"Template","titles":["Quickstart"]},"89":{"href":"/guides/templates/template-embedded-wallet#getting-started","html":"\n","isPage":false,"text":"\n","title":"Getting Started","titles":["Quickstart"]},"90":{"href":"/guides/templates/template-embedded-wallet#sdk-installation","html":"\n
We provide TypeScript and Unity SDKs for the Embedded Wallet authentication system. You can install the TypeScript SDK with:
\n
pnpm install @0xsequence/waas
\n
For more information on the Unity Embedded Wallet SDK, please refer to the TODO add link Unity SDK documentation
\n","isPage":false,"text":"\nWe provide TypeScript and Unity SDKs for the Embedded Wallet authentication system. You can install the TypeScript SDK with:\npnpm install @0xsequence/waas\nFor more information on the Unity Embedded Wallet SDK, please refer to the TODO add link Unity SDK documentation\n","title":"SDK Installation","titles":["Quickstart","Getting Started"]},"91":{"href":"/guides/templates/template-embedded-wallet#project-setup","html":"\n
Sequence Embedded Wallet is currently only available as a closed beta. To start using the Embedded Wallet SDKs, you'll need to contact the Sequence team and acquire API credentials. Once this is done, you will be provided with two keys:
\n
\n
Project access key
\n
Embedded Wallet configuration key
\n
\n","isPage":false,"text":"\nSequence Embedded Wallet is currently only available as a closed beta. To start using the Embedded Wallet SDKs, you'll need to contact the Sequence team and acquire API credentials. Once this is done, you will be provided with two keys:\n\nProject access key\nEmbedded Wallet configuration key\n\n","title":"Project Setup","titles":["Quickstart","Getting Started"]},"92":{"href":"/guides/templates/template-embedded-wallet#library-setup","html":"\n
To start using Sequence Embedded Wallet SDK, you'll need to create a new instance of the waas class:
\n
import { SequenceWaaS } from '@0xsequence/waas'\n\nconst waas = new SequenceWaaS({\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: 'mumbai'\n}, defaults.TEST)
\n
Note that the library is operational, but it can't be used to interact with any wallet until you have authenticated as a user.
","isPage":false,"text":"\nTo start using Sequence Embedded Wallet SDK, you'll need to create a new instance of the waas class:\nimport { SequenceWaaS } from '@0xsequence/waas'\n \nconst waas = new SequenceWaaS({\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: 'mumbai'\n}, defaults.TEST)\nNote that the library is operational, but it can't be used to interact with any wallet until you have authenticated as a user.","title":"Library Setup","titles":["Quickstart","Getting Started"]},"93":{"href":"/sdk/go/overview#go","html":"\n
go-sequence is the equivalent of 0xsequence\nbut for Go / Golang backends. In fact, all of Sequence's infrastructure is written in Go and is built with go-sequence.
\n","isPage":true,"text":"\nA complete Sequence SDK is also available in Go: https://github.com/0xsequence/go-sequence.\ngo-sequence is the equivalent of 0xsequence\nbut for Go / Golang backends. In fact, all of Sequence's infrastructure is written in Go and is built with go-sequence.\n","title":"Go","titles":[null,null]},"94":{"href":"/sdk/go/overview#ethkit","html":"\n
As part of the Sequence open source tools, our team has also built ethkit, which\nis an Ethereum dev toolkit for Go backends. ethkit supports EOA wallets,\nand you can think of it like ethers.js but for Go.
","isPage":false,"text":"\nAs part of the Sequence open source tools, our team has also built ethkit, which\nis an Ethereum dev toolkit for Go backends. ethkit supports EOA wallets,\nand you can think of it like ethers.js but for Go.","title":"ethkit","titles":[null,null]},"95":{"href":"/sdk/sequence-kit/01-overview#sequencekit-sdk","html":"\n
Sequence Kit 🧰 is the ultimate toolkit for effortlessly integrating web3 wallets into your applications, providing your users with a smooth and secure onboarding experience. With our robust tools built on the popular wagmi library, unlock a realm of possibilities in the world of web3.
\n","isPage":true,"text":"\nSequence Kit 🧰 is the ultimate toolkit for effortlessly integrating web3 wallets into your applications, providing your users with a smooth and secure onboarding experience. With our robust tools built on the popular wagmi library, unlock a realm of possibilities in the world of web3.\n","title":"SequenceKit SDK","titles":[]},"96":{"href":"/sdk/sequence-kit/01-overview#key-features","html":"\n
\n
\n
Universal Connections: Seamlessly connect via popular social logins such as Facebook, Google, Discord, and more! Your users will enjoy a smooth, secure onboarding process. 🔐🪪
\n
\n
\n
Web3 Wallet Integration: Effortlessly integrate with leading web3 wallets like WalletConnect and MetaMask. Unleash the power of blockchain with just a few clicks! 🦊 ⛓️
\n
\n
\n
Embedded Wallet Experience: Provide your users with a comprehensive embedded wallet, enabling them to manage their coins and collectibles all within your own application. 👛 🖼️ 🪙
\n
\n
\n
Explore the potential of Sequence Kit by trying out our demo!
\n","isPage":false,"text":"\n\n\nUniversal Connections: Seamlessly connect via popular social logins such as Facebook, Google, Discord, and more! Your users will enjoy a smooth, secure onboarding process. 🔐🪪\n\n\nWeb3 Wallet Integration: Effortlessly integrate with leading web3 wallets like WalletConnect and MetaMask. Unleash the power of blockchain with just a few clicks! 🦊 ⛓️\n\n\nEmbedded Wallet Experience: Provide your users with a comprehensive embedded wallet, enabling them to manage their coins and collectibles all within your own application. 👛 🖼️ 🪙\n\n\nExplore the potential of Sequence Kit by trying out our demo!\n","title":"Key Features","titles":["SequenceKit SDK"]},"97":{"href":"/sdk/sequence-kit/01-overview#next-steps","html":"\n
Ready to integrate Sequence Kit into your application? Check out our Getting Started guide. If you're already familiar with Sequence Kit dive into the available configuration options or take a look at the checkout.
","isPage":false,"text":"\nReady to integrate Sequence Kit into your application? Check out our Getting Started guide. If you're already familiar with Sequence Kit dive into the available configuration options or take a look at the checkout.","title":"Next Steps","titles":[]},"98":{"href":"/sdk/sequence-kit/02-getting-started#getting-started-with-sequence-kit","html":"\n
In this guide, we will walk you through installing Sequence Kit, triggering the connection modal, and displaying the embedded wallet in your application.
\n","isPage":true,"text":"\nIn this guide, we will walk you through installing Sequence Kit, triggering the connection modal, and displaying the embedded wallet in your application.\n","title":"Getting Started with Sequence Kit","titles":[]},"99":{"href":"/sdk/sequence-kit/02-getting-started#installing-sequence-kit-packages","html":"\n
Sequence Kit is modular, allowing you to install only the necessary packages. To get started, install the kit core package, the connectors package for interfacing with various wallet providers, and the wallet for the embedded wallet. Additionally, install other dependencies such as wagmi, viem, and 0xsequence.
\n","isPage":false,"text":"\nSequence Kit is modular, allowing you to install only the necessary packages. To get started, install the kit core package, the connectors package for interfacing with various wallet providers, and the wallet for the embedded wallet. Additionally, install other dependencies such as wagmi, viem, and 0xsequence.\nnpm install @0xsequence/kit @0xsequence/kit-connectors wagmi ethers@5.7.2 viem 0xsequence @tanstack/react-query\n# or\npnpm install @0xsequence/kit @0xsequence/kit-connectors wagmi ethers@5.7.2 viem 0xsequence @tanstack/react-query\n# or\nyarn add @0xsequence/kit @0xsequence/kit-connectors wagmi ethers@5.7.2 viem 0xsequence @tanstack/react-query\n","title":"Installing Sequence Kit Packages","titles":["Getting Started with Sequence Kit"]},"100":{"href":"/sdk/sequence-kit/02-getting-started#setting-up-the-kit-wrapper","html":"\n
To utilize the core kit wrapper for connecting web3 wallets to your application, follow these steps:
\n\n
Configure wagmi for your app. Below is a basic wagmi configuration. For advanced configurations, please refer to the wagmi documentation.
The modal will automatically close once the user signs in. You can utilize the useAccount hook from wagmi to detect the user's connection status.
\n","isPage":false,"text":"\n\nInvoke the connect modal using the useOpenConnectModal hook.\nimport { useOpenConnectModal } from '@0xsequence/kit'\nimport { useDisconnect, useAccount } from 'wagmi'\n \n \nconst MyReactComponent = () => {\n const { setOpenConnectModal } = useOpenConnectModal()\n \n const { isConnected } = useAccount()\n \n const onClick = () => {\n setOpenConnectModal(true)\n }\n \n return (\n <>\n {!isConnected && (\n <button onClick={onClick}>\n Sign in\n </button>\n )}\n </>\n )\n}\nThe modal will automatically close once the user signs in. You can utilize the useAccount hook from wagmi to detect the user's connection status.\n","title":"Triggering the Connect Modal","titles":[]},"103":{"href":"/sdk/sequence-kit/02-getting-started#invoking-the-embedded-wallet-modal","html":"\n
\n
Open the embedded wallet using the useOpenWalletModal react hook.
","isPage":false,"text":"\nThe Sequence Kit Github repository contains an example app that you can use for learning and testing.","title":"React Example","titles":[]},"105":{"href":"/sdk/sequence-kit/03-configuration#configuration-options","html":"\n
Developers can customize the Sequence Kit experience by passing configuration options to the KitProvider wrapper.
\n
Here's how you can configure the kit using these options:
\n","isPage":true,"text":"\nDevelopers can customize the Sequence Kit experience by passing configuration options to the KitProvider wrapper.\nHere's how you can configure the kit using these options:\n \n const kitConfig = {\n\t\tdefaultTheme: 'light',\n\t\tposition: 'top-left',\n\t\t...\n\t}\n \n <KitProvider config={kitConfig}>\n <App />\n <KitProvider>\n \n","title":"Configuration Options","titles":[]},"106":{"href":"/sdk/sequence-kit/03-configuration#available-options","html":"\n","isPage":false,"text":"\n","title":"Available Options","titles":[]},"107":{"href":"/sdk/sequence-kit/03-configuration#defaulttheme","html":"\n
Type
Default
string or object
dark
\n
The defaultTheme determines the color palette used for styling the modal. Possible values include:
\n
\n
'light'
\n
'dark'
\n
object
\n
\n
Specific colors can be overwritten by passing a theme override object. The Sequence Builder provides a useful playground for toying with the colors in Sequence Kit.
\n","isPage":false,"text":"\nTypeDefaultstring or objectdark\nThe defaultTheme determines the color palette used for styling the modal. Possible values include:\n\n'light'\n'dark'\nobject\n\nSpecific colors can be overwritten by passing a theme override object. The Sequence Builder provides a useful playground for toying with the colors in Sequence Kit.\n","title":"defaultTheme","titles":["Available Options"]},"108":{"href":"/sdk/sequence-kit/03-configuration#position","html":"\n
Type
Default
string
center
\n
The position parameter determines the location of the various modals on the screen. Possible values include:
\n
\n
center
\n
middle-right
\n
middle-left
\n
top-center
\n
top-right
\n
top-left
\n
bottom-center
\n
bottom-right
\n
bottom-left
\n
\n","isPage":false,"text":"\nTypeDefaultstringcenter\nThe position parameter determines the location of the various modals on the screen. Possible values include:\n\ncenter\nmiddle-right\nmiddle-left\ntop-center\ntop-right\ntop-left\nbottom-center\nbottom-right\nbottom-left\n\n","title":"position","titles":["Available Options"]},"109":{"href":"/sdk/sequence-kit/03-configuration#sign-in-modal-configuration-signin","html":"\n
The signIn object is used to configure the sign in modal.
\n","isPage":false,"text":"\nThe signIn object is used to configure the sign in modal.\n","title":"Sign In Modal Configuration (signIn)","titles":["Available Options"]},"110":{"href":"/sdk/sequence-kit/03-configuration#signinlogourl","html":"\n
\n
Type
Default
string
undefined
\n
URL of the logo to be shown in the sign in modal.
\n","isPage":false,"text":"\n\nTypeDefaultstringundefined\nURL of the logo to be shown in the sign in modal.\n","title":"signIn.logoUrl","titles":["Available Options","Sign In Modal Configuration (signIn)"]},"111":{"href":"/sdk/sequence-kit/03-configuration#signinprojectname","html":"\n
\n
Type
Default
string
undefined
\n
Name of the project to be shown in the sign in modal.
\n","isPage":false,"text":"\n\nTypeDefaultstringundefined\nName of the project to be shown in the sign in modal.\n","title":"signIn.projectName","titles":["Available Options","Sign In Modal Configuration (signIn)"]},"112":{"href":"/sdk/sequence-kit/03-configuration#signinshowemailinput","html":"\n
\n
Type
Default
boolean
true
\n
Determines whether the inline email input will be shown in the sign in modal.
\n","isPage":false,"text":"\n\nTypeDefaultbooleantrue\nDetermines whether the inline email input will be shown in the sign in modal.\n","title":"signIn.showEmailInput","titles":["Available Options","Sign In Modal Configuration (signIn)"]},"113":{"href":"/sdk/sequence-kit/03-configuration#signinsocialauthoptions","html":"\n
\n
Type
Default
string[]
['google', 'facebook', 'twitch', 'apple']
\n
Determines which authentication options will be shown as social options in the sign in modal.\nThe wallets will be displayed in the order they are passed in the array. The values correspond to the connector's id and a corresponding connector must be passed down to wagmi.
\n
For a full list of official connectors, see the connectors page.
\n","isPage":false,"text":"\n\nTypeDefaultstring[]['google', 'facebook', 'twitch', 'apple']\nDetermines which authentication options will be shown as social options in the sign in modal.\nThe wallets will be displayed in the order they are passed in the array. The values correspond to the connector's id and a corresponding connector must be passed down to wagmi.\nFor a full list of official connectors, see the connectors page.\n","title":"signIn.socialAuthOptions","titles":["Available Options","Sign In Modal Configuration (signIn)"]},"114":{"href":"/sdk/sequence-kit/03-configuration#signinwalletauthoptions","html":"\n
Determines which authentication options will be shown in the modal as web3 wallet options.\nThe wallets will be displayed in the order they are passed in the array. The values correspond to the connector's id and a corresponding connector must be passed down to wagmi.
\n
For a full list of official connectors, see the connectors page.
\n","isPage":false,"text":"\n\nTypeDefaultstring[]['sequence', 'metamask', 'wallet-connect', 'coinbase-wallet']\nDetermines which authentication options will be shown in the modal as web3 wallet options.\nThe wallets will be displayed in the order they are passed in the array. The values correspond to the connector's id and a corresponding connector must be passed down to wagmi.\nFor a full list of official connectors, see the connectors page.\n","title":"signIn.walletAuthOptions","titles":["Available Options","Sign In Modal Configuration (signIn)"]},"115":{"href":"/sdk/sequence-kit/03-configuration#displayedassets","html":"\n
Type
Default
[{ contractAddress: string, chainId: number }, ...]
undefined
\n
If provided, this will determine which assets are to be displayed in the embedded wallet modal main view.\nBy passing a list of displayed assets, only assets from the provided list will be displayed in the main view.\nIn the case that no assets are provided, all owned assets can be displayed in the main view.
","isPage":false,"text":"\nTypeDefault[{ contractAddress: string, chainId: number }, ...]undefined\nIf provided, this will determine which assets are to be displayed in the embedded wallet modal main view.\nBy passing a list of displayed assets, only assets from the provided list will be displayed in the main view.\nIn the case that no assets are provided, all owned assets can be displayed in the main view.","title":"displayedAssets","titles":["Available Options"]},"116":{"href":"/sdk/sequence-kit/04-checkout#overview","html":"\n
The checkout modal enables developers to easily facilitate cryptocurrency payments.
\n
\n","isPage":true,"text":"\nThe checkout modal enables developers to easily facilitate cryptocurrency payments.\n\n","title":"Overview","titles":[]},"117":{"href":"/sdk/sequence-kit/04-checkout#integration","html":"\n
To integrate the checkout feature, follow these steps:
\n","isPage":false,"text":"\nConfigure the checkout modal using the checkoutSettings object:\nconst checkoutSettings = {\n cryptoCheckout: {...},\n orderSummaryItems: {...}\n}\n","title":"Configuring the Checkout modal","titles":["Integration"]},"120":{"href":"/sdk/sequence-kit/04-checkout#crypto-checkout-configuration-cryptocheckout","html":"\n
The cryptoCheckout field specifies settings for checking out with cryptocurrency, e.g., interacting with a minting contract or marketplace contract.
","isPage":false,"text":"\nThe orderSummaryItems field specifies the list of collectibles shown in the order summary.\nExample configuration:\n orderSummaryItems: [\n {\n contractAddress: '0x631998e91476da5b870d741192fc5cbc55f5a52e',\n tokenId: '66597',\n quantityRaw: '100'\n },\n ]","title":"Order Summary Configuration (orderSummaryItems)","titles":["Integration","Configuring the Checkout modal"]},"122":{"href":"/sdk/sequence-kit/05-custom-connectors#custom-connectors-in-sequence-kit","html":"\n
Sequence Kit provides official connectors via the @0xsequence/kit-connectors package. However, you can also integrate custom connectors with Sequence Kit to support additional wallets. This guide will walk you through creating and using custom connectors.
\n","isPage":true,"text":"\nSequence Kit provides official connectors via the @0xsequence/kit-connectors package. However, you can also integrate custom connectors with Sequence Kit to support additional wallets. This guide will walk you through creating and using custom connectors.\n","title":"Custom Connectors in Sequence Kit","titles":[]},"123":{"href":"/sdk/sequence-kit/05-custom-connectors#creating-a-custom-connector","html":"\n
To create a custom connector, you can use an existing connector as a basis. For example, the Metamask Connector is a good starting point. Here's an example of how to create a custom connector:
Make sure to provide a unique id for your connector to avoid conflicts with other connectors. You can also customize fields such as name, logoDark, and logoLight to control how the connector appears in Sequence Kit.
\n
The createConnector function should return an initialized connector. Sequence Kit connectors are wrappers of Wagmi connectors, so you can use an official Wagmi connector if available, or create your own if needed.
\n","isPage":false,"text":"\nTo create a custom connector, you can use an existing connector as a basis. For example, the Metamask Connector is a good starting point. Here's an example of how to create a custom connector:\nexport const myCustomConnector = (options: MyCustomConnectorOptions) => ({\n id: 'my-custom-connector',\n name: 'My Custom Connector',\n logoDark: MyCustomLogoDark,\n logoLight: MyCustomLogoLight,\n createConnector: () => {\n const connector = myCustomConnector(options);\n return connector;\n },\n});\nMake sure to provide a unique id for your connector to avoid conflicts with other connectors. You can also customize fields such as name, logoDark, and logoLight to control how the connector appears in Sequence Kit.\nThe createConnector function should return an initialized connector. Sequence Kit connectors are wrappers of Wagmi connectors, so you can use an official Wagmi connector if available, or create your own if needed.\nFor more details on creating custom connectors, refer to Wagmi's guide on Custom Connectors.\n","title":"Creating a Custom Connector","titles":["Custom Connectors in Sequence Kit"]},"124":{"href":"/sdk/sequence-kit/05-custom-connectors#using-custom-connectors","html":"\n
When using custom connectors, you can't rely on the getDefaultConnectors utility function. Instead, you need to pass custom configurations to Sequence Kit.
\n
First, create a list of connectors, including your custom connector, and provide it to the Wagmi configuration:
\n","isPage":false,"text":"\nWhen using custom connectors, you can't rely on the getDefaultConnectors utility function. Instead, you need to pass custom configurations to Sequence Kit.\nFirst, create a list of connectors, including your custom connector, and provide it to the Wagmi configuration:\nimport { getKitConnectWallets } from '@0xsequence/kit';\n \nconst connectors = getKitConnectWallets([\n google({\n defaultNetwork: 137,\n connect: {\n app: 'my-app',\n projectAccessKey: '<access-key>'\n }\n }),\n // ... other connectors\n myCustomConnector({ appName: 'my-app' }),\n]);\n \nconst config = createConfig({\n transports,\n connectors,\n chains\n})\nNext, use your custom connector by specifying its id in either the socialAuthOptions or walletAuthOptions field of the Sequence Kit configuration:\nconst kitConfig = {\n signIn: {\n socialAuthOptions: ['google', 'facebook'],\n walletAuthOptions: ['metamask', 'my-custom-connector'],\n }\n};\n \nreturn (\n <WagmiConfig config={wagmiConfig}>\n <QueryClientProvider client={queryClient}>\n <KitProvider config={kitConfig}>\n <App />\n </KitProvider>\n </QueryClientProvider>\n </WagmiConfig>\n);\n","title":"Using Custom Connectors","titles":[]},"125":{"href":"/sdk/sequence-kit/05-custom-connectors#share-your-custom-connectors","html":"\n
Feel free to contribute your custom connectors by creating a pull request. This way, others can benefit from your work and enjoy seamless integration with Sequence Kit.
\n
Share the love ❤️ by expanding the ecosystem of custom connectors!
","isPage":false,"text":"\nFeel free to contribute your custom connectors by creating a pull request. This way, others can benefit from your work and enjoy seamless integration with Sequence Kit.\nShare the love ❤️ by expanding the ecosystem of custom connectors!","title":"Share Your Custom Connectors","titles":[]},"126":{"href":"/sdk/unity/01-overview#introduction","html":"\n
The Sequence Unity Embedded Wallet SDK provides full Sequence Embedded Wallet and Indexer integration for your Unity Games, integrated with our own purpose-built for Unity SequenceEthereum library. That's right, no Nethereum required!
\n
This SDK follows Semantic Versioning (major.minor.patch). While we're still in 0.x.y builds, API breaking changes can be made at any time. After 1.0.0, breaking changes will always cause a major version increment, non-breaking new features will cause a minor version increment, and bugfixes will cause a patch version increment.
\n","isPage":true,"text":"\nThe Sequence Unity Embedded Wallet SDK provides full Sequence Embedded Wallet and Indexer integration for your Unity Games, integrated with our own purpose-built for Unity SequenceEthereum library. That's right, no Nethereum required!\nThis SDK follows Semantic Versioning (major.minor.patch). While we're still in 0.x.y builds, API breaking changes can be made at any time. After 1.0.0, breaking changes will always cause a major version increment, non-breaking new features will cause a minor version increment, and bugfixes will cause a patch version increment.\n","title":"Introduction","titles":[]},"127":{"href":"/sdk/unity/01-overview#requirements","html":"\n
Unity 2021.3.6f1 or later
\n
\n
Android
\n
iOS
\n
PC standalone
\n
Mac standalone -> (Mono builds only when using Social Sign in -> in our testing MacOS doesn't pick up custom URL schemes automatically unless you run some system commands first; these system commands only work on Mono -> see OpenIdAuthentication.PlatformSpecificSetup)
\n
WebGL (excluding Social Sign in)
\n
","isPage":false,"text":"\nUnity 2021.3.6f1 or later\n\nAndroid\niOS\nPC standalone\nMac standalone -> (Mono builds only when using Social Sign in -> in our testing MacOS doesn't pick up custom URL schemes automatically unless you run some system commands first; these system commands only work on Mono -> see OpenIdAuthentication.PlatformSpecificSetup)\nWebGL (excluding Social Sign in)\n","title":"Requirements","titles":["Introduction"]},"128":{"href":"/sdk/unity/02-installation#installation","html":"\n","isPage":true,"text":"\n","title":"Installation","titles":[]},"129":{"href":"/sdk/unity/02-installation#package-manager---recommended","html":"\n\n
Ensure you have Git 2.14.0 or above installed on your machine
\n
Open Package Manager (Window > Package Manager)
\n
Click the "+" icon in the Package Manager window > "Add package from git URL..."
\n
Paste this url and click Add or press Enter on your keyboard https://github.com/0xsequence/sequence-unity.git?path=/Assets
\n
From Package Manager, click on "Samples"
\n
Import "Setup" from Samples\n
\n\n
a) This will import a Resources folder with the SequenceConfig scriptable object (more on this in Setup).
\n
b) This will also import an Editor folder with a Post Process Build script that will setup social sign in for you automatically on MacOS and iOS.
\n\n
Import TMP Essentials (if you haven't already). Note: Unity should prompt you to do this automatically if you attempt to Play or Build with a TextMeshPro object in your scene.
\n\n
\n","isPage":false,"text":"\n\nEnsure you have Git 2.14.0 or above installed on your machine\nOpen Package Manager (Window > Package Manager)\nClick the "+" icon in the Package Manager window > "Add package from git URL..."\nPaste this url and click Add or press Enter on your keyboard https://github.com/0xsequence/sequence-unity.git?path=/Assets\nFrom Package Manager, click on "Samples"\nImport "Setup" from Samples\n\n\na) This will import a Resources folder with the SequenceConfig scriptable object (more on this in Setup).\nb) This will also import an Editor folder with a Post Process Build script that will setup social sign in for you automatically on MacOS and iOS.\n\nImport TMP Essentials (if you haven't already). Note: Unity should prompt you to do this automatically if you attempt to Play or Build with a TextMeshPro object in your scene.\n\n\n","title":"Package Manager - Recommended","titles":["Installation"]},"130":{"href":"/sdk/unity/02-installation#samples","html":"\n
In addition to this documentation, we've also provided you with a few samples to help with using our SDK.
\n
These can be found by:
\n\n
Opening Package Manager
\n
Finding our SDK "Sequence WaaS SDK"
\n
Click on "Samples"
\n
Click "Import" next to any sample you wish to install. This will create a Samples folder under Assets and import the sample there. The sample will be completely mutable as it lives within your Assets folder.
\n\n
\n
The second sample "Demo Scene" is sample scene that showcases some of the features of our SDK. It serves as a useful supplement to the documentation.
\n
The third sample "Demo Tower Defense Game" is a sample game. We began with Unity's Tower Defense Template project and ripped out the save system to replace it with ERC1155s. When importing this sample game into your project, you may get a message "Script Updating Consent" that asks if you want to update the source files to the a newer API. This is because the template project was made on a much earlier version of Unity and some of the scripting APIs used by Unity have changed since the template project was created. You can simply click "Yes, just for these files". Note that, in order to play the demo game, there is some config you need to setup. However, even without configuring the game, we believe the Scripts within the project can be a useful resource when starting out.
\n
\n","isPage":false,"text":"\nIn addition to this documentation, we've also provided you with a few samples to help with using our SDK.\nThese can be found by:\n\nOpening Package Manager\nFinding our SDK "Sequence WaaS SDK"\nClick on "Samples"\nClick "Import" next to any sample you wish to install. This will create a Samples folder under Assets and import the sample there. The sample will be completely mutable as it lives within your Assets folder.\n\n\nThe second sample "Demo Scene" is sample scene that showcases some of the features of our SDK. It serves as a useful supplement to the documentation.\nThe third sample "Demo Tower Defense Game" is a sample game. We began with Unity's Tower Defense Template project and ripped out the save system to replace it with ERC1155s. When importing this sample game into your project, you may get a message "Script Updating Consent" that asks if you want to update the source files to the a newer API. This is because the template project was made on a much earlier version of Unity and some of the scripting APIs used by Unity have changed since the template project was created. You can simply click "Yes, just for these files". Note that, in order to play the demo game, there is some config you need to setup. However, even without configuring the game, we believe the Scripts within the project can be a useful resource when starting out.\n\n","title":"Samples","titles":["Installation","Package Manager - Recommended"]},"131":{"href":"/sdk/unity/02-installation#manual","html":"\n
Installing via Package Manager will put the SDK in a read-only state - note: you will still be able to modify the UI when using Package Manager.
\n
For most use cases, this is ideal. However, we recognize that some advanced users will want the flexibility to edit the SDK as they see fit.
\n
Please note that if you do chose this route that updating the SDK will become more challenging because any changes you make will be overwritten and these changes can easily go unnoticed in a version control system. In general, we feel it is safer to import the SDK in read-only mode via Package Manager and write wrappers to extend as needed, but we empower you to work with our SDK how you see fit.
\n\n
Add Newtonsoft.json to your project (if it isn't there already) via package manager. Click on the "+" icon in the Package Manager window > "Add package by name..." and add com.unity.nuget.newtonsoft-json.
Drag the .unitypackage file into your project window and import it
\n
Import TMP Essentials (if you haven't already). Note: Unity should prompt you to do this automatically if you attempt to Play or Build with a TextMeshPro object in your scene.
\n","isPage":false,"text":"\nInstalling via Package Manager will put the SDK in a read-only state - note: you will still be able to modify the UI when using Package Manager.\nFor most use cases, this is ideal. However, we recognize that some advanced users will want the flexibility to edit the SDK as they see fit.\nPlease note that if you do chose this route that updating the SDK will become more challenging because any changes you make will be overwritten and these changes can easily go unnoticed in a version control system. In general, we feel it is safer to import the SDK in read-only mode via Package Manager and write wrappers to extend as needed, but we empower you to work with our SDK how you see fit.\n\nAdd Newtonsoft.json to your project (if it isn't there already) via package manager. Click on the "+" icon in the Package Manager window > "Add package by name..." and add com.unity.nuget.newtonsoft-json.\nDownload the latest release of the Sequence Unity SDK UnityPackage\nDrag the .unitypackage file into your project window and import it\nImport TMP Essentials (if you haven't already). Note: Unity should prompt you to do this automatically if you attempt to Play or Build with a TextMeshPro object in your scene.\n","title":"Manual","titles":["Installation"]},"132":{"href":"/sdk/unity/03-setup#setup","html":"\n\n
\n
Navigate to the Resources folder imported via the Setup sample and locate the SequenceConfig ScriptableObject
\n
a) If you imported the SDK manually, you will need to create a Resources folder and SequenceConfig
\n
b) Create a Resources folder located at Assets/Resources. The SDK uses Resources.Load to load the config ScriptableObject we'll create in the next step.
\n
c) On the top bar, click Assets > Create > Sequence > SequenceConfig and place the newly created ScriptableObject at the root of your Resources folder.
\n
\n
\n
Fill in SequenceConfig with the appropriate values for your project.
\n
a) Url Scheme - You must replace this with a string that is unique to your application. This is very important. Failure to do so will cause unexpected behaviour when signing in with social sign in and it will not work.
\n
b) Builder API Keys - These are found in the Builder under Settings > API Access Keys
\n
c) WaaS Config Key - This will be given to you by the Sequence team during WaaS onboarding
\n
\n","isPage":true,"text":"\n\n\nNavigate to the Resources folder imported via the Setup sample and locate the SequenceConfig ScriptableObject\na) If you imported the SDK manually, you will need to create a Resources folder and SequenceConfig\nb) Create a Resources folder located at Assets/Resources. The SDK uses Resources.Load to load the config ScriptableObject we'll create in the next step.\nc) On the top bar, click Assets > Create > Sequence > SequenceConfig and place the newly created ScriptableObject at the root of your Resources folder.\n\n\nFill in SequenceConfig with the appropriate values for your project.\na) Url Scheme - You must replace this with a string that is unique to your application. This is very important. Failure to do so will cause unexpected behaviour when signing in with social sign in and it will not work.\nb) Builder API Keys - These are found in the Builder under Settings > API Access Keys\nc) WaaS Config Key - This will be given to you by the Sequence team during WaaS onboarding\n\n","title":"Setup","titles":[]},"133":{"href":"/sdk/unity/04-authentication#authentication","html":"\n
As a WaaS SDK, authentication is extremely important. Authentication works by establishing a session signing wallet through association with an OIDC idToken. For more on how our Embedded Wallet works, please see Embedded Wallet docs.
\n
To implement authentication, we recommend using our LoginPanel prefab. Locate this prefab under SequenceExamples > Prefabs and drag it under a Canvas in your scene.\nWe recommend having the Canvas Scaler component attached to your Canvas use the "Scale with Screen Size" UI Scale Mode. This will make it so that the LoginPanel (and any other UI elements under this Canvas) are scaled automatically when switching between build targets.
\n
Note: The LoginPanel is hidden by default. You can open it with the Open method and no arguments. To help with this, the LoginPanel GameObject is not disabled, so feel free to use GetComponentInChildren, FindObjectOfType, or similar to obtain a reference to the LoginPanel MonoBehaviour.
\n
This will provide you easy access to two authentication methods:
\n","isPage":true,"text":"\nAs a WaaS SDK, authentication is extremely important. Authentication works by establishing a session signing wallet through association with an OIDC idToken. For more on how our Embedded Wallet works, please see Embedded Wallet docs.\nTo implement authentication, we recommend using our LoginPanel prefab. Locate this prefab under SequenceExamples > Prefabs and drag it under a Canvas in your scene.\nWe recommend having the Canvas Scaler component attached to your Canvas use the "Scale with Screen Size" UI Scale Mode. This will make it so that the LoginPanel (and any other UI elements under this Canvas) are scaled automatically when switching between build targets.\nNote: The LoginPanel is hidden by default. You can open it with the Open method and no arguments. To help with this, the LoginPanel GameObject is not disabled, so feel free to use GetComponentInChildren, FindObjectOfType, or similar to obtain a reference to the LoginPanel MonoBehaviour.\nThis will provide you easy access to two authentication methods:\n","title":"Authentication","titles":[]},"134":{"href":"/sdk/unity/04-authentication#1-email-sign-in","html":"\n
Available on all platforms, email sign in leverages Amazon Cognito and provides the user with a 2FA challenge - a 6 digit code emailed to the entered address for the user to enter on the next page.\nOnce the user successfully completes the 2FA challenge, the SDK will receive an idToken in JWT format from Amazon Cognito and proceed to establish the session with WaaS API.
\n","isPage":false,"text":"\nAvailable on all platforms, email sign in leverages Amazon Cognito and provides the user with a 2FA challenge - a 6 digit code emailed to the entered address for the user to enter on the next page.\nOnce the user successfully completes the 2FA challenge, the SDK will receive an idToken in JWT format from Amazon Cognito and proceed to establish the session with WaaS API.\n","title":"1. Email Sign In","titles":["Authentication"]},"135":{"href":"/sdk/unity/04-authentication#2-social-sign-in","html":"\n
Available on all platforms except WebGL (currently), social sign in uses OIDC with the implicit flow to allow users to login via their existing Google, Discord, Facebook, or Apple accounts.\nOnce the user successfully signs in, an idToken is returned via deep link to the application.\nIn order to enable deep linking, we must register a custom URL scheme for our application. There are some platform specific requirements to set this up.
\nNote: social sign in does not work in the Editor as we cannot register a custom URL scheme.\n","isPage":false,"text":"\nAvailable on all platforms except WebGL (currently), social sign in uses OIDC with the implicit flow to allow users to login via their existing Google, Discord, Facebook, or Apple accounts.\nOnce the user successfully signs in, an idToken is returned via deep link to the application.\nIn order to enable deep linking, we must register a custom URL scheme for our application. There are some platform specific requirements to set this up.\nNote: social sign in does not work in the Editor as we cannot register a custom URL scheme.\n","title":"2. Social Sign in","titles":["Authentication"]},"136":{"href":"/sdk/unity/04-authentication#ios","html":"\n\n
Open the iOS Player Settings window (menu: Edit > Project Settings > Player Settings, then select iOS).
\n
Select Other Settings, then scroll down to Configuration.
\n
Expand the Supported URL schemes section, and add 1 to the size.
\n
In the new Element N field, enter the URL scheme you've configured in SequenceConfig.
\n\n
\n","isPage":false,"text":"\n\nOpen the iOS Player Settings window (menu: Edit > Project Settings > Player Settings, then select iOS).\nSelect Other Settings, then scroll down to Configuration.\nExpand the Supported URL schemes section, and add 1 to the size.\nIn the new Element N field, enter the URL scheme you've configured in SequenceConfig.\n\n\n","title":"iOS","titles":["Authentication","2. Social Sign in"]},"137":{"href":"/sdk/unity/04-authentication#macos","html":"\n\n
Open the Windows/Mac/Linux Player Settings window (menu: Edit > Project Settings > Player Settings, then select Windows/Mac/Linux).
\n
Select Other Settings, then scroll down to Mac Configuration.
\n
Expand the Supported URL schemes section, and add 1 to the size.
\n
In the new Element N field, enter the URL scheme you've configured in SequenceConfig.
\n\n
\n","isPage":false,"text":"\n\nOpen the Windows/Mac/Linux Player Settings window (menu: Edit > Project Settings > Player Settings, then select Windows/Mac/Linux).\nSelect Other Settings, then scroll down to Mac Configuration.\nExpand the Supported URL schemes section, and add 1 to the size.\nIn the new Element N field, enter the URL scheme you've configured in SequenceConfig.\n\n\n","title":"MacOS","titles":["Authentication","2. Social Sign in"]},"138":{"href":"/sdk/unity/04-authentication#pc","html":"\n
No additional steps required.
\n","isPage":false,"text":"\nNo additional steps required.\n","title":"PC","titles":["Authentication","2. Social Sign in"]},"139":{"href":"/sdk/unity/04-authentication#android","html":"\n\n
In the Project window, browse to Assets > Plugins > Android.
\n\n
a) Note: in Unity versions 2021.2 and up this path doesn't exist by default. Please navigate to Edit > Project Settings > Player and under the Android Publishing Settings, enable Custom Main Manifest in the Build section. See https://docs.unity3d.com/Manual/deep-linking-android.html for more info.
\n\n
If it doesn't already exist, create a new file and name it AndroidManifest.xml.
\n
Paste the following XML into the file, or, if you already have one, add the new keys from this XML to it.
\n
Make sure to replace 'sdk-powered-by-sequence' with the Url Scheme you set in SequenceConfig
\n\n
<?xml version="1.0" encoding="utf-8"?>\n <manifest\n xmlns:android="http://schemas.android.com/apk/res/android"\n xmlns:tools="http://schemas.android.com/tools"\n >\n <application>\n <activity\n android:name="com.unity3d.player.UnityPlayerActivity"\n android:theme="@style/UnityThemeSelector"\n >\n <intent-filter>\n <action android:name="android.intent.action.MAIN" />\n <category android:name="android.intent.category.LAUNCHER" />\n </intent-filter>\n <intent-filter>\n <action android:name="android.intent.action.VIEW" />\n <category android:name="android.intent.category.DEFAULT" />\n <category android:name="android.intent.category.BROWSABLE" />\n <data android:scheme="sdk-powered-by-sequence"/> <!-- substitute 'sdk-powered-by-sequence' with the Url Scheme you set in `SequenceConfig` -->\n </intent-filter>\n </activity>\n </application>\n </manifest>
\n
b) Note: Unity 2022 versions prior to 2022.3.7f1 and 2023 versions prior to 2023.1.7f1, 2023.2.0b3, or 2023.3.0a1 contain a bug with Android deep-linking. Please use this XML instead.
\n
<?xml version="1.0" encoding="utf-8"?>\n<manifest\n xmlns:android="http://schemas.android.com/apk/res/android"\n xmlns:tools="http://schemas.android.com/tools"\n>\n <application>\n <activity\n android:name="com.unity3d.player.UnityPlayerActivity"\n android:theme="@style/UnityThemeSelector"\n android:exported="true">\n <intent-filter>\n <action android:name="android.intent.action.MAIN" />\n <category android:name="android.intent.category.LAUNCHER" />\n </intent-filter>\n <meta-data android:name="unityplayer.UnityActivity" android:value="true" />\n <intent-filter>\n <action android:name="android.intent.action.VIEW" />\n <category android:name="android.intent.category.DEFAULT" />\n <category android:name="android.intent.category.BROWSABLE" />\n <data android:scheme="sdk-powered-by-sequence"/> <!-- substitute 'sdk-powered-by-sequence' with the Url Scheme you set in `SequenceConfig` -->\n </intent-filter>\n </activity>\n </application>\n</manifest>
\n","isPage":false,"text":"\n\nIn the Project window, browse to Assets > Plugins > Android.\n\na) Note: in Unity versions 2021.2 and up this path doesn't exist by default. Please navigate to Edit > Project Settings > Player and under the Android Publishing Settings, enable Custom Main Manifest in the Build section. See https://docs.unity3d.com/Manual/deep-linking-android.html for more info.\n\nIf it doesn't already exist, create a new file and name it AndroidManifest.xml.\nPaste the following XML into the file, or, if you already have one, add the new keys from this XML to it.\nMake sure to replace 'sdk-powered-by-sequence' with the Url Scheme you set in SequenceConfig\n\n <?xml version="1.0" encoding="utf-8"?>\n <manifest\n xmlns:android="http://schemas.android.com/apk/res/android"\n xmlns:tools="http://schemas.android.com/tools"\n >\n <application>\n <activity\n android:name="com.unity3d.player.UnityPlayerActivity"\n android:theme="@style/UnityThemeSelector"\n >\n <intent-filter>\n <action android:name="android.intent.action.MAIN" />\n <category android:name="android.intent.category.LAUNCHER" />\n </intent-filter>\n <intent-filter>\n <action android:name="android.intent.action.VIEW" />\n <category android:name="android.intent.category.DEFAULT" />\n <category android:name="android.intent.category.BROWSABLE" />\n <data android:scheme="sdk-powered-by-sequence"/> <!-- substitute 'sdk-powered-by-sequence' with the Url Scheme you set in `SequenceConfig` -->\n </intent-filter>\n </activity>\n </application>\n </manifest>\nb) Note: Unity 2022 versions prior to 2022.3.7f1 and 2023 versions prior to 2023.1.7f1, 2023.2.0b3, or 2023.3.0a1 contain a bug with Android deep-linking. Please use this XML instead.\n<?xml version="1.0" encoding="utf-8"?>\n<manifest\n xmlns:android="http://schemas.android.com/apk/res/android"\n xmlns:tools="http://schemas.android.com/tools"\n>\n <application>\n <activity\n android:name="com.unity3d.player.UnityPlayerActivity"\n android:theme="@style/UnityThemeSelector"\n android:exported="true">\n <intent-filter>\n <action android:name="android.intent.action.MAIN" />\n <category android:name="android.intent.category.LAUNCHER" />\n </intent-filter>\n <meta-data android:name="unityplayer.UnityActivity" android:value="true" />\n <intent-filter>\n <action android:name="android.intent.action.VIEW" />\n <category android:name="android.intent.category.DEFAULT" />\n <category android:name="android.intent.category.BROWSABLE" />\n <data android:scheme="sdk-powered-by-sequence"/> <!-- substitute 'sdk-powered-by-sequence' with the Url Scheme you set in `SequenceConfig` -->\n </intent-filter>\n </activity>\n </application>\n</manifest>\ni.e. add <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> after your first intent-filter. Please see https://forum.unity.com/threads/deep-linking-in-unity-2022-the-app-is-restarted.1447300/ for more info.\n","title":"Android","titles":["Authentication","2. Social Sign in"]},"140":{"href":"/sdk/unity/04-authentication#webgl","html":"\n
Coming soon.
\n","isPage":false,"text":"\nComing soon.\n","title":"WebGL","titles":["Authentication","2. Social Sign in"]},"141":{"href":"/sdk/unity/04-authentication#connecting-with-waas","html":"\n
Once we've received the idToken from either email login or social sign in, the SDK will handle connecting with WaaS servers for you. If you're curious how this is done, please see ConnectToWaaS in WaaSLogin.cs.\nYou'll want to subscribe to the WaaSWallet.OnWaaSWalletCreated event. This can be done with the following code snippet:
\n
WaaSWallet.OnWaaSWalletCreated += OnWaaSWalletCreatedHandler;\n\npublic void OnWaaSWalletCreatedHandler(WaaSWallet wallet) {\n // Do something\n}
\n
where OnWaaSWalletCreatedHandler is a function accepting a WaaSWallet as it's only parameter. If you're unfamiliar with working with events in Unity, check out this great Reddit post!
\n
Congratulations! You've just connected your user with WaaS, creating them a new account and non-custodial smart contract wallet as needed.
","isPage":false,"text":"\nOnce we've received the idToken from either email login or social sign in, the SDK will handle connecting with WaaS servers for you. If you're curious how this is done, please see ConnectToWaaS in WaaSLogin.cs.\nYou'll want to subscribe to the WaaSWallet.OnWaaSWalletCreated event. This can be done with the following code snippet:\nWaaSWallet.OnWaaSWalletCreated += OnWaaSWalletCreatedHandler;\n\npublic void OnWaaSWalletCreatedHandler(WaaSWallet wallet) {\n // Do something\n}\nwhere OnWaaSWalletCreatedHandler is a function accepting a WaaSWallet as it's only parameter. If you're unfamiliar with working with events in Unity, check out this great Reddit post!\nCongratulations! You've just connected your user with WaaS, creating them a new account and non-custodial smart contract wallet as needed.","title":"Connecting with WaaS","titles":["Authentication"]},"142":{"href":"/sdk/unity/05-write-to-blockchain#write-to-blockchain","html":"\n
The blockchain can be thought of as a general-purpose, publically viewable and verified, database. To write to a blockchain, similar to with a typical database, you must make a transaction.
\n
Typically, creating a blockchain transaction is rather complex, but WaaS handles that complexity for you and exposes 5 types of Transactions.
\n
Sending a transaction is an asynchronous Task. You can use await when calling WaaSWallet.SendTransaction from within an async Task if you wish to obtain the TransactionReturn object directly. Or, you can take the recommended approach which is to setup handler functions for the WaaSWallet.OnSendTransactionComplete and WaaSWallet.OnSendTransactionFailed events and call the WaaSWallet.SendTransaction method from anywhere (without await). For example:
\n
public void OnSendTransactionCompleteHandler(SuccessfulTransactionReturn result) {\n // Do something\n}\n\npublic void OnSendTransactionFailedHandler(FailedTransactionReturn result) {\n // Do something\n}\n\npublic void OnWaaSWalletCreatedHander(WaaSWallet wallet) {\n wallet.OnSendTransactionComplete += OnSendTransactionCompleteHandler;\n wallet.OnSendTransactionFailed += OnSendTransactionFailedHandler;\n}
\n
If you're unfamiliar with working with events in Unity, check out this great Reddit post!
\n","isPage":true,"text":"\nThe blockchain can be thought of as a general-purpose, publically viewable and verified, database. To write to a blockchain, similar to with a typical database, you must make a transaction.\nTypically, creating a blockchain transaction is rather complex, but WaaS handles that complexity for you and exposes 5 types of Transactions.\nSending a transaction is an asynchronous Task. You can use await when calling WaaSWallet.SendTransaction from within an async Task if you wish to obtain the TransactionReturn object directly. Or, you can take the recommended approach which is to setup handler functions for the WaaSWallet.OnSendTransactionComplete and WaaSWallet.OnSendTransactionFailed events and call the WaaSWallet.SendTransaction method from anywhere (without await). For example:\npublic void OnSendTransactionCompleteHandler(SuccessfulTransactionReturn result) {\n // Do something\n}\n\npublic void OnSendTransactionFailedHandler(FailedTransactionReturn result) {\n // Do something\n}\n\npublic void OnWaaSWalletCreatedHander(WaaSWallet wallet) {\n wallet.OnSendTransactionComplete += OnSendTransactionCompleteHandler;\n wallet.OnSendTransactionFailed += OnSendTransactionFailedHandler;\n}\nIf you're unfamiliar with working with events in Unity, check out this great Reddit post!\n","title":"Write to Blockchain","titles":[]},"143":{"href":"/sdk/unity/05-write-to-blockchain#rawtransaction","html":"\n
The most basic form of a Transaction, a raw transaction is very useful to send ETH or the gas currency of the network you are interacting with to an Address.
\n
For example, to send one MATIC to 0x9766bf76b2E3e7BCB8c61410A3fC873f1e89b43f you can use this snippet:
\n
_wallet.SendTransaction(\n Chain.Polygon,\n new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction("0x9766bf76b2E3e7BCB8c61410A3fC873f1e89b43f", DecimalNormalizer.Normalize(1))\n });
\n
where _wallet is a WaaSWallet.
\n
Note: the EVM does not support floating point numbers. As a result, token (and gas currency) values are represented by whole numbers and a "decimals" value. 1 ETH (or in the example above 1 MATIC) is represented as 1000000000000000000 (1 * 10^18) as ETH, MATIC, and most gas currencies have a "decimals" value of 18. DecimalNormalizer.Normalize (above) is a basic helper function that will return input value * 10^decimals and optionally accepts a "decimals" value as a second parameter (defaulting to 18 when not provided).
\n
Additionally, you can include data with a raw transaction in hexadecimal format as a string. For more on this, please see the advanced section of this documentation.
\n","isPage":false,"text":"\nThe most basic form of a Transaction, a raw transaction is very useful to send ETH or the gas currency of the network you are interacting with to an Address.\nFor example, to send one MATIC to 0x9766bf76b2E3e7BCB8c61410A3fC873f1e89b43f you can use this snippet:\n_wallet.SendTransaction(\n Chain.Polygon,\n new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction("0x9766bf76b2E3e7BCB8c61410A3fC873f1e89b43f", DecimalNormalizer.Normalize(1))\n });\nwhere _wallet is a WaaSWallet.\nNote: the EVM does not support floating point numbers. As a result, token (and gas currency) values are represented by whole numbers and a "decimals" value. 1 ETH (or in the example above 1 MATIC) is represented as 1000000000000000000 (1 * 10^18) as ETH, MATIC, and most gas currencies have a "decimals" value of 18. DecimalNormalizer.Normalize (above) is a basic helper function that will return input value * 10^decimals and optionally accepts a "decimals" value as a second parameter (defaulting to 18 when not provided).\nAdditionally, you can include data with a raw transaction in hexadecimal format as a string. For more on this, please see the advanced section of this documentation.\n","title":"RawTransaction","titles":["Write to Blockchain"]},"144":{"href":"/sdk/unity/05-write-to-blockchain#senderc20","html":"\n
An ERC20 token is the fungible token standard. You can easily deploy an ERC20 contract and mint tokens using our Builder. Learn how in our Builder documentation.
\n
To send an ERC20 token transaction, you can use this code snippet:
\n
_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new SendERC20(\n erc20TokenAddress,\n ToAddress,\n AmountAsString),\n });
\n
Note: as above, it is recommended to use DecimalNormalizer.Normalize to convert the amount from human readable format to EVM format. Please make sure to include the optional "decimals" int parameter if your ERC20 token has a "decimals" value that is not 18. If you're not sure how many "decimals" your ERC20 has, this can be easily read on the Builder using the "decimals" method under "Read Contract".
\n","isPage":false,"text":"\nAn ERC20 token is the fungible token standard. You can easily deploy an ERC20 contract and mint tokens using our Builder. Learn how in our Builder documentation.\nTo send an ERC20 token transaction, you can use this code snippet:\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new SendERC20(\n erc20TokenAddress,\n ToAddress,\n AmountAsString),\n });\nNote: as above, it is recommended to use DecimalNormalizer.Normalize to convert the amount from human readable format to EVM format. Please make sure to include the optional "decimals" int parameter if your ERC20 token has a "decimals" value that is not 18. If you're not sure how many "decimals" your ERC20 has, this can be easily read on the Builder using the "decimals" method under "Read Contract".\n","title":"sendERC20","titles":["Write to Blockchain"]},"145":{"href":"/sdk/unity/05-write-to-blockchain#complex-erc20-interactions","html":"\n
For interactions with ERC20 tokens outside of basic transfers, you'll want to use our SequenceEthereum library provided with the SDK. We've created ERC20 smart contract wrapper functions for your convenience that allow you to create and send RawTransactions with WaaS.
\n
First, you'll need to create an ERC20 object by providing a contract address and optionally, an ABI string, if you are using a custom variation of the ERC20 standard (not recommended).
\n
ERC20 myToken = new ERC20(myTokenAddress);
\n
with this reference, you'll have access to all of the methods implemented by the ERC20 class. Any method that returns a CallContractFunction, e.g. Mint, can be used when creating a RawTransaction with WaaS. For example:
\n
ERC20 myToken = new ERC20(myTokenAddress);\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction(myToken.Mint(toAddress, DecimalNormalizer.NormalizeAsBigInteger(amount))),\n });
\n","isPage":false,"text":"\nFor interactions with ERC20 tokens outside of basic transfers, you'll want to use our SequenceEthereum library provided with the SDK. We've created ERC20 smart contract wrapper functions for your convenience that allow you to create and send RawTransactions with WaaS.\nFirst, you'll need to create an ERC20 object by providing a contract address and optionally, an ABI string, if you are using a custom variation of the ERC20 standard (not recommended).\nERC20 myToken = new ERC20(myTokenAddress);\nwith this reference, you'll have access to all of the methods implemented by the ERC20 class. Any method that returns a CallContractFunction, e.g. Mint, can be used when creating a RawTransaction with WaaS. For example:\nERC20 myToken = new ERC20(myTokenAddress);\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction(myToken.Mint(toAddress, DecimalNormalizer.NormalizeAsBigInteger(amount))),\n });\n","title":"Complex ERC20 Interactions","titles":["Write to Blockchain","sendERC20"]},"146":{"href":"/sdk/unity/05-write-to-blockchain#senderc721","html":"\n
An ERC721 token is the non-fungible standard, you've probably heard of them as NFTs. You can easily deploy an ERC721 contract and mint tokens using our Builder. Learn how in our Builder documentation.
\n
To send an ERC721 token transaction, you can use this code snippet:
\n
_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new SendERC721(\n erc721TokenAddress,\n ToAddress,\n TokenIdAsString),\n });
\n","isPage":false,"text":"\nAn ERC721 token is the non-fungible standard, you've probably heard of them as NFTs. You can easily deploy an ERC721 contract and mint tokens using our Builder. Learn how in our Builder documentation.\nTo send an ERC721 token transaction, you can use this code snippet:\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new SendERC721(\n erc721TokenAddress,\n ToAddress,\n TokenIdAsString),\n });\n","title":"sendERC721","titles":["Write to Blockchain"]},"147":{"href":"/sdk/unity/05-write-to-blockchain#complex-erc721-interactions","html":"\n
For interactions with ERC721 tokens outside of basic transfers, you'll want to use our SequenceEthereum library provided with the SDK. We've created ERC21 smart contract wrapper functions for your convenience that allow you to create and send RawTransactions with WaaS.
\n
First, you'll need to create an ERC721 object by providing a contract address and optionally, an ABI string, if you are using a custom variation of the ERC721 standard (not recommended).
\n
ERC721 myToken = new ERC721(myTokenAddress);
\n
with this reference, you'll have access to all of the methods implemented by the ERC721 class. Any method that returns a CallContractFunction, e.g. SafeMint, can be used when creating a RawTransaction with WaaS. For example:
\n
ERC721 myToken = new ERC721(myTokenAddress);\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction(myToken.SafeMint(toAddress)),\n });
\n","isPage":false,"text":"\nFor interactions with ERC721 tokens outside of basic transfers, you'll want to use our SequenceEthereum library provided with the SDK. We've created ERC21 smart contract wrapper functions for your convenience that allow you to create and send RawTransactions with WaaS.\nFirst, you'll need to create an ERC721 object by providing a contract address and optionally, an ABI string, if you are using a custom variation of the ERC721 standard (not recommended).\nERC721 myToken = new ERC721(myTokenAddress);\nwith this reference, you'll have access to all of the methods implemented by the ERC721 class. Any method that returns a CallContractFunction, e.g. SafeMint, can be used when creating a RawTransaction with WaaS. For example:\nERC721 myToken = new ERC721(myTokenAddress);\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction(myToken.SafeMint(toAddress)),\n });\n","title":"Complex ERC721 Interactions","titles":["Write to Blockchain","sendERC721"]},"148":{"href":"/sdk/unity/05-write-to-blockchain#senderc1155","html":"\n
An ERC1155 token is the multi token standard, often referred to as SFTs (semi-fungible tokens). As co-creators of the ERC1155 standard we are firm believers in its unparalleled usefulness for games. You can easily deploy an ERC1155 contract and mint tokens using our Builder. Learn how in our Builder documentation.
\n
To send an ERC1155 token transaction, you can use this code snippet:
\n
_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new SendERC1155(\n erc1155TokenAddress,\n ToAddress,\n new SendERC1155Values[]\n {\n new SendERC1155Values(TokenIdAsString, AmountAsString),\n ...\n }),\n });
\n
Note: you can send multiple token ids from the same ERC1155 contract in a single transaction by including multiple SendERC1155Values objects in the transaction
\n","isPage":false,"text":"\nAn ERC1155 token is the multi token standard, often referred to as SFTs (semi-fungible tokens). As co-creators of the ERC1155 standard we are firm believers in its unparalleled usefulness for games. You can easily deploy an ERC1155 contract and mint tokens using our Builder. Learn how in our Builder documentation.\nTo send an ERC1155 token transaction, you can use this code snippet:\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new SendERC1155(\n erc1155TokenAddress,\n ToAddress,\n new SendERC1155Values[]\n {\n new SendERC1155Values(TokenIdAsString, AmountAsString),\n ...\n }),\n });\nNote: you can send multiple token ids from the same ERC1155 contract in a single transaction by including multiple SendERC1155Values objects in the transaction\n","title":"sendERC1155","titles":["Write to Blockchain"]},"149":{"href":"/sdk/unity/05-write-to-blockchain#complex-erc1155-interactions","html":"\n
For interactions with ERC1155 tokens outside of basic transfers, you'll want to use our SequenceEthereum library provided with the SDK. We've created ERC1155 smart contract wrapper functions for your convenience that allow you to create and send RawTransactions with WaaS.
\n
First, you'll need to create an ERC1155 object by providing a contract address and optionally, an ABI string, if you are using a custom variation of the ERC1155 standard (not recommended).
\n
ERC1155 myToken = new ERC1155(myTokenAddress);
\n
with this reference, you'll have access to all of the methods implemented by the ERC1155 class. Any method that returns a CallContractFunction, e.g. Mint, can be used when creating a RawTransaction with WaaS. For example:
\n
ERC1155 myToken = new ERC1155(myTokenAddress);\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction(myToken.Mint(toAddress, tokenId, amount)),\n });
\n","isPage":false,"text":"\nFor interactions with ERC1155 tokens outside of basic transfers, you'll want to use our SequenceEthereum library provided with the SDK. We've created ERC1155 smart contract wrapper functions for your convenience that allow you to create and send RawTransactions with WaaS.\nFirst, you'll need to create an ERC1155 object by providing a contract address and optionally, an ABI string, if you are using a custom variation of the ERC1155 standard (not recommended).\nERC1155 myToken = new ERC1155(myTokenAddress);\nwith this reference, you'll have access to all of the methods implemented by the ERC1155 class. Any method that returns a CallContractFunction, e.g. Mint, can be used when creating a RawTransaction with WaaS. For example:\nERC1155 myToken = new ERC1155(myTokenAddress);\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction(myToken.Mint(toAddress, tokenId, amount)),\n });\n","title":"Complex ERC1155 Interactions","titles":["Write to Blockchain","sendERC1155"]},"150":{"href":"/sdk/unity/05-write-to-blockchain#delayedencode","html":"\n
When calling a smart contract on an EVM-based network, the client goes through a complex process known as "ABI encoding" where the function signature you want to call as well as the parameters you're providing are encoded into a binary format. This process is complicated and error-prone so we've abstracted it all away so that you don't have to deal with it. But, if you're curious to learn how it works, please see this document.
\n
A DelayedEncode transaction allows you to call any method on an arbitrary smart contract, allowing us to handle the complicated ABI encoding process.
\n
To send a DelayedEncode transaction, you can use this code snippet:
\n
_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new DelayedEncode(ContractAddress, ValueAsString, new DelayedEncodeData(\n ContractABIAsString,\n ParametersAsObjectArray,\n FunctionNameAsString)),\n });
\n
Let's examine the above to get a better understanding of some of the variables that may be non-obvious.
\n
ValueAsString: This will usually be "0" unless you are calling a payable method denoted by the payable keyword in the smart contract definition. If you are calling a payable method, it is recommended to use DecimalNormalizer.Normalize to convert the amount from human readable format to EVM format.
\n
ContractABIAsString: This can either be the entire ABI or just the function you plan on interacting with. If you're not familiar with ABIs, we'd recommend copy-pasting the function signature (with parameters) from the contract source code on Etherscan (or the appropriate block explorer for your network) and removing the whitespace and variable names.
\n
ParametersAsObjectArray: The parameters you want to provide to the method you wish to call. No need to provide the parameter names, just their values in the order they appear in the ABI. Provide parameters in string format when in doubt.
\n
FunctionNameAsString: The name of the function you want to call as it appears in the ABI (or source code). Exclude parentheses and parameters.
\n
Putting this together, an example of using delayed encode to call the "mint" function on an ERC20 would look like this:
\n
_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new DelayedEncode(ContractAddress, "0", new DelayedEncodeData(\n "mint(address,uint256)",\n new object[]\n {\n ToAddress, DecimalNormalizer.Normalize(1)\n },\n "mint")),\n });
\n","isPage":false,"text":"\nWhen calling a smart contract on an EVM-based network, the client goes through a complex process known as "ABI encoding" where the function signature you want to call as well as the parameters you're providing are encoded into a binary format. This process is complicated and error-prone so we've abstracted it all away so that you don't have to deal with it. But, if you're curious to learn how it works, please see this document.\nA DelayedEncode transaction allows you to call any method on an arbitrary smart contract, allowing us to handle the complicated ABI encoding process.\nTo send a DelayedEncode transaction, you can use this code snippet:\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new DelayedEncode(ContractAddress, ValueAsString, new DelayedEncodeData(\n ContractABIAsString,\n ParametersAsObjectArray,\n FunctionNameAsString)),\n });\nLet's examine the above to get a better understanding of some of the variables that may be non-obvious.\nValueAsString: This will usually be "0" unless you are calling a payable method denoted by the payable keyword in the smart contract definition. If you are calling a payable method, it is recommended to use DecimalNormalizer.Normalize to convert the amount from human readable format to EVM format.\nContractABIAsString: This can either be the entire ABI or just the function you plan on interacting with. If you're not familiar with ABIs, we'd recommend copy-pasting the function signature (with parameters) from the contract source code on Etherscan (or the appropriate block explorer for your network) and removing the whitespace and variable names.\nParametersAsObjectArray: The parameters you want to provide to the method you wish to call. No need to provide the parameter names, just their values in the order they appear in the ABI. Provide parameters in string format when in doubt.\nFunctionNameAsString: The name of the function you want to call as it appears in the ABI (or source code). Exclude parentheses and parameters.\nPutting this together, an example of using delayed encode to call the "mint" function on an ERC20 would look like this:\n_wallet.SendTransaction(Chain.Polygon, new SequenceSDK.WaaS.Transaction[]\n {\n new DelayedEncode(ContractAddress, "0", new DelayedEncodeData(\n "mint(address,uint256)",\n new object[]\n {\n ToAddress, DecimalNormalizer.Normalize(1)\n },\n "mint")),\n });\n","title":"DelayedEncode","titles":["Write to Blockchain"]},"151":{"href":"/sdk/unity/05-write-to-blockchain#batch-transactions","html":"\n
Using the magic of the Sequence Smart Contract wallet, our SDK allows you to seemlessly batch transactions together. Batching transactions together is extremely beneficial as it provides material gas savings and allows you to create complex transactions, that either all pass or all fail, without deploying custom smart contracts for each bespoke use case, opening a whole new realm of design possibilities!
\n
Sending a batch transaction is easy! Simply include multiple transactions, of any type, in your transaction array when making the SendTransaction request.
\n
For example - sending a transaction of each type in a batch:
\n
_wallet.SendTransaction(\n Chain.Polygon,\n new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction(ToAddress, DecimalNormalizer.Normalize(1)),\n new SendERC20(\n erc20TokenAddress,\n ToAddress,\n AmountAsString),\n new RawTransaction(new ERC20(erc20TokenAddress).Burn(DecimalNormalizer.NormalizeAsBigInteger(amount))),\n new SendERC721(\n erc721TokenAddress,\n ToAddress,\n TokenIdAsString),\n new SendERC1155(\n erc1155TokenAddress,\n ToAddress,\n new SendERC1155Values[]\n {\n new SendERC1155Values(TokenIdAsString, AmountAsString),\n ...\n }),\n new DelayedEncode(ContractAddress, ValueAsString, new DelayedEncodeData(\n ContractABIAsString,\n ParametersAsObjectArray,\n FunctionNameAsString)),\n });
\n
Since these transactions are all batched into a single transaction by the Sequence Smart Contract Wallet before being submitted to the network, you will receive only one transaction receipt.
","isPage":false,"text":"\nUsing the magic of the Sequence Smart Contract wallet, our SDK allows you to seemlessly batch transactions together. Batching transactions together is extremely beneficial as it provides material gas savings and allows you to create complex transactions, that either all pass or all fail, without deploying custom smart contracts for each bespoke use case, opening a whole new realm of design possibilities!\nSending a batch transaction is easy! Simply include multiple transactions, of any type, in your transaction array when making the SendTransaction request.\nFor example - sending a transaction of each type in a batch:\n_wallet.SendTransaction(\n Chain.Polygon,\n new SequenceSDK.WaaS.Transaction[]\n {\n new RawTransaction(ToAddress, DecimalNormalizer.Normalize(1)),\n new SendERC20(\n erc20TokenAddress,\n ToAddress,\n AmountAsString),\n new RawTransaction(new ERC20(erc20TokenAddress).Burn(DecimalNormalizer.NormalizeAsBigInteger(amount))),\n new SendERC721(\n erc721TokenAddress,\n ToAddress,\n TokenIdAsString),\n new SendERC1155(\n erc1155TokenAddress,\n ToAddress,\n new SendERC1155Values[]\n {\n new SendERC1155Values(TokenIdAsString, AmountAsString),\n ...\n }),\n new DelayedEncode(ContractAddress, ValueAsString, new DelayedEncodeData(\n ContractABIAsString,\n ParametersAsObjectArray,\n FunctionNameAsString)),\n });\nSince these transactions are all batched into a single transaction by the Sequence Smart Contract Wallet before being submitted to the network, you will receive only one transaction receipt.","title":"Batch Transactions","titles":["Write to Blockchain"]},"152":{"href":"/sdk/unity/06-read-from-blockchain#read-from-blockchain","html":"\n
Reading from the blockchain is done using Unity-Native implementation of our Sequence Indexer.
","isPage":true,"text":"\nReading from the blockchain is done using Unity-Native implementation of our Sequence Indexer.\nWe recommend creating an instance of the ChainIndexer class. This will expose you to all the functionality offered by the IIndexer interface.\nIIndexer polygonIndexer = new ChainIndexer(Chain.Polygon);\nChainIndexer is essentially a wrapper of the Indexer static class which is fully documented here: https://docs.sequence.xyz/unity-sdk/indexer/guides.","title":"Read from Blockchain","titles":[]},"153":{"href":"/sdk/unity/07-sign-messages#sign-messages","html":"\n
Signing a message is an asynchronous Task. You can use await when calling WaaSWallet.SignMessage from within an async Task if you wish to obtain the SignMessageReturn object directly. Or, you can take the recommended approach which is to setup a handler function for the WaaSWallet.OnSignMessageComplete event and call the WaaSWallet.SignMessage method from anywhere (without await). For example:
\n
public void OnSignMessageCompleteHandler(string signature) {\n // Do something\n}\n\npublic void OnWaaSWalletCreatedHander(WaaSWallet wallet) {\n wallet.OnSignMessageComplete += OnSignMessageCompleteHandler;\n}
\n
_wallet.SignMessage(Chain.Polygon, "Message to sign");
\n
If you're unfamiliar with working with events in Unity, check out this great Reddit post!
","isPage":true,"text":"\nSigning a message is an asynchronous Task. You can use await when calling WaaSWallet.SignMessage from within an async Task if you wish to obtain the SignMessageReturn object directly. Or, you can take the recommended approach which is to setup a handler function for the WaaSWallet.OnSignMessageComplete event and call the WaaSWallet.SignMessage method from anywhere (without await). For example:\npublic void OnSignMessageCompleteHandler(string signature) {\n // Do something\n}\n\npublic void OnWaaSWalletCreatedHander(WaaSWallet wallet) {\n wallet.OnSignMessageComplete += OnSignMessageCompleteHandler;\n}\n_wallet.SignMessage(Chain.Polygon, "Message to sign");\nIf you're unfamiliar with working with events in Unity, check out this great Reddit post!","title":"Sign Messages","titles":[]},"154":{"href":"/sdk/unity/08-deploy-contracts#contract-deployment","html":"\n
While, in general, we would recommend deploying your smart contracts via the Builder, we recognize that there are some use cases where deploying a smart contract from Unity (or a Made-With-Unity application) is useful.
\n
Contract deployment involves sending a transaction, which is done via an asynchronous Task. You can use await when calling WaaSWallet.DeployContract from within an async Task if you wish to obtain the ContractDeploymentReturn object directly. Or, you can take the recommended approach which is to setup handler functions for the WaaSWallet.OnDeployContractComplete and WaaSWallet.OnDeployContractFailed events and call the WaaSWallet.DeployContract method from anywhere (without await).
\n
WaaSWallet.DeployContract is essentially a wrapper for a very special WaaSWallet.SendTransaction call and therefore, you can expect to still receive the WaaSWallet.OnSendTransactionComplete or WaaSWallet.OnSendTransactionFailed events in addition.
\n
public void OnDeployContractCompleteHandler(SuccessfulContractDeploymentReturn result) {\n Address newlyDeployedContractAddress = result.DeployedContractAddress;\n\n // Do something\n}\n\npublic void OnDeployContractFailedHandler(FailedContractDeploymentReturn result) {\n // Do something\n}\n\npublic void OnWaaSWalletCreatedHander(WaaSWallet wallet) {\n wallet.OnDeployContractComplete += OnDeployContractCompleteHandler;\n wallet.OnDeployContractFailed += OnDeployContractFailedHandler;\n}
\n
If you're unfamiliar with working with events in Unity, check out this great Reddit post!
To deploy a smart contract, you can use this code snippet:
\n
string bytecode = "Here you'll paste your compiled bytecode"\n_wallet.DeployContract(Chain.Polygon, bytecode);
","isPage":true,"text":"\nWhile, in general, we would recommend deploying your smart contracts via the Builder, we recognize that there are some use cases where deploying a smart contract from Unity (or a Made-With-Unity application) is useful.\nContract deployment involves sending a transaction, which is done via an asynchronous Task. You can use await when calling WaaSWallet.DeployContract from within an async Task if you wish to obtain the ContractDeploymentReturn object directly. Or, you can take the recommended approach which is to setup handler functions for the WaaSWallet.OnDeployContractComplete and WaaSWallet.OnDeployContractFailed events and call the WaaSWallet.DeployContract method from anywhere (without await).\nWaaSWallet.DeployContract is essentially a wrapper for a very special WaaSWallet.SendTransaction call and therefore, you can expect to still receive the WaaSWallet.OnSendTransactionComplete or WaaSWallet.OnSendTransactionFailed events in addition.\npublic void OnDeployContractCompleteHandler(SuccessfulContractDeploymentReturn result) {\n Address newlyDeployedContractAddress = result.DeployedContractAddress;\n\n // Do something\n}\n\npublic void OnDeployContractFailedHandler(FailedContractDeploymentReturn result) {\n // Do something\n}\n\npublic void OnWaaSWalletCreatedHander(WaaSWallet wallet) {\n wallet.OnDeployContractComplete += OnDeployContractCompleteHandler;\n wallet.OnDeployContractFailed += OnDeployContractFailedHandler;\n}\nIf you're unfamiliar with working with events in Unity, check out this great Reddit post!\nTo deploy a contract you'll need to first compile your smart contract code into bytecode and add the bytecode as a hexadecimal string in one of your C# scripts.\nTo deploy a smart contract, you can use this code snippet:\nstring bytecode = "Here you'll paste your compiled bytecode"\n_wallet.DeployContract(Chain.Polygon, bytecode);","title":"Contract Deployment","titles":[]},"155":{"href":"/sdk/unity/09-wallet-ui#wallet-ui","html":"\n
As a Wallet as a Service product, this SDK requires no UI. However, as we expect some apps will still choose to provide some form of wallet UI to users, we are making efforts to provide a default UI for you to use.
\n
This UI can be found under SequenceExamples.
\n
To add the UI to your scene, you can add the WalletPanel prefab found under SequenceExamples > Prefabs. It is opened using the Open method; you must provide an IWallet (e.g. a WaaSWallet) as an argument.
\n
You'll notice that the UI is still a work in progress and is also using mocks in some places (fetching transaction history and prices). These will be replaced in coming updates of the SDK, but please feel free to replace them on your own (and for bonus points, submit a PR!).
\n","isPage":true,"text":"\nAs a Wallet as a Service product, this SDK requires no UI. However, as we expect some apps will still choose to provide some form of wallet UI to users, we are making efforts to provide a default UI for you to use.\nThis UI can be found under SequenceExamples.\nTo add the UI to your scene, you can add the WalletPanel prefab found under SequenceExamples > Prefabs. It is opened using the Open method; you must provide an IWallet (e.g. a WaaSWallet) as an argument.\nYou'll notice that the UI is still a work in progress and is also using mocks in some places (fetching transaction history and prices). These will be replaced in coming updates of the SDK, but please feel free to replace them on your own (and for bonus points, submit a PR!).\n","title":"Wallet UI","titles":[]},"156":{"href":"/sdk/unity/09-wallet-ui#how-it-works","html":"\n
The sample Sequence UI is comprised of a few important components.
\n","isPage":false,"text":"\nThe sample Sequence UI is comprised of a few important components.\n","title":"How It Works","titles":["Wallet UI"]},"157":{"href":"/sdk/unity/09-wallet-ui#ui-customizability","html":"\n
Built on Unity's UI system, the UI is entirely customizable. We encourage you to make it your own and "beautify" it to suit your app!
\n","isPage":false,"text":"\nBuilt on Unity's UI system, the UI is entirely customizable. We encourage you to make it your own and "beautify" it to suit your app!\n","title":"UI Customizability","titles":["Wallet UI"]},"158":{"href":"/sdk/unity/09-wallet-ui#color-scheme-manager","html":"\n
To use the ColorSchemeManager, please perform the following in edit mode.
\n\n
Create a Color Schemescriptable object by navigating to the top bar Assets > Create > Sequence > Color Scheme and give it an appropriate name.
\n
Set the desired colors in your new scriptable object - don't forget to set the alpha values! Unity defaults these to 0.
\n
Locate the ColorSchemeManager MonoBehaviour in your scene in the inspector. In our demo scene, this is attached to the SequenceCanvas gameObject.
\n
Set your newly created scriptable object as the Color Scheme.
\n
Click "Apply". Note that this may take a few seconds to apply and you may need to click apply multiple times due to the way Unity refreshes after changes in the inspector (version dependant).
\n\n
The ColorSchemeManager isn't meant to give you perfect results and the perfect UI right out of the gate, but we hope it saves you some time on the way there!
\n","isPage":false,"text":"\nTo help you with the process, we've added a basic ColorSchemeManager script which you can experiment with in our Demo scene, which can be imported via Package Manager.\nTo use the ColorSchemeManager, please perform the following in edit mode.\n\nCreate a Color Scheme scriptable object by navigating to the top bar Assets > Create > Sequence > Color Scheme and give it an appropriate name.\nSet the desired colors in your new scriptable object - don't forget to set the alpha values! Unity defaults these to 0.\nLocate the ColorSchemeManager MonoBehaviour in your scene in the inspector. In our demo scene, this is attached to the SequenceCanvas gameObject.\nSet your newly created scriptable object as the Color Scheme.\nClick "Apply". Note that this may take a few seconds to apply and you may need to click apply multiple times due to the way Unity refreshes after changes in the inspector (version dependant).\n\nThe ColorSchemeManager isn't meant to give you perfect results and the perfect UI right out of the gate, but we hope it saves you some time on the way there!\n","title":"Color Scheme Manager","titles":["Wallet UI","UI Customizability"]},"159":{"href":"/sdk/unity/09-wallet-ui#more-customization-tools-coming-soon","html":"\n
We hope to bring you more convenience tools to help you customize the UI quicker and easier! While we have ideas of our own, nobody understands your needs better than you do, so please don't hesitate to reach out to us with any ideas you have! Or better yet, submit a PR!
","isPage":false,"text":"\nWe hope to bring you more convenience tools to help you customize the UI quicker and easier! While we have ideas of our own, nobody understands your needs better than you do, so please don't hesitate to reach out to us with any ideas you have! Or better yet, submit a PR!","title":"More Customization Tools Coming Soon","titles":["Wallet UI","UI Customizability"]},"160":{"href":"/sdk/unreal/01-overview#introduction","html":"\n
The Sequence Unreal In-Game Wallet SDK provides full Sequence In-Game Wallet and Indexer integration for games built on the Unreal Framework.
\n
This SDK follows Semantic Versioning (major.minor.patch). While we're still in 0.x.y builds, API breaking changes can be made at any time. After 1.0.0, breaking changes will always cause a major version increment, non-breaking new features will cause a minor version increment, and bugfixes will cause a patch version increment.
\n
Sequence Unreal SDK is only available as a private beta at the moment. To get access, get in touch with Sequence BD Team.
\n","isPage":true,"text":"\nThe Sequence Unreal In-Game Wallet SDK provides full Sequence In-Game Wallet and Indexer integration for games built on the Unreal Framework.\nThis SDK follows Semantic Versioning (major.minor.patch). While we're still in 0.x.y builds, API breaking changes can be made at any time. After 1.0.0, breaking changes will always cause a major version increment, non-breaking new features will cause a minor version increment, and bugfixes will cause a patch version increment.\nSequence Unreal SDK is only available as a private beta at the moment. To get access, get in touch with Sequence BD Team.\n","title":"Introduction","titles":[]},"161":{"href":"/sdk/unreal/01-overview#requirements","html":"\n
\n
Unreal 5.2 or later
\n
Android
\n
iOS
\n
PC standalone
\n
Mac standalone
\n
","isPage":false,"text":"\n\nUnreal 5.2 or later\nAndroid\niOS\nPC standalone\nMac standalone\n","title":"Requirements","titles":["Introduction"]},"162":{"href":"/sdk/unreal/02-installation#installation","html":"\n","isPage":true,"text":"\n","title":"Installation","titles":[]},"163":{"href":"/sdk/unreal/02-installation#credentials","html":"\n
Before you can use this plugin, you need to acquire the following credentials from Sequence:
\n
\n
WaaSTenantKey: This key will be given to you by the Sequence team during WaaS onboarding
\n
ProjectAccessKey: This key can be found in Sequence Builder under Settings > API Access Keys
\n
\n
You can then add these credentials in the [Config.h] file under SequencePlugin/Source/SequencePlugin/Private/Config/Config.h.
\n","isPage":false,"text":"\nBefore you can use this plugin, you need to acquire the following credentials from Sequence:\n\nWaaSTenantKey: This key will be given to you by the Sequence team during WaaS onboarding\nProjectAccessKey: This key can be found in Sequence Builder under Settings > API Access Keys\n\nYou can then add these credentials in the [Config.h] file under SequencePlugin/Source/SequencePlugin/Private/Config/Config.h.\n","title":"Credentials","titles":["Installation"]},"164":{"href":"/sdk/unreal/02-installation#security","html":"\n
You must provide an encryption key implementation at [SequenceEncryptor.cpp] function [GetStoredKey]. This function must be implemented to provide a securely stored private key that will be used to encrypt and decrypt client information. Failure to do so will result in NO information being stored or in the event you do not use a securely stored key, can result in client information being stored insecurely on their systems.
","isPage":false,"text":"\nYou must provide an encryption key implementation at [SequenceEncryptor.cpp] function [GetStoredKey]. This function must be implemented to provide a securely stored private key that will be used to encrypt and decrypt client information. Failure to do so will result in NO information being stored or in the event you do not use a securely stored key, can result in client information being stored insecurely on their systems.","title":"Security","titles":["Installation"]},"165":{"href":"/sdk/unreal/03-setup#setup","html":"\n\n
\n
Once you have the the SequencePlugin folder, you'll need to go to your project directory and create a Plugins folder in it, then copy over the SequencePlugin folder into the Plugins folder. If a Plugins folder already exists just copy the SequencePlugin folder into it.
\n
\n
\n
Launch your project, then allow it to update the UProject Settings.
\n
\n
\n
To find the SequencePlugin content folder in your content drawer enable view plugin content
\n
\n
\n
If you wish to use the in built sequence UI for login\na) Create an [Actor] you wish to be responsible for the SequenceUI then attach the [Sequence_Pawn_Component_BP] to it\nb) Setup your [Actor] Blueprint similar to how it's setup in [Custom_Spectator_Pawn] being sure to bind to the delegate that gives you Credentials [Auth_Success_Forwarder]
\n
\n
\n
Once you have those credentials you'll need to forward them to your own C++ backend in order to use the Sequence API, an example of this can be found in the [Custom_Spectator_Pawn]. This Pawn inherits from a C++ class [Sqnc_Spec_Pawn], which implements a blueprint Callable function [SetupCredentials(FCredentials_BE CredentialsIn)]. This is callable within the child class [Custom_Spectator_Pawn]. Calling this function will forward the credentials to a C++ backend.
\n
\n","isPage":true,"text":"\n\n\nOnce you have the the SequencePlugin folder, you'll need to go to your project directory and create a Plugins folder in it, then copy over the SequencePlugin folder into the Plugins folder. If a Plugins folder already exists just copy the SequencePlugin folder into it.\n\n\nLaunch your project, then allow it to update the UProject Settings.\n\n\nTo find the SequencePlugin content folder in your content drawer enable view plugin content\n\n\nIf you wish to use the in built sequence UI for login\na) Create an [Actor] you wish to be responsible for the SequenceUI then attach the [Sequence_Pawn_Component_BP] to it\nb) Setup your [Actor] Blueprint similar to how it's setup in [Custom_Spectator_Pawn] being sure to bind to the delegate that gives you Credentials [Auth_Success_Forwarder]\n\n\nOnce you have those credentials you'll need to forward them to your own C++ backend in order to use the Sequence API, an example of this can be found in the [Custom_Spectator_Pawn]. This Pawn inherits from a C++ class [Sqnc_Spec_Pawn], which implements a blueprint Callable function [SetupCredentials(FCredentials_BE CredentialsIn)]. This is callable within the child class [Custom_Spectator_Pawn]. Calling this function will forward the credentials to a C++ backend.\n\n","title":"Setup","titles":[]},"166":{"href":"/sdk/unreal/04-authentication#authentication","html":"\n","isPage":true,"text":"\n","title":"Authentication","titles":[]},"167":{"href":"/sdk/unreal/04-authentication#custom-ui-integration","html":"\n
In a C++ backend with a series of pass through [UFUNCTIONS] setup similarly to [SequenceBackendManager.h/.cpp]. Each of these calls are implemented in [UAuthenticator] you just need to pass through the data with YOUR UAuthenticator UObject
\n
//This call is platform dependent on windows & mac this is required for SSO WIP\nUFUNCTION(BlueprintCallable, CATEGORY = "Login")\nFString GetLoginURL(const ESocialSigninType& Type); \n\n//This Call is made after you've collected the ID_Token (Mac & Windows only) WIP\nUFUNCTION(BlueprintCallable, CATEGORY = "Login")\nvoid SocialLogin(const FString& IDTokenIn);\n\n//This Call is made after you've collected the email address from the Users in the UI\nUFUNCTION(BlueprintCallable, CATEGORY = "Login")\nvoid EmailLogin(const FString& EmailIn);\n\n//This is call is made after the Delegate `[AuthRequiresCode]` is fired\nUFUNCTION(BlueprintCallable, CATEGORY = "Login")\nvoid EmailCode(const FString& CodeIn);\n\n//Optional call used to check if the credentials on disk are valid or not//\nUFUNCTION(BlueprintCallable, Category = "Login")\nbool StoredCredentialsValid();
\n
To start you'll want to create a [UAuthenticator] UObject like so [UAuthenticator + Auth = NewObject<UAuthenticator>()], this UObject manages the authentication side of Sequence.
\n
Be sure to bind to the Delegates for [AuthSuccess], [AuthFailure], [AuthRequiresCode] prior to making any signin calls You can bind to these delegates like so:
\n","isPage":false,"text":"\nIn a C++ backend with a series of pass through [UFUNCTIONS] setup similarly to [SequenceBackendManager.h/.cpp]. Each of these calls are implemented in [UAuthenticator] you just need to pass through the data with YOUR UAuthenticator UObject\n//This call is platform dependent on windows & mac this is required for SSO WIP\nUFUNCTION(BlueprintCallable, CATEGORY = "Login")\nFString GetLoginURL(const ESocialSigninType& Type); \n \n//This Call is made after you've collected the ID_Token (Mac & Windows only) WIP\nUFUNCTION(BlueprintCallable, CATEGORY = "Login")\nvoid SocialLogin(const FString& IDTokenIn);\n \n//This Call is made after you've collected the email address from the Users in the UI\nUFUNCTION(BlueprintCallable, CATEGORY = "Login")\nvoid EmailLogin(const FString& EmailIn);\n \n//This is call is made after the Delegate `[AuthRequiresCode]` is fired\nUFUNCTION(BlueprintCallable, CATEGORY = "Login")\nvoid EmailCode(const FString& CodeIn);\n \n//Optional call used to check if the credentials on disk are valid or not//\nUFUNCTION(BlueprintCallable, Category = "Login")\nbool StoredCredentialsValid();\nTo start you'll want to create a [UAuthenticator] UObject like so [UAuthenticator + Auth = NewObject<UAuthenticator>()], this UObject manages the authentication side of Sequence.\nBe sure to bind to the Delegates for [AuthSuccess], [AuthFailure], [AuthRequiresCode] prior to making any signin calls You can bind to these delegates like so:\nthis->authenticator->AuthRequiresCode.AddDynamic(this, &AYourClass::YourCallReadyToReceiveCode);\nthis->authenticator->AuthFailure.AddDynamic(this, &AYourClass::YourCallShowAuthFailureScreen);\nIn the case of [AuthSuccess] since a parameter is also passed we bind to it like this\nFScriptDelegate del;\ndel.BindUFunction(this, "CallShowAuthSuccessScreen");\nthis->authenticator->AuthSuccess.Add(del);\nWhere [CallShowAuthSuccessScreen] is defined in SequenceBackendManager.h like so:\nUFUNCTION()\nvoid CallShowAuthSuccessScreen(const FCredentials_BE& CredentialsIn);\nAnd in SequenceBackendManager.cpp like so:\nvoid ASequenceBackendManager::CallShowAuthSuccessScreen(const FCredentials_BE& CredentialsIn) \n{\nthis->Credentials = CredentialsIn;\nif (this->ShowAuthSuccessDelegate.IsBound())\n this->ShowAuthSuccessDelegate.Broadcast(Credentials);\nelse\n UE_LOG(LogTemp, Error, TEXT("`[Nothing bound to: ShowAuthSuccessDelegate]`"));\n}\n","title":"Custom UI Integration","titles":["Authentication",null]},"168":{"href":"/sdk/unreal/04-authentication#email-based-authentication","html":"\n\n
\n
To start email based authentication you'll start it with this call [EmailLogin(const FString& EmailIn)], supplying an email you've collected from the User in your GUI.
\n
\n
\n
Next [AuthRequiresCode] will fire when the backend is ready to receive the Code from your UI. Collect this code from your GUI and send it to the authenticator using [EmailCode(CodeIn)].
\n
\n
\n
Finally [AuthSuccess] will fire with a Credentials_BE struct as a parameter. This is your non registered credentials from EmailAuth. You are done Email Based Auth.
\n
\n\n","isPage":false,"text":"\n\n\nTo start email based authentication you'll start it with this call [EmailLogin(const FString& EmailIn)], supplying an email you've collected from the User in your GUI.\n\n\nNext [AuthRequiresCode] will fire when the backend is ready to receive the Code from your UI. Collect this code from your GUI and send it to the authenticator using [EmailCode(CodeIn)].\n\n\nFinally [AuthSuccess] will fire with a Credentials_BE struct as a parameter. This is your non registered credentials from EmailAuth. You are done Email Based Auth.\n\n\n","title":"Email based Authentication","titles":["Authentication",null]},"169":{"href":"/sdk/unreal/04-authentication#social-signin-based-authentication-on-desktop","html":"\n\n
\n
To start SSO based authentication with desktop you can either use your own implementation to get the necessary id_token or you can make use of Unreal's web browser plugin.
\n
\n
\n
With whatever implementation you chose you can forward the colleted id_token to the UAuthenticator object with [SocialLogin(const FString& IDTokenIn)], after which [AuthSuccess] will fire and you're done desktop based SSO.
\n
\n\n","isPage":false,"text":"\n\n\nTo start SSO based authentication with desktop you can either use your own implementation to get the necessary id_token or you can make use of Unreal's web browser plugin.\n\n\nWith whatever implementation you chose you can forward the colleted id_token to the UAuthenticator object with [SocialLogin(const FString& IDTokenIn)], after which [AuthSuccess] will fire and you're done desktop based SSO.\n\n\n","title":"Social Signin based Authentication on Desktop","titles":["Authentication",null]},"170":{"href":"/sdk/unreal/04-authentication#social-signin-based-authentication-on-mobile","html":"\n
WIP
","isPage":false,"text":"\nWIP","title":"Social Signin based Authentication on Mobile","titles":["Authentication",null]},"171":{"href":"/sdk/unreal/05-api-integration#api-integration","html":"\n","isPage":true,"text":"\n","title":"API Integration","titles":[]},"172":{"href":"/sdk/unreal/05-api-integration#sequence-api","html":"\n
After you've completed initial authentication and have intercepted the credentials either through your UI or ours, to use the Sequence API you'll need to create a [USequenceWallet] by using:
\n
`[USequenceWallet * Api = USequenceWallet(CredentialsIn)]` or `[USequenceWallet * Api = USequenceWallet::Make(CredentialsIn, ProviderURL)]`
\n
Once you have your [USequenceWallet] UObject call [Api>RegisterSession(OnSuccess,GenericFailure)] this will register your credentials with the Sequence API. Note not calling Register prior to make any others calls will result in errors as a UserWallet hasn't been supplied until this point.
\n
`*
\n
Assuming you've setup your controlling Actor with the [Sequence_Pawn_Component_BP]\nThe sequence pawn component has functions to do the following:
\n
Setup Sequence (sets up the sequence based systems), requires playerController input
\n
Show GUI Shows the UI
\n
Hide GUI Hides the UI
\n
GUI Visible Simple Visibility test for the UI
\n
Switch Platform (Switches which mode the UI will be in and how it will be displayed)
\n
Note: this doesn't rotate the application into any one view it just make the UI responsive to that type of view.
\n
Modes:
\n
\n
Desktop (default)
\n
Mobile Portrait (Custom built for portrait mode reducing the X width where ever possible)
\n
Mobile Landscape
\n
\n
`*
\n","isPage":false,"text":"\nAfter you've completed initial authentication and have intercepted the credentials either through your UI or ours, to use the Sequence API you'll need to create a [USequenceWallet] by using:\n`[USequenceWallet * Api = USequenceWallet(CredentialsIn)]` or `[USequenceWallet * Api = USequenceWallet::Make(CredentialsIn, ProviderURL)]`\nOnce you have your [USequenceWallet] UObject call [Api>RegisterSession(OnSuccess,GenericFailure)] this will register your credentials with the Sequence API. Note not calling Register prior to make any others calls will result in errors as a UserWallet hasn't been supplied until this point.\n`*\nAssuming you've setup your controlling Actor with the [Sequence_Pawn_Component_BP]\nThe sequence pawn component has functions to do the following:\nSetup Sequence (sets up the sequence based systems), requires playerController input\nShow GUI Shows the UI\nHide GUI Hides the UI\nGUI Visible Simple Visibility test for the UI\nSwitch Platform (Switches which mode the UI will be in and how it will be displayed)\nNote: this doesn't rotate the application into any one view it just make the UI responsive to that type of view.\nModes:\n\nDesktop (default)\nMobile Portrait (Custom built for portrait mode reducing the X width where ever possible)\nMobile Landscape\n\n`*\n","title":"Sequence API","titles":["API Integration",null]},"173":{"href":"/sdk/unreal/05-api-integration#sequence-unreal-api","html":"\n
The Sequence Unreal plugin is broken up into a few different parts in order to manage all of the differing functionality. Here we'll go through each parts purpose then summarize how to use them all together below
\n
The SDK automatically stores credentials on disk in the following cases:
\n\n
On Successful Auth
\n
On Successful Registering of a session
\n
On Successful Closing of a session
\n\n","isPage":false,"text":"\nThe Sequence Unreal plugin is broken up into a few different parts in order to manage all of the differing functionality. Here we'll go through each parts purpose then summarize how to use them all together below\nThe SDK automatically stores credentials on disk in the following cases:\n\nOn Successful Auth\nOn Successful Registering of a session\nOn Successful Closing of a session\n\n","title":"Sequence Unreal API","titles":["API Integration",null]},"174":{"href":"/sdk/unreal/05-api-integration#usequencewallet","html":"\n
Where the Credentials you give are the credentials you received from the UAuthenticator when [AuthSuccess] fires, or you can use the call Auth->[GetStoredCredentials](), where Auth is of the type [UAuthenticator]. If you are using StoredCredentials please ensure they are valid by checking the wrapping Structs FStoredCredentials_BE.GetValid() flag returned from [GetStoredCredentials], the providerURL is the url of the provider you wish to use.
\n
Once you have your [USequenceWallet] UObject please ensure that you've registered the session using [RegisterSession] before attempting to make other calls to the API.
\n","isPage":false,"text":"\nTo get a USequenceWallet call either:\nUSequenceWallet::Make(FCredentials_BE CredentialsIn)\nUSequenceWallet::Make(FCredentials_BE CredentialsIn, FString ProviderURL)\nWhere the Credentials you give are the credentials you received from the UAuthenticator when [AuthSuccess] fires, or you can use the call Auth->[GetStoredCredentials](), where Auth is of the type [UAuthenticator]. If you are using StoredCredentials please ensure they are valid by checking the wrapping Structs FStoredCredentials_BE.GetValid() flag returned from [GetStoredCredentials], the providerURL is the url of the provider you wish to use.\nOnce you have your [USequenceWallet] UObject please ensure that you've registered the session using [RegisterSession] before attempting to make other calls to the API.\n","title":"USequenceWallet","titles":["API Integration",null]},"175":{"href":"/sdk/unreal/05-api-integration#sequence-api-methods","html":"\n
We make use of TFunctions with some callbacks:
\n
TSuccessCallback\nconst TFunction<void(FString)> OnResponse = `[Capturable variables]`(const FString& Response)\n{\n//callback body where we can process Response\n};\n\nFFailureCallback\nconst TFunction<void(FSequenceError)> OnFailureTest = `[Capturable variables]`(const FSequenceError& Error)\n{\n//callback body where we can process Error\n};
\n
One thing to be aware of is keep an eye on capturables if you have lots of nested TFunctions it's very easy to miss something and start over writing memory. If you require lots of nesting swapping to a better approach using UFUNCTION callbacks helps to avoid these problems similar to how things are done in [UAuthenticator.h/cpp]
","isPage":false,"text":"\nWe make use of TFunctions with some callbacks:\nTSuccessCallback\nconst TFunction<void(FString)> OnResponse = `[Capturable variables]`(const FString& Response)\n{\n//callback body where we can process Response\n};\n \nFFailureCallback\nconst TFunction<void(FSequenceError)> OnFailureTest = `[Capturable variables]`(const FSequenceError& Error)\n{\n//callback body where we can process Error\n};\nOne thing to be aware of is keep an eye on capturables if you have lots of nested TFunctions it's very easy to miss something and start over writing memory. If you require lots of nesting swapping to a better approach using UFUNCTION callbacks helps to avoid these problems similar to how things are done in [UAuthenticator.h/cpp]","title":"Sequence API Methods","titles":["API Integration",null]},"176":{"href":"/sdk/unreal/06-packaging#packaging","html":"\n
To set your system up for Packaging please refer to the following links:
\n","isPage":true,"text":"\nTo set your system up for Packaging please refer to the following links:\n\nWindows and macOS\nAndroid\niOS\n\n","title":"Packaging","titles":[]},"177":{"href":"/sdk/unreal/06-packaging#google-sso-setup","html":"\n
In order to be able to properly use Google Auth, create and place the Keystore file by following these instructions.
\n
You will also need to generate an [Android client ID] and a [Web Application client ID] for your application, as well as place the [Web Application client ID] in the Config/Config.hFAuthenticatorConfig.GoogleClientID field.
\n
Refer to these docs to generate [Android client ID] and [Web Application client ID].
\n
This guide helps explain how to collect SHA-1 key fingerprints for the [Android client ID].
\n","isPage":false,"text":"\nIn order to be able to properly use Google Auth, create and place the Keystore file by following these instructions.\nYou will also need to generate an [Android client ID] and a [Web Application client ID] for your application, as well as place the [Web Application client ID] in the Config/Config.h FAuthenticatorConfig.GoogleClientID field.\nRefer to these docs to generate [Android client ID] and [Web Application client ID].\nThis guide helps explain how to collect SHA-1 key fingerprints for the [Android client ID].\n","title":"Google SSO Setup","titles":["Packaging",null]},"178":{"href":"/sdk/unreal/06-packaging#ios","html":"\n
\n","isPage":false,"text":"\nFor iOS apps you also need to setup provisioning, following these docs.\n","title":"iOS","titles":["Packaging",null]},"179":{"href":"/sdk/unreal/06-packaging#unreal-and-xcode-specifics","html":"\n
During the Unreal Package process there is a very high chance that it will fail due to a code signing error, in the event that this happens please take the following steps within XCode to get your packaged .app file
\n\n
After packaging the project in Unreal, open the Xcode project (Sequence-unreal folder -> Intermediate -> ProjectFilesIOS -> SequenceUnreal.xcodeproj)
\n
Click on the project name on the left hand side to open up project settings
\n
Click the Build Phase Tab
\n
Click on the "+" icon at the top left
\n
Select Run Script
\n
Drag the new run script to one below from the last item in the phase list
\n
Expand the run script
\n
In the script box, add the following command: xattr -cr /path-to-your-project/sequence-unreal/Binaries/IOS/Payload/SequenceUnreal.app
\n
Click on the Build Settings tab
\n
Click on each item under the Architectures header that contains macOS and hit the delete key
\n
Click on the General tab
\n
Click on Mac and Applevision Pro under supported destinations and hit the delete key
\n
Now the project can be built (if the build fails at first, wait a few moments then try again. It can sometimes take a bit before the build registers the run script)
\n
Once you have finished running the project, and want to make changes to the code, REMEMBER to delete this xcodeproj file in the sequence-unreal folder to ensure that a new xcodeproj is creating when you packaging the project again.
\n","isPage":false,"text":"\nDuring the Unreal Package process there is a very high chance that it will fail due to a code signing error, in the event that this happens please take the following steps within XCode to get your packaged .app file\n\nAfter packaging the project in Unreal, open the Xcode project (Sequence-unreal folder -> Intermediate -> ProjectFilesIOS -> SequenceUnreal.xcodeproj)\nClick on the project name on the left hand side to open up project settings\nClick the Build Phase Tab\nClick on the "+" icon at the top left\nSelect Run Script\nDrag the new run script to one below from the last item in the phase list\nExpand the run script\nIn the script box, add the following command: xattr -cr /path-to-your-project/sequence-unreal/Binaries/IOS/Payload/SequenceUnreal.app\nClick on the Build Settings tab\nClick on each item under the Architectures header that contains macOS and hit the delete key\nClick on the General tab\nClick on Mac and Applevision Pro under supported destinations and hit the delete key\nNow the project can be built (if the build fails at first, wait a few moments then try again. It can sometimes take a bit before the build registers the run script)\nOnce you have finished running the project, and want to make changes to the code, REMEMBER to delete this xcodeproj file in the sequence-unreal folder to ensure that a new xcodeproj is creating when you packaging the project again.\n","title":"Unreal and Xcode Specifics","titles":["Packaging",null]},"180":{"href":"/solutions/marketplaces/overview#marketplaces-overview","html":"\n
Sequence provides a variety of options for your marketplace and in-game store to accelerate your development, namely our white-label marketplace as well as our suite of Marketplace APIs.
\n","isPage":true,"text":"\nSequence provides a variety of options for your marketplace and in-game store to accelerate your development, namely our white-label marketplace as well as our suite of Marketplace APIs.\n","title":"Marketplaces Overview","titles":[]},"181":{"href":"/solutions/marketplaces/overview#what-are-the-differences-between-these-options","html":"\n
The white-label marketplace is ideal for getting started with a browser-based marketplace in literally minutes - all with no-coding experience and options to customize the marketplace to fit your branding such as fonts, colors, and logos. Our white-label marketplace is ideal if you want to minimize development time, focus on a web-based experience for your users, and start selling assets.
\n
Conversely, our Marketplace APIs give you complete control & customization so you can build your own UI while leaving the complexity of blockchain & backend orchestration to us. Our APIs can be utilized in game engines such as Unity or Unreal to build an in-game marketplace or store. Alternatively, they can be leveraged via a web-based experience in the browser as well - the choice is yours.
\n
You can even mix and match these options! For example, launching your own white-label marketplace for selling your initial game assets while building out your game. Then once launched, your in-game store uses the marketplace APIs to showcase these assets and offer new ones - while ensuring a seamless user experience as the user never needs to leave the game.
\n","isPage":false,"text":"\nThe white-label marketplace is ideal for getting started with a browser-based marketplace in literally minutes - all with no-coding experience and options to customize the marketplace to fit your branding such as fonts, colors, and logos. Our white-label marketplace is ideal if you want to minimize development time, focus on a web-based experience for your users, and start selling assets.\nConversely, our Marketplace APIs give you complete control & customization so you can build your own UI while leaving the complexity of blockchain & backend orchestration to us. Our APIs can be utilized in game engines such as Unity or Unreal to build an in-game marketplace or store. Alternatively, they can be leveraged via a web-based experience in the browser as well - the choice is yours.\nYou can even mix and match these options! For example, launching your own white-label marketplace for selling your initial game assets while building out your game. Then once launched, your in-game store uses the marketplace APIs to showcase these assets and offer new ones - while ensuring a seamless user experience as the user never needs to leave the game.\n","title":"What are the differences between these options?","titles":["Marketplaces Overview",null]},"182":{"href":"/solutions/marketplaces/overview#getting-started","html":"\n
To get started with the white-label marketplace, check out our page for more information and a helpful video to walk you through the process.
\n
Additionally, our quickstart page for the Marketplace APIs has a variety of templates, demos, and common integration patterns needed to get you started. We also provide a step by step guide of leveraging the APIs for (building a custom marketplace)[/guides/template-marketplace-api]
","isPage":false,"text":"\nTo get started with the white-label marketplace, check out our page for more information and a helpful video to walk you through the process.\nAdditionally, our quickstart page for the Marketplace APIs has a variety of templates, demos, and common integration patterns needed to get you started. We also provide a step by step guide of leveraging the APIs for (building a custom marketplace)[/guides/template-marketplace-api]","title":"Getting Started","titles":["Marketplaces Overview",null]},"183":{"href":"/solutions/wallets/overview#sequence-wallets-overview","html":"\n
Sequence offers multiple wallet options to integrate into your products, chiefly we call these our In-Game Wallet and our Universal Wallet which are both completely non-custodial.
\n","isPage":true,"text":"\nSequence offers multiple wallet options to integrate into your products, chiefly we call these our In-Game Wallet and our Universal Wallet which are both completely non-custodial.\n","title":"Sequence Wallets Overview","titles":[]},"184":{"href":"/solutions/wallets/overview#what-are-the-differences-between-these-options","html":"\n
The In-Game Wallet is primarily focused on delivering a traditional game experience that is headless with no mandatory pop-ups, modals, transaction signing, or other additional distractions take players out of them trying to enjoy the game. Users can login with common social logins or other authentication providers and simply jump into the experience. We provide native support for a variety of popular game engines such as Unreal and Unity as well as Typescript support so you can stay within your preferred framework for building games or experiences.
\n
\n
Conversely, our Universal Wallet is geared more towards native blockchain users with a focus on games and gaming assets. Existing blockchain users will feel right at home where you can leverage our wallet infrastructure for creating great experiences for web3 users, complete with a Typescript SDK for easy integration.
\n","isPage":false,"text":"\nThe In-Game Wallet is primarily focused on delivering a traditional game experience that is headless with no mandatory pop-ups, modals, transaction signing, or other additional distractions take players out of them trying to enjoy the game. Users can login with common social logins or other authentication providers and simply jump into the experience. We provide native support for a variety of popular game engines such as Unreal and Unity as well as Typescript support so you can stay within your preferred framework for building games or experiences.\n\nConversely, our Universal Wallet is geared more towards native blockchain users with a focus on games and gaming assets. Existing blockchain users will feel right at home where you can leverage our wallet infrastructure for creating great experiences for web3 users, complete with a Typescript SDK for easy integration.\n","title":"What are the differences between these options?","titles":["Sequence Wallets Overview",null]},"185":{"href":"/solutions/wallets/overview#what-are-the-benefits-of-each-and-how-can-i-leverage-them","html":"\n
All integrations provide non-custodial smart contract wallets with account abstraction advantages like optionality for gasless transactions. We recommend our In-Game Wallet if you are focused on a seamless, headless web2/2.5-like experience for your players or our Universal Wallet for prioritizing web2.5/web3 native users.
\n
Best of all, our wallet connector called SequenceKit integrates both options in a convenient, customizable UI written in Typescript, which you can leverage to cater to users with an existing wallet such as Metamask and millions of potential new users that want the convenience of social login.
\n","isPage":false,"text":"\nAll integrations provide non-custodial smart contract wallets with account abstraction advantages like optionality for gasless transactions. We recommend our In-Game Wallet if you are focused on a seamless, headless web2/2.5-like experience for your players or our Universal Wallet for prioritizing web2.5/web3 native users.\nBest of all, our wallet connector called SequenceKit integrates both options in a convenient, customizable UI written in Typescript, which you can leverage to cater to users with an existing wallet such as Metamask and millions of potential new users that want the convenience of social login.\n","title":"What are the benefits of each and how can I leverage them?","titles":["Sequence Wallets Overview",null]},"186":{"href":"/solutions/wallets/overview#getting-started","html":"\n
Please check out Sequence Builder to create a project and select Wallets to get started. This will provide the corresponding code snippets with our convenient SDKs to get started.
\n
Alternatively, our quickstart page for In-Game Wallets and Universal Wallets has all the templates, demos, and common integration patterns needed to accelerate your development.
","isPage":false,"text":"\nPlease check out Sequence Builder to create a project and select Wallets to get started. This will provide the corresponding code snippets with our convenient SDKs to get started.\nAlternatively, our quickstart page for In-Game Wallets and Universal Wallets has all the templates, demos, and common integration patterns needed to accelerate your development.","title":"Getting Started","titles":["Sequence Wallets Overview",null]},"187":{"href":"/sdk/typescript/03-guides/01-connect-wallet#connect-wallet","html":"\n
Sequence is a very flexible wallet which allow users multiple ways to connect / access their wallet. This includes:
\n\n
\n
On-demand Ethereum web wallet for new users via 0xsequence npm package + https://sequence.app -- this option allows\ndevelopers to offer users an on-demand web3 wallet. No user install required -- any browser will just work, and users\ncan onboard with a familiar Web2 experience. Think of it like Paypal / Stripe but for web3.
\n
\n
\n
Surf all of web3 via Sequence Wallet Chrome Extension -- users\nwho have the Sequence Wallet Chrome Extension installed are able to access any Ethereum-compatible Dapp on the Web :) Just like how MetaMask works,\nbut of course with a bunch of the benefits of Sequence.
\n
\n
\n
Mobile phone access via WalletConnect support within Sequence Wallet -- users are able to communicate with their wallets remotely\nvia the awesome Wallet Connect protocol. This is an excellent option if using Sequence Wallet from your mobile phone and want to connect\nyour wallet to a desktop dapp.
\n
\n\n
Sequence Wallet is built on Web Browser (W3C) and Ethereum web3 standards -- and is available everywhere that a modern browser is able to run.\nWe've carefully designed the wallet for simple onboarding, while maintaining security for users, and allowing users to progressively\nincrease the level of their security through additional keys and measures.
\n
This means, that if you've developed a dapp to work with MetaMask, then Sequence will work too without any changes. If you're\nusing web3.js or ethers.js, Sequence will just work too. This is the beauty of interoperability on web3 :)
\n","isPage":true,"text":"\nSequence is a very flexible wallet which allow users multiple ways to connect / access their wallet. This includes:\n\n\nOn-demand Ethereum web wallet for new users via 0xsequence npm package + https://sequence.app -- this option allows\ndevelopers to offer users an on-demand web3 wallet. No user install required -- any browser will just work, and users\ncan onboard with a familiar Web2 experience. Think of it like Paypal / Stripe but for web3.\n\n\nSurf all of web3 via Sequence Wallet Chrome Extension -- users\nwho have the Sequence Wallet Chrome Extension installed are able to access any Ethereum-compatible Dapp on the Web :) Just like how MetaMask works,\nbut of course with a bunch of the benefits of Sequence.\n\n\nMobile phone access via WalletConnect support within Sequence Wallet -- users are able to communicate with their wallets remotely\nvia the awesome Wallet Connect protocol. This is an excellent option if using Sequence Wallet from your mobile phone and want to connect\nyour wallet to a desktop dapp.\n\n\nSequence Wallet is built on Web Browser (W3C) and Ethereum web3 standards -- and is available everywhere that a modern browser is able to run.\nWe've carefully designed the wallet for simple onboarding, while maintaining security for users, and allowing users to progressively\nincrease the level of their security through additional keys and measures.\nThis means, that if you've developed a dapp to work with MetaMask, then Sequence will work too without any changes. If you're\nusing web3.js or ethers.js, Sequence will just work too. This is the beauty of interoperability on web3 :)\n","title":"Connect Wallet","titles":[]},"188":{"href":"/sdk/typescript/03-guides/01-connect-wallet#connecting-your-dapp-with-0xsequence","html":"\n
:::info A delightful wallet without requiring your users to install anything
\nBy integrating 0xsequence, users may access your dapp without having to install any special extensions,\nand the wallet also works on mobile browsers!\n:::\n
Your dapp can connect to your user's wallet by first instantiating the Wallet provider:
\n
import { sequence } from "0xsequence";\n\nconst projectAccessKey = '<access_key>'\n\n// This assumes your dapp runs on Ethereum mainnet\nconst wallet = sequence.initWallet(projectAccessKey);\n\n// If your dapp runs on a different EVM-compatible blockchain, you can specify its name\n// const wallet = sequence.initWallet(projectAccessKey, { defaultNetwork: 'polygon' });
\n
Note that is possible to retrieve the above instance by using the getWallet() method:
\n
import { sequence } from "0xsequence";\nconst wallet = sequence.getWallet();
\n
Once you have the instance, you can connect to the wallet:
\n
const connectDetails = await wallet.connect({\n app: "Your Dapp name",\n authorize: true,\n // And pass settings if you would like to customize further\n settings: {\n theme: "light",\n bannerUrl: "https://yoursite.com/banner-image.png", // 3:1 aspect ratio, 1200x400 works best\n includedPaymentProviders: ["moonpay", "ramp"],\n defaultFundingCurrency: "matic",\n lockFundingCurrencyToDefault: false,\n },\n});\n\nconsole.log("user accepted connect?", connectDetails.connected);\nconsole.log(\n "users signed connect proof to valid their account address:",\n connectDetails.proof\n);
\n
You can pick/limit the available sign in options with signInOptions. Will be ignored if user is already signed in.
:::tip Check out some example Dapp source code\nFor a complete examples, see Demo-Dapp and Demo-Dapp-Web3Modal.\n:::
\n
:::caution Avoid Browsers Blocking Sequence Popup\nMost browsers will block popups if they are called outside of user-triggered event handlers like onclick, or when it takes too long to process between the user action and the actual window
\n","isPage":false,"text":"\n:::info A delightful wallet without requiring your users to install anything \nBy integrating 0xsequence, users may access your dapp without having to install any special extensions,\nand the wallet also works on mobile browsers!\n:::\nYour dapp can connect to your user's wallet by first instantiating the Wallet provider:\nimport { sequence } from "0xsequence";\n \nconst projectAccessKey = '<access_key>'\n \n// This assumes your dapp runs on Ethereum mainnet\nconst wallet = sequence.initWallet(projectAccessKey);\n \n// If your dapp runs on a different EVM-compatible blockchain, you can specify its name\n// const wallet = sequence.initWallet(projectAccessKey, { defaultNetwork: 'polygon' });\nNote that is possible to retrieve the above instance by using the getWallet() method:\nimport { sequence } from "0xsequence";\nconst wallet = sequence.getWallet();\nOnce you have the instance, you can connect to the wallet:\nconst connectDetails = await wallet.connect({\n app: "Your Dapp name",\n authorize: true,\n // And pass settings if you would like to customize further\n settings: {\n theme: "light",\n bannerUrl: "https://yoursite.com/banner-image.png", // 3:1 aspect ratio, 1200x400 works best\n includedPaymentProviders: ["moonpay", "ramp"],\n defaultFundingCurrency: "matic",\n lockFundingCurrencyToDefault: false,\n },\n});\n \nconsole.log("user accepted connect?", connectDetails.connected);\nconsole.log(\n "users signed connect proof to valid their account address:",\n connectDetails.proof\n);\nYou can pick/limit the available sign in options with signInOptions. Will be ignored if user is already signed in.\nconst wallet = sequence.getWallet();\n \nawait wallet.connect({\n app: "Your Dapp name",\n settings: { signInOptions: ["google"] },\n});\nAfter you connect, you can use wallet.openWallet() to open the wallet:\nconst wallet = sequence.getWallet();\nwallet.openWallet();\nYou can also optionally pass a path, and use openWithOptions intent to pass settings when you open the wallet:\nconst settings: Settings = {\n theme: "dark",\n bannerUrl: "https://yoursite.com/banner-image.png", // 3:1 aspect ratio, 1200x400 works best\n includedPaymentProviders: ["moonpay", "ramp"],\n defaultFundingCurrency: "eth",\n lockFundingCurrencyToDefault: false,\n};\n \nconst intent: OpenWalletIntent = {\n type: "openWithOptions",\n options: {\n settings: settings,\n },\n};\n \nconst wallet = sequence.getWallet();\n \nconst path = "wallet/add-funds";\nwallet.openWallet(path, intent);\n:::tip Check out some example Dapp source code\nFor a complete examples, see Demo-Dapp and Demo-Dapp-Web3Modal.\n:::\n:::caution Avoid Browsers Blocking Sequence Popup\nMost browsers will block popups if they are called outside of user-triggered event handlers like onclick, or when it takes too long to process between the user action and the actual window\nRead more about browser popup-blocking here.\n:::\n\n\n","title":"Connecting your dapp with 0xsequence","titles":["Connect Wallet"]},"189":{"href":"/sdk/typescript/03-guides/01-connect-wallet#wallet-login-and-connect-options","html":"\n
Dapps with direct sequence integration can specify a ConnectOptions object when running wallet.connect().
\n","isPage":false,"text":"\nDapps with direct sequence integration can specify a ConnectOptions object when running wallet.connect().\nconst connectDetails = await wallet.connect(connectOptions)\nThe option parameters are described below.\n","title":"Wallet Login and Connect Options","titles":["Connect Wallet"]},"190":{"href":"/sdk/typescript/03-guides/01-connect-wallet#app","html":"\n
App name of the dapp which will be announced to user on connect screen.
\n","isPage":false,"text":"\nApp name of the dapp which will be announced to user on connect screen.\nExample: await wallet.connect({ app: 'My defi app' })\n","title":"app","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"191":{"href":"/sdk/typescript/03-guides/01-connect-wallet#appprotocol","html":"\n
Custom protocol for auth redirect (unity/unreal).
\n","isPage":false,"text":"\nCustom protocol for auth redirect (unity/unreal).\n","title":"appProtocol","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"192":{"href":"/sdk/typescript/03-guides/01-connect-wallet#origin","html":"\n
Origin hint of the dapp's host opening the wallet. This value will automatically be determined and verified for integrity, and can be omitted.
\n","isPage":false,"text":"\nOrigin hint of the dapp's host opening the wallet. This value will automatically be determined and verified for integrity, and can be omitted.\n","title":"origin","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"193":{"href":"/sdk/typescript/03-guides/01-connect-wallet#expiry","html":"\n
Expiry number (in seconds) that is used for ETHAuth proof. Default is 1 week in seconds.
\n
Example: await wallet.connect({ expiry: 36000 })
\n","isPage":false,"text":"\nExpiry number (in seconds) that is used for ETHAuth proof. Default is 1 week in seconds.\nExample: await wallet.connect({ expiry: 36000 })\n","title":"expiry","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"194":{"href":"/sdk/typescript/03-guides/01-connect-wallet#authorize","html":"\n
authorize will perform an ETHAuth eip712 signing and return the proof to the dapp.
\n","isPage":false,"text":"\nauthorize will perform an ETHAuth eip712 signing and return the proof to the dapp.\nExample: await wallet.connect({ authorize: true })\n","title":"authorize","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"195":{"href":"/sdk/typescript/03-guides/01-connect-wallet#authorizenonce","html":"\n
authorizeNonce is an optional number to be passed as ETHAuth's nonce claim for replay protection.
\n","isPage":false,"text":"\nauthorizeNonce is an optional number to be passed as ETHAuth's nonce claim for replay protection.\nExample: await wallet.connect({ authorizeNonce: 123 })\n","title":"authorizeNonce","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"196":{"href":"/sdk/typescript/03-guides/01-connect-wallet#refresh","html":"\n
refresh flag will force a full re-connect (ie. disconnect then connect again).
\n
Example: await wallet.connect({ refresh: true })
\n","isPage":false,"text":"\nrefresh flag will force a full re-connect (ie. disconnect then connect again).\nExample: await wallet.connect({ refresh: true })\n","title":"refresh","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"197":{"href":"/sdk/typescript/03-guides/01-connect-wallet#keepwalletopened","html":"\n
keepWalletOpened will keep the wallet window open after connecting. The default is to automatically close the wallet after connecting.
\n","isPage":false,"text":"\nkeepWalletOpened will keep the wallet window open after connecting. The default is to automatically close the wallet after connecting.\nExample: await wallet.connect({ keepWalletOpened: true })\n","title":"keepWalletOpened","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"198":{"href":"/sdk/typescript/03-guides/01-connect-wallet#askforemail","html":"\n
askForEmail will ask user whether they want to share the email they use to sign in to wallet while connecting, and will be returned in connectDetails.
\n","isPage":false,"text":"\naskForEmail will ask user whether they want to share the email they use to sign in to wallet while connecting, and will be returned in connectDetails.\nExample: await wallet.connect({ askForEmail: true })\n","title":"askForEmail","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"199":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingstheme","html":"\n
Name of one of the available theme provided by sequence the sequence wallet will be rendered with.
\n","isPage":false,"text":"\nName of one of the available theme provided by sequence the sequence wallet will be rendered with.\nExample: await wallet.connect({ settings: {theme: "light"}}\n","title":"settings.theme","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"200":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingsbannerurl","html":"\n
URL of a banner image users will see when connecting or logging into your dapp. The banner image should follow a 3:1 aspect ration where 1200x400 works best.
\n","isPage":false,"text":"\nURL of a banner image users will see when connecting or logging into your dapp. The banner image should follow a 3:1 aspect ration where 1200x400 works best.\nExample: await wallet.connect({ settings: {bannerUrl: "https://yoursite.com/banner-image.png"}}\n","title":"settings.bannerUrl","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"201":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingssigninwith","html":"\n
Specify signInWith with a supported auth provider to automatically sign in the user with that provider only. Will be ignored if user is already signed in.
\n","isPage":false,"text":"\nSpecify signInWith with a supported auth provider to automatically sign in the user with that provider only. Will be ignored if user is already signed in.\nExample: await wallet.connect({ settings: {signInWith: "google"}}\nSupported Providers: "google", "discord", "twitch", "apple", "facebook"\n","title":"settings.signInWith","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"202":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingssigninwithemail","html":"\n
Specify signInWithEmail with an email address to allow user automatically sign in with the email option. Will be ignored if user is already signed in.
\n","isPage":false,"text":"\nSpecify signInWithEmail with an email address to allow user automatically sign in with the email option. Will be ignored if user is already signed in.\nExample: await wallet.connect({ settings: {signInWithEmail: "user@email.com"}}\n","title":"settings.signInWithEmail","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"203":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingssigninoptions","html":"\n
Specify signInOptions to pick/limit the available sign in options. Will be ignored if user is already signed in.
\n","isPage":false,"text":"\nSpecify signInOptions to pick/limit the available sign in options. Will be ignored if user is already signed in.\nExample: await wallet.connect({ settings: {signInOptions: ["email", "google", "apple"]}}\n","title":"settings.signInOptions","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"204":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingsincludedpaymentproviders","html":"\n
List of payment providers users will be able to access. By default, users can access all payment providers integrated in Sequence.
\n","isPage":false,"text":"\nList of payment providers users will be able to access. By default, users can access all payment providers integrated in Sequence.\nExample: await wallet.connect({ settings: {includedPaymentProviders: ["moonpay", "ramp"]}}\n","title":"settings.includedPaymentProviders","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"205":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingsdefaultfundingcurrency","html":"\n
The tag of the default currency to show when users open the payment provider page. The currency has to be supported by the payment providers integrated in sequence.
\n","isPage":false,"text":"\nThe tag of the default currency to show when users open the payment provider page. The currency has to be supported by the payment providers integrated in sequence.\nExample: await wallet.connect({ settings: {defaultFundingCurrency: "usdc"}}\n","title":"settings.defaultFundingCurrency","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"206":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingsdefaultpurchaseamount","html":"\n
Use to specify a default purchase amount, as an integer, for prefilling the funding amount. If not specified, the default is 100.
\n","isPage":false,"text":"\nUse to specify a default purchase amount, as an integer, for prefilling the funding amount. If not specified, the default is 100.\nExample: await wallet.connect({ settings: {defaultPurchaseAmount: 200}}\n","title":"settings.defaultPurchaseAmount","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"207":{"href":"/sdk/typescript/03-guides/01-connect-wallet#settingslockfundingcurrencytodefault","html":"\n
Whether to only allow users to purchase the default currency specified by the defaultFundingCurrency option. If set to false, users will also be able to purchase other tokens. locking the default funding currency can be useful to prevent users from purchasing the wrong currency or the currency on the wrong chain.
\n","isPage":false,"text":"\nWhether to only allow users to purchase the default currency specified by the defaultFundingCurrency option. If set to false, users will also be able to purchase other tokens. locking the default funding currency can be useful to prevent users from purchasing the wrong currency or the currency on the wrong chain.\nExample: await wallet.connect({ settings: {defaultFundingCurrency: true}}\n","title":"settings.lockFundingCurrencyToDefault","titles":["Connect Wallet","Wallet Login and Connect Options",null]},"208":{"href":"/sdk/typescript/03-guides/01-connect-wallet#connecting-your-dapp-with-web3js-or-ethersjs","html":"\n
For a full example of a dapp which supports Sequence (on-demand + chrome extension), Metamask, and WalletConnect\nplease see the Demo-Dapp-Web3Modal repo.
\n
\n","isPage":false,"text":"\nFor a full example of a dapp which supports Sequence (on-demand + chrome extension), Metamask, and WalletConnect\nplease see the Demo-Dapp-Web3Modal repo.\n\n","title":"Connecting your dapp with web3.js or ethers.js","titles":["Connect Wallet"]},"209":{"href":"/sdk/typescript/03-guides/01-connect-wallet#connecting-to-any-ethereum-dapp-with-the-sequence-wallet-chrome-extension","html":"\n
\n","isPage":false,"text":"\nSequence Chrome Extension: Install\n\n","title":"Connecting to any Ethereum dapp with the Sequence Wallet Chrome Extension","titles":["Connect Wallet"]},"210":{"href":"/sdk/typescript/03-guides/01-connect-wallet#connecting-via-walletconnect","html":"\n
Sequence already supports connecting to dapps via WalletConnect.\nIf your dapp already supports WalletConnect, and you don't need Sequence-specific functionality, nothing more needs to be done.\nFrom the user's perspective, the WalletConnect flow behaves as follows.
\n
Taking Uniswap as an example, the user is prompted to connect their wallet using one of multiple possible protocols.
\n\n
The user selects the WalletConnect option.
\n\n
A QR code is displayed, which can be scanned by Sequence.\nAlternatively, the user can also choose to copy the connection details via their OS clipboard.
\n\n
Back in the Sequence interface, the user chooses "Scan".
\n\n
The QR code from the dapp is scanned.\nAlternatively, the code is pasted from the OS clipboard if the user chose that previously.
\n\n
The user confirms the connection request.
\n\n
The connection succeeded, and the dapp is updated to reflect that.
\n\n
While connected, the dapp is able to make signing requests to Sequence.\nSequence will always prompt for confirmation from the user for any activity initiated by the dapp.
\n\n
Once the user has finished using the dapp, they can disconnect the wallet via the session menu.
\n","isPage":false,"text":"\nSequence already supports connecting to dapps via WalletConnect.\nIf your dapp already supports WalletConnect, and you don't need Sequence-specific functionality, nothing more needs to be done.\nFrom the user's perspective, the WalletConnect flow behaves as follows.\nTaking Uniswap as an example, the user is prompted to connect their wallet using one of multiple possible protocols.\n\nThe user selects the WalletConnect option.\n\nA QR code is displayed, which can be scanned by Sequence.\nAlternatively, the user can also choose to copy the connection details via their OS clipboard.\n\nBack in the Sequence interface, the user chooses "Scan".\n\nThe QR code from the dapp is scanned.\nAlternatively, the code is pasted from the OS clipboard if the user chose that previously.\n\nThe user confirms the connection request.\n\nThe connection succeeded, and the dapp is updated to reflect that.\n\nWhile connected, the dapp is able to make signing requests to Sequence.\nSequence will always prompt for confirmation from the user for any activity initiated by the dapp.\n\nOnce the user has finished using the dapp, they can disconnect the wallet via the session menu.\n","title":"Connecting via WalletConnect","titles":["Connect Wallet"]},"211":{"href":"/sdk/typescript/03-guides/02-auth-address#authenticate-users-with-message-signature","html":"\n","isPage":true,"text":"\n","title":"Authenticate Users with Message Signature","titles":[]},"212":{"href":"/sdk/typescript/03-guides/02-auth-address#ask-for-the-wallet-address","html":"\n
\n","isPage":false,"text":"\nTo get the user's Sequence wallet address:\nconst wallet = sequence.getWallet()\nconst address = wallet.getAddress()\nconsole.log(address)\n","title":"Ask for the wallet address","titles":["Authenticate Users with Message Signature"]},"213":{"href":"/sdk/typescript/03-guides/02-auth-address#authenticate-wallet","html":"\n
In many cases, you'll want your users to connect and then verify they do control this wallet address. Applications typically do this by asking the user\nto sign a message with their wallet, and then verify the signature from the user to ensure its integrity.
\n
As this is such a common workflow, Sequence can automatically authenticate the account address at the same time\nwhile the user is prompt to connect their wallet to your dapp. This allows the user experience to be simpler and\nmore seamless.
\n
import { sequence } from '0xsequence'\n\nconst wallet = sequence.getWallet()\n\nconst connectDetails = await wallet.connect({\n app: 'Your Dapp name',\n authorize: true // <---<<< this will automatically sign+verify a EIP712 message when user clicks "Connect"\n})
\n
It will look like this to your users:
\n\n
In the above example, we pass authorize: true to the connect() function, which will automatically have the user\nsign a EIP712 signed message to prove their identity. This allows you to then easily authenticate the connected\nwallet address with absolute certainty.
\n
You can find the signed message proof returned in connectDetails.proof, which is an EIP712 signed object using\na simple convention from ethauth. NOTE: EIP712 allows you to use an actual object for\nsigning instead of just a plain-text string.
\n","isPage":false,"text":"\nIn many cases, you'll want your users to connect and then verify they do control this wallet address. Applications typically do this by asking the user\nto sign a message with their wallet, and then verify the signature from the user to ensure its integrity.\nAs this is such a common workflow, Sequence can automatically authenticate the account address at the same time\nwhile the user is prompt to connect their wallet to your dapp. This allows the user experience to be simpler and\nmore seamless.\nimport { sequence } from '0xsequence'\n \nconst wallet = sequence.getWallet()\n \nconst connectDetails = await wallet.connect({\n app: 'Your Dapp name',\n authorize: true // <---<<< this will automatically sign+verify a EIP712 message when user clicks "Connect"\n})\nIt will look like this to your users:\n\nIn the above example, we pass authorize: true to the connect() function, which will automatically have the user\nsign a EIP712 signed message to prove their identity. This allows you to then easily authenticate the connected\nwallet address with absolute certainty.\nYou can find the signed message proof returned in connectDetails.proof, which is an EIP712 signed object using\na simple convention from ethauth. NOTE: EIP712 allows you to use an actual object for\nsigning instead of just a plain-text string.\n","title":"Authenticate wallet","titles":["Authenticate Users with Message Signature"]},"214":{"href":"/sdk/typescript/03-guides/02-auth-address#authenticate-wallet-server-side","html":"\n
The above example demonstrates how to connect and verify the user's identity in your dapp on the client-side,\nbut if you'd like to authenticate the Sequence authorization proof on your server, then you can do so with the following snippet:
\n
import { ValidateSequenceWalletProof } from '@0xsequence/auth'\nimport { commons, v2 } from '@0xsequence/core'\nimport { ETHAuth } from '@0xsequence/ethauth'\nimport { trackers } from '@0xsequence/sessions'\nimport * as ethers from 'ethers'\n\n// ...\n\nconst rpcUrl = 'https://polygon-mainnet.infura.io/v3/<your infura key here>'\nconst provider = new ethers.providers.JsonRpcProvider(rpcUrl)\n\n// create an EIP-6492-aware ETHAuth proof validator\nconst validator = ValidateSequenceWalletProof(\n () => new commons.reader.OnChainReader(provider),\n new trackers.remote.RemoteConfigTracker('https://sessions.sequence.app'),\n v2.DeployedWalletContext\n)\nconst ethauth = new ETHAuth(validator)\nawait ethauth.configJsonRpcProvider(rpcUrl)\n\ntry {\n const proof = await ethAuth.decodeProof(connectDetails.proof.proofString)\n console.log(`proof for address ${proof.address} is valid`)\n} catch (err) {\n console.log(`invalid proof -- do not trust address: ${err}`)\n}
\n
See the Go Sequence SDK on using Sequence in your Go applications.
As always, if you have any questions or require help, reach out to us on Discord.
","isPage":false,"text":"\nThe above example demonstrates how to connect and verify the user's identity in your dapp on the client-side,\nbut if you'd like to authenticate the Sequence authorization proof on your server, then you can do so with the following snippet:\nimport { ValidateSequenceWalletProof } from '@0xsequence/auth'\nimport { commons, v2 } from '@0xsequence/core'\nimport { ETHAuth } from '@0xsequence/ethauth'\nimport { trackers } from '@0xsequence/sessions'\nimport * as ethers from 'ethers'\n \n// ...\n \nconst rpcUrl = 'https://polygon-mainnet.infura.io/v3/<your infura key here>'\nconst provider = new ethers.providers.JsonRpcProvider(rpcUrl)\n \n// create an EIP-6492-aware ETHAuth proof validator\nconst validator = ValidateSequenceWalletProof(\n () => new commons.reader.OnChainReader(provider),\n new trackers.remote.RemoteConfigTracker('https://sessions.sequence.app'),\n v2.DeployedWalletContext\n)\nconst ethauth = new ETHAuth(validator)\nawait ethauth.configJsonRpcProvider(rpcUrl)\n \ntry {\n const proof = await ethAuth.decodeProof(connectDetails.proof.proofString)\n console.log(`proof for address ${proof.address} is valid`)\n} catch (err) {\n console.log(`invalid proof -- do not trust address: ${err}`)\n}\nSee the Go Sequence SDK on using Sequence in your Go applications.\nIf your server is written in a language other than Javascript/Typescript or Go, all you have to do is validate\nthe signature with EIP1271, the standard method for validating signed messages for a smart wallet.\nAs always, if you have any questions or require help, reach out to us on Discord.","title":"Authenticate wallet server-side","titles":["Authenticate Users with Message Signature"]},"215":{"href":"/sdk/typescript/03-guides/03-sign-message#todo---replace-with-code-groups-from-vocs","html":"","isPage":true,"text":"","title":"TODO - Replace with Code Groups from Vocs","titles":[]},"216":{"href":"/sdk/typescript/03-guides/04-session-keys#no-wallet-confirmation-signatures","html":"\n
It is possible to build an application where users sign messages without requiring a confirmation in their Sequence wallet every time. This is possible using session keys, or ephemeral keys.
\n","isPage":true,"text":"\nIt is possible to build an application where users sign messages without requiring a confirmation in their Sequence wallet every time. This is possible using session keys, or ephemeral keys.\n","title":"No-Wallet-Confirmation Signatures","titles":[]},"217":{"href":"/sdk/typescript/03-guides/04-session-keys#session-keys","html":"\n
Session keys are ephemeral private keys that can be generated and stored client-side, typically in a user's local storage. They provide a convenient and secure way for users to authorize specific actions in a decentralized application without requiring them to confirm each action through their primary wallet.
\n
By signing a message with their primary wallet (e.g., Sequence Wallet), users can authorize a session key to act on their behalf for a limited time or scope. Applications can then interpret signed messages from the session key as if they were coming directly from the user's wallet, streamlining the user experience.
\n
Session keys are particularly useful for applications that require frequent user interactions, as they help reduce the number of wallet confirmations needed, while still maintaining a secure and verifiable authentication process.
\n","isPage":false,"text":"\nSession keys are ephemeral private keys that can be generated and stored client-side, typically in a user's local storage. They provide a convenient and secure way for users to authorize specific actions in a decentralized application without requiring them to confirm each action through their primary wallet.\nBy signing a message with their primary wallet (e.g., Sequence Wallet), users can authorize a session key to act on their behalf for a limited time or scope. Applications can then interpret signed messages from the session key as if they were coming directly from the user's wallet, streamlining the user experience.\nSession keys are particularly useful for applications that require frequent user interactions, as they help reduce the number of wallet confirmations needed, while still maintaining a secure and verifiable authentication process.\n","title":"Session Keys","titles":[]},"218":{"href":"/sdk/typescript/03-guides/04-session-keys#using-session-keys-with-sequence","html":"\n","isPage":false,"text":"\n","title":"Using Session keys with Sequence","titles":[]},"219":{"href":"/sdk/typescript/03-guides/04-session-keys#1-initialize-sequence-wallet-and-connect","html":"\n
import { Wallet } from '@0xsequence/wallet'\nimport { ethers } from 'ethers'\n\nconst wallet = new Wallet()\nawait wallet.connect()\n\nconst signer = wallet.getSigner()\nconst userAddress = signer.getAddress()
\n","isPage":false,"text":"\nimport { Wallet } from '@0xsequence/wallet'\nimport { ethers } from 'ethers'\n \nconst wallet = new Wallet()\nawait wallet.connect()\n \nconst signer = wallet.getSigner()\nconst userAddress = signer.getAddress()\n","title":"1. Initialize Sequence Wallet and Connect","titles":["Using Session keys with Sequence",null]},"220":{"href":"/sdk/typescript/03-guides/04-session-keys#2-generate-a-session-key","html":"\n
Create a new ephemeral private key, store it in local storage, and derive the associated address:
\n","isPage":false,"text":"\nCreate a new ephemeral private key, store it in local storage, and derive the associated address:\nconst sessionPrivateKey = ethers.utils.randomBytes(32)\nlocalStorage.setItem('sessionPrivateKey', ethers.utils.hexlify(sessionPrivateKey))\nconst sessionWallet = new ethers.Wallet(sessionPrivateKey)\nconst sessionAddress = await sessionWallet.getAddress()\n","title":"2. Generate a Session Key","titles":["Using Session keys with Sequence",null]},"221":{"href":"/sdk/typescript/03-guides/04-session-keys#3-sign-authorization-message","html":"\n
Sign a message with the user's Sequence Wallet to authorize the session key:
\n
const authorizationMessage = `Authorize this device to play this game.`\nconst signature = await signer.signMessage(authorizationMessage)
\n","isPage":false,"text":"\nSign a message with the user's Sequence Wallet to authorize the session key:\nconst authorizationMessage = `Authorize this device to play this game.`\nconst signature = await signer.signMessage(authorizationMessage)\n","title":"3. Sign Authorization Message","titles":["Using Session keys with Sequence",null]},"222":{"href":"/sdk/typescript/03-guides/04-session-keys#4-verify-authorization-signature","html":"\n
Verify the signature on the server or client side using Sequence utility functions:
\n","isPage":false,"text":"\nUse the session key to sign a message client-side without user interaction:\nconst message = 'Perform action without wallet confirmation'\nconst sessionSignature = await sessionWallet.signMessage(message)\n","title":"5. Sign Message with Session Key","titles":["Using Session keys with Sequence",null]},"224":{"href":"/sdk/typescript/03-guides/04-session-keys#6-verify-session-signature","html":"\n
Verify the session signature on the server or client side:
Note: You should retrieve the session key stored in local storage upon loading the application and only create a new session key if none can be found.
","isPage":false,"text":"\nVerify the session signature on the server or client side:\nconst recoveredSessionAddress = ethers.utils.verifyMessage(message, sessionSignature)\nif (recoveredSessionAddress === sessionAddress) {\n console.log('Session signature valid')\n} else {\n console.log('Session signature invalid')\n}\nNote: You should retrieve the session key stored in local storage upon loading the application and only create a new session key if none can be found.","title":"6. Verify Session Signature","titles":["Using Session keys with Sequence",null]},"225":{"href":"/sdk/typescript/03-guides/05-send-transaction#sending-transactions","html":"\n
Signing a transaction will only retrieve the signed payload.\nIf you want the wallet to actually dispatch the transaction to the network as well, that requires only a small modification to the previous example (note the change from signTransactions to sendTransaction):
","isPage":true,"text":"\nSigning a transaction will only retrieve the signed payload.\nIf you want the wallet to actually dispatch the transaction to the network as well, that requires only a small modification to the previous example (note the change from signTransactions to sendTransaction):\nconst transaction = {\n to: recipientAddress,\n value: 1000000000000000000\n}\n \nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n ","title":"Sending Transactions","titles":[]},"226":{"href":"/sdk/typescript/03-guides/06-send-erc20#sending-erc-20-tokens","html":"\n
You can ask the wallet to send a single ERC-20 token transfer:
\n
const erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\n\n// Encode an ERC-20 token transfer to recipient of the specified amount\nconst data = erc20Interface.encodeFunctionData(\n 'transfer', [recipientAddress, amount]\n)\n\nconst transaction = {\n to: daiContractAddress,\n data\n}\n\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n
\n
With batching functionality, you can send multiple token transfers in a single native transaction:
\n
const erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\n\n// Encode two different ERC-20 token transfers\nconst data1 = erc20Interface.encodeFunctionData(\n 'transfer', [recipient1Address, amount1]\n)\nconst data2 = erc20Interface.encodeFunctionData(\n 'transfer', [recipient2Address, amount2]\n)\n\nconst transaction1 = {\n to: daiContractAddress,\n data: data1\n}\n\nconst transaction2 = {\n to: daiContractAddress,\n data: data2\n}\n\n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction([transaction1, transaction2])\nconsole.log(txnResponse)\n
","isPage":true,"text":"\nYou can ask the wallet to send a single ERC-20 token transfer:\nconst erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\n \n// Encode an ERC-20 token transfer to recipient of the specified amount\nconst data = erc20Interface.encodeFunctionData(\n 'transfer', [recipientAddress, amount]\n)\n \nconst transaction = {\n to: daiContractAddress,\n data\n}\n \nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n \nWith batching functionality, you can send multiple token transfers in a single native transaction:\nconst erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\n \n// Encode two different ERC-20 token transfers\nconst data1 = erc20Interface.encodeFunctionData(\n 'transfer', [recipient1Address, amount1]\n)\nconst data2 = erc20Interface.encodeFunctionData(\n 'transfer', [recipient2Address, amount2]\n)\n \nconst transaction1 = {\n to: daiContractAddress,\n data: data1\n}\n \nconst transaction2 = {\n to: daiContractAddress,\n data: data2\n}\n \n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction([transaction1, transaction2])\nconsole.log(txnResponse)\n ","title":"Sending ERC-20 Tokens","titles":[]},"227":{"href":"/sdk/typescript/03-guides/07-send-erc721#sending-erc-721-nft-tokens","html":"\n
Sending an ERC-721 NFT is similar to sending an ERC-20 token.\nThe only notable difference is in the contract standard itself:
\n
const erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\n\n// Encode the transfer of the NFT tokenId to recipient\nconst address = await wallet.getAddress()\nconst data = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipientAddress, tokenId]\n)\n\nconst transaction = {\n to: erc721TokenAddress,\n data\n}\n\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n
\n
With batching functionality, you can send multiple token transfers in a single native transaction:
\n
const erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\n\n// Encode two different ERC-721 token transfers\nconst data1 = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient1Address, amount1]\n)\nconst data2 = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient2Address, amount2]\n)\n\nconst transaction1 = {\n to: erc721ContractAddress,\n data: data1\n}\n\nconst transaction2 = {\n to: erc721ContractAddress,\n data: data2\n}\n\n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransactionBatch([transaction1, transaction2])\nconsole.log(txnResponse)\n
","isPage":true,"text":"\nSending an ERC-721 NFT is similar to sending an ERC-20 token.\nThe only notable difference is in the contract standard itself:\nconst erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\n \n// Encode the transfer of the NFT tokenId to recipient\nconst address = await wallet.getAddress()\nconst data = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipientAddress, tokenId]\n)\n \nconst transaction = {\n to: erc721TokenAddress,\n data\n}\n \nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n \nWith batching functionality, you can send multiple token transfers in a single native transaction:\nconst erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\n \n// Encode two different ERC-721 token transfers\nconst data1 = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient1Address, amount1]\n)\nconst data2 = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient2Address, amount2]\n)\n \nconst transaction1 = {\n to: erc721ContractAddress,\n data: data1\n}\n \nconst transaction2 = {\n to: erc721ContractAddress,\n data: data2\n}\n \n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransactionBatch([transaction1, transaction2])\nconsole.log(txnResponse)\n ","title":"Sending ERC-721 (NFT) Tokens","titles":[]},"228":{"href":"/sdk/typescript/03-guides/08-send-erc1155#sending-erc-1155-collectible-tokens","html":"\n
Sending an ERC-1155 collectible is similar to sending an ERC-20 token.\nThe only notable difference is in the contract standard itself:
\n
const erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n\n// Encode the transfer of the collectible to recipient\nconst address = await wallet.getAddress()\nconst data = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipientAddress, tokenId, amount, '0x']\n)\n\nconst transaction = {\n to: erc1155TokenAddress,\n data\n}\n\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n
\n
With batching functionality, you can send multiple token transfers in a single native transaction:
\n
const erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n\n// Encode two different ERC-1155 token transfers\nconst data1 = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient1Address, token1Id, amount1, '0x']\n)\nconst data2 = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient2Address, token2Id, amount2, '0x']\n)\n\nconst transaction1 = {\n to: erc1155ContractAddress,\n data: data1\n}\nconst transaction2 = {\n to: erc1155ContractAddress,\n data: data2\n}\n\n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransactionBatch([transaction1, transaction2])\nconsole.log(txnResponse)\n
","isPage":true,"text":"\nSending an ERC-1155 collectible is similar to sending an ERC-20 token.\nThe only notable difference is in the contract standard itself:\nconst erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n \n// Encode the transfer of the collectible to recipient\nconst address = await wallet.getAddress()\nconst data = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipientAddress, tokenId, amount, '0x']\n)\n \nconst transaction = {\n to: erc1155TokenAddress,\n data\n}\n \nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n \nWith batching functionality, you can send multiple token transfers in a single native transaction:\nconst erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n \n// Encode two different ERC-1155 token transfers\nconst data1 = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient1Address, token1Id, amount1, '0x']\n)\nconst data2 = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient2Address, token2Id, amount2, '0x']\n)\n \nconst transaction1 = {\n to: erc1155ContractAddress,\n data: data1\n}\nconst transaction2 = {\n to: erc1155ContractAddress,\n data: data2\n}\n \n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransactionBatch([transaction1, transaction2])\nconsole.log(txnResponse)\n ","title":"Sending ERC-1155 (Collectible) Tokens","titles":[]},"229":{"href":"/sdk/typescript/03-guides/09-send-batch-transactions#sending-a-batch-of-transactions","html":"\n
Likewise, bundling multiple transactions to be sent in a single native transaction is equally as easy:
","isPage":true,"text":"\nLikewise, bundling multiple transactions to be sent in a single native transaction is equally as easy:\nconst transaction1 = {\n to: recipient1Address,\n value: 1000000000000000000\n}\n \nconst transaction2 = {\n to: recipient2Address,\n value: 1000000000000000000\n}\n \nconst signer = wallet.getSigner()\nconst response = await signer.sendTransaction([transaction1, transaction2])\nconsole.log(response)\nThe transactions don't have to be the same token or even token standard either.\nYou can mix and match:\nconst erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\nconst erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\nconst erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n \nconst erc20Data = erc20Interface.encodeFunctionData(\n 'transfer', [recipient2Address, amount2]\n)\nconst erc721Data = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient3Address, amount3]\n)\nconst erc1155Data = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient4Address, token4Id, amount4, '0x']\n)\n \nconst transactions = [\n { to: recipient1Address, value: '1000000000000000000' },\n { to: daiContractAddress, data: erc20Data },\n { to: erc721ContractAddress, data: erc721Data },\n { to: erc1155ContractAddress, data: erc1155Data }\n]\n \nconst signer = wallet.getSigner()\nconst response = await signer.sendTransaction(transactions)\nconsole.log(response)","title":"Sending a Batch of Transactions","titles":[]},"230":{"href":"/sdk/typescript/03-guides/10-building-backends#building-backends-with-sequence","html":"\n","isPage":true,"text":"\n","title":"Building Backends with Sequence","titles":[]},"231":{"href":"/sdk/typescript/03-guides/10-building-backends#nodejs","html":"\n
The 0xsequence package which is available for browser / client use, also works perfectly on nodejs backends\nwritten in Javascript or Typescript.
\n","isPage":false,"text":"\nThe 0xsequence package which is available for browser / client use, also works perfectly on nodejs backends\nwritten in Javascript or Typescript.\n","title":"nodejs","titles":["Building Backends with Sequence",null]},"232":{"href":"/sdk/typescript/03-guides/10-building-backends#go","html":"\n
go-sequence is the equivalent of 0xsequence\nbut for Go / Golang backends. In fact, all of Sequence's infrastructure is written in Go and is built with go-sequence.
\n","isPage":false,"text":"\nA complete Sequence SDK is also available in Go: https://github.com/0xsequence/go-sequence.\ngo-sequence is the equivalent of 0xsequence\nbut for Go / Golang backends. In fact, all of Sequence's infrastructure is written in Go and is built with go-sequence.\n","title":"Go","titles":["Building Backends with Sequence",null]},"233":{"href":"/sdk/typescript/03-guides/10-building-backends#ethkit","html":"\n
As part of the Sequence open source tools, our team has also built ethkit, which\nis an Ethereum dev toolkit for Go backends. ethkit supports EOA wallets,\nand you can think of it like ethers.js but for Go.
\n","isPage":false,"text":"\nAs part of the Sequence open source tools, our team has also built ethkit, which\nis an Ethereum dev toolkit for Go backends. ethkit supports EOA wallets,\nand you can think of it like ethers.js but for Go.\n","title":"ethkit","titles":["Building Backends with Sequence",null]},"234":{"href":"/sdk/typescript/03-guides/10-building-backends#support-for-other-backend-languages","html":"\n
If your backend services are written in a language other than JS or Go, you can still easily integrate Sequence,\nas Sequence is really just a standard Ethereum client library with some extra features. In many cases, the extra\nfeatures are best utilized on the client-side / dapp.
\n
If your situation for example is a Python or Java backend where you'd like to verify signatures from a Sequence Wallet,\nwell then, you can call the standard EIP1271 function for the account address\nfrom your backend.
","isPage":false,"text":"\nIf your backend services are written in a language other than JS or Go, you can still easily integrate Sequence,\nas Sequence is really just a standard Ethereum client library with some extra features. In many cases, the extra\nfeatures are best utilized on the client-side / dapp.\nIf your situation for example is a Python or Java backend where you'd like to verify signatures from a Sequence Wallet,\nwell then, you can call the standard EIP1271 function for the account address\nfrom your backend.\nIf you'd like to use the Sequence's Meta-Transaction capabilities, see Building Relaying Server with Sequence.","title":"Support for other backend languages","titles":["Building Backends with Sequence",null]},"235":{"href":"/sdk/typescript/03-guides/overview#install","html":"\n
Sequence.js is a modular web3 stack and smart wallet package for Ethereum chains. You can think of it similar to ethers.js, but tailored to the Sequence stack which streamlines common functions needed for blockchain-enabled game development. The sequence.js SDK is composed of several sub-packages combined into a single meta-package called 0xsequence.\nTo add the SDK to your project, add a dependency on 0xsequence to your package.json:
\n
npm install 0xsequence ethers
\n
or
\n
pnpm install 0xsequence ethers
\n
or
\n
yarn add 0xsequence ethers
\n
If you know that your project only requires specific sub-packages, you can also depend on those directly with\nnpm add @0xsequence/<sub-package name>.
\n
Your package.json should look something like this (actual version may vary):
\n","isPage":true,"text":"\nSequence.js is a modular web3 stack and smart wallet package for Ethereum chains. You can think of it similar to ethers.js, but tailored to the Sequence stack which streamlines common functions needed for blockchain-enabled game development. The sequence.js SDK is composed of several sub-packages combined into a single meta-package called 0xsequence.\nTo add the SDK to your project, add a dependency on 0xsequence to your package.json:\nnpm install 0xsequence ethers\nor\npnpm install 0xsequence ethers\nor\nyarn add 0xsequence ethers\nIf you know that your project only requires specific sub-packages, you can also depend on those directly with\nnpm add @0xsequence/<sub-package name>.\nYour package.json should look something like this (actual version may vary):\n{\n "name": "my-dapp",\n ...\n "dependencies": {\n "0xsequence": "^1.0.0",\n "ethers": ^5.7.0"\n ...\n }\n}\n","title":"Install","titles":[null]},"236":{"href":"/sdk/typescript/03-guides/overview#cdn-distribution-as-native-js","html":"\n
Optionally, 0xsequence can be installed as a JS script source (UMD distribution) via:
","isPage":false,"text":"\nOptionally, 0xsequence can be installed as a JS script source (UMD distribution) via:\n<script src="https://cdn.ethers.io/lib/ethers-5.7.umd.min.js"></script>\n<script src="https://unpkg.com/0xsequence@latest/dist/0xsequence.umd.min.js"></script>","title":"CDN distribution as native JS","titles":[null,"Install",null]},"237":{"href":"/sdk/typescript/connectors/01-overview#wallet-connectors","html":"\n
Sequence is compatible with all standard Ethereum libraries and connectors. If you've\ndeveloped your dapp to with work Metamask, it will also automatically work with Sequence.
\n
Our SDKs offer all the functionality you'd need to build a web3 dapp, but you can also\ncombine other libraries, tools, and wallet connectors :) Please see our open sourced Demo Dapp\nproject for an example use of Sequence, or see below on usage with additional connectors.
\n
For your dapps, you may also want to support many different kinds of wallets in addition\nto the Sequence Wallet. You may do this by using sequence.js or using one of the connectors below:
Additionally, if you are building a mobile app or video game, please see the docs for\nthe respective SDK. Feel free to reach out to our team for help/questions too.
","isPage":true,"text":"\nSequence is compatible with all standard Ethereum libraries and connectors. If you've\ndeveloped your dapp to with work Metamask, it will also automatically work with Sequence.\nOur SDKs offer all the functionality you'd need to build a web3 dapp, but you can also\ncombine other libraries, tools, and wallet connectors :) Please see our open sourced Demo Dapp\nproject for an example use of Sequence, or see below on usage with additional connectors.\nFor your dapps, you may also want to support many different kinds of wallets in addition\nto the Sequence Wallet. You may do this by using sequence.js or using one of the connectors below:\n\nSequence Kit\nWagmi\nWeb3Modal\nRainbowKit\nweb3-onboard\nweb3-react\n\nAdditionally, if you are building a mobile app or video game, please see the docs for\nthe respective SDK. Feel free to reach out to our team for help/questions too.","title":"Wallet Connectors","titles":[]},"238":{"href":"/sdk/typescript/connectors/02-sequence-kit#sequence-kit-seamlessly-integrate-web3-wallets-into-your-applications","html":"\n
Sequence Kit 🧰 is the ultimate toolkit for effortlessly integrating web3 wallets into your applications, providing your users with a smooth and secure onboarding experience. With our robust tools built on the popular wagmi library, unlock a realm of possibilities in the world of web3.
\n","isPage":true,"text":"\nSequence Kit 🧰 is the ultimate toolkit for effortlessly integrating web3 wallets into your applications, providing your users with a smooth and secure onboarding experience. With our robust tools built on the popular wagmi library, unlock a realm of possibilities in the world of web3.\n","title":"Sequence Kit: Seamlessly Integrate Web3 Wallets into Your Applications","titles":[]},"239":{"href":"/sdk/typescript/connectors/02-sequence-kit#key-features","html":"\n
\n
\n
Universal Connections: Seamlessly connect via popular social logins such as Facebook, Google, Discord, and more! Your users will enjoy a smooth, secure onboarding process. 🔐🪪
\n
\n
\n
Web3 Wallet Integration: Effortlessly integrate with leading web3 wallets like WalletConnect and MetaMask. Unleash the power of blockchain with just a few clicks! 🦊 ⛓️
\n
\n
\n
Embedded Wallet Experience: Provide your users with a comprehensive embedded wallet, enabling them to manage their coins and collectibles all within your own application. 👛 🖼️ 🪙
\n
\n
\n
Explore the potential of Sequence Kit by trying out our demo!
\n","isPage":false,"text":"\n\n\nUniversal Connections: Seamlessly connect via popular social logins such as Facebook, Google, Discord, and more! Your users will enjoy a smooth, secure onboarding process. 🔐🪪\n\n\nWeb3 Wallet Integration: Effortlessly integrate with leading web3 wallets like WalletConnect and MetaMask. Unleash the power of blockchain with just a few clicks! 🦊 ⛓️\n\n\nEmbedded Wallet Experience: Provide your users with a comprehensive embedded wallet, enabling them to manage their coins and collectibles all within your own application. 👛 🖼️ 🪙\n\n\nExplore the potential of Sequence Kit by trying out our demo!\n","title":"Key Features","titles":["Sequence Kit: Seamlessly Integrate Web3 Wallets into Your Applications"]},"240":{"href":"/sdk/typescript/connectors/02-sequence-kit#next-steps","html":"\n
Ready to integrate Sequence Kit into your application? Check out our Getting Started guide. If you're already familiar with Sequence Kit dive into the available configuration options or take a look at the checkout.
","isPage":false,"text":"\nReady to integrate Sequence Kit into your application? Check out our Getting Started guide. If you're already familiar with Sequence Kit dive into the available configuration options or take a look at the checkout.","title":"Next Steps","titles":[]},"241":{"href":"/sdk/typescript/connectors/03-wagmi#using-wagmi","html":"\n
The Sequence wallet used with Wagmi through the connector.
\n
:::tip Try it live :)\nTry a live Dapp example using Sequence + Metamask + Wallet Connect with wagmi.
\n","isPage":true,"text":"\nThe Sequence wallet used with Wagmi through the connector.\n:::tip Try it live :)\nTry a live Dapp example using Sequence + Metamask + Wallet Connect with wagmi.\nSource code is available too: https://github.com/0xsequence/demo-dapp-wagmi\n:::\n","title":"Using Wagmi","titles":[]},"242":{"href":"/sdk/typescript/connectors/03-wagmi#installation","html":"\n
The connector is installed via the npm package @0xsequence/wagmi-connector. If you are using the latest version of wagmi (>= 1.0.0) the latest version of the wagmi-connector package can be installed with the following command:
\n","isPage":false,"text":"\nThe connector is installed via the npm package @0xsequence/wagmi-connector. If you are using the latest version of wagmi (>= 1.0.0) the latest version of the wagmi-connector package can be installed with the following command:\nnpm install @0xsequence/wagmi-connector 0xsequence ethers\nor\nyarn add @0xsequence/wagmi-connector 0xsequence ethers\n","title":"Installation","titles":["Using Wagmi"]},"243":{"href":"/sdk/typescript/connectors/03-wagmi#usage","html":"\n
The connector is then imported and added to the list of connectors alongside the other wagmi connectors.
\n","isPage":false,"text":"\nThe connector is then imported and added to the list of connectors alongside the other wagmi connectors.\nimport { SequenceConnector } from "@0xsequence/wagmi-connector";\n \nconst connectors = [\n new SequenceConnector({\n chains,\n options: {\n defaultNetwork: "polygon",\n connect: {\n app: "Demo-app",\n },\n },\n }),\n ...otherConnectors,\n];\n \nconst wagmiConfig = createConfig({\n autoConnect: true,\n connectors,\n publicClient,\n webSocketPublicClient,\n});\n","title":"Usage","titles":["Using Wagmi"]},"244":{"href":"/sdk/typescript/connectors/03-wagmi#parameters","html":"\n","isPage":false,"text":"\n","title":"Parameters","titles":["Using Wagmi"]},"245":{"href":"/sdk/typescript/connectors/03-wagmi#chains","html":"\n
Chains supported by app. This is the same parameter as would be passed to other RainbowKit wallets.
\n","isPage":false,"text":"\nChains supported by app. This is the same parameter as would be passed to other RainbowKit wallets.\n","title":"chains","titles":["Using Wagmi","Parameters"]},"246":{"href":"/sdk/typescript/connectors/03-wagmi#optionsconnect-optional","html":"\n
Connection details that will be passed to Sequence upon connection, including app name, network id, etc...\nA more in depth description of the connect options is available here.
\n","isPage":false,"text":"\nConnection details that will be passed to Sequence upon connection, including app name, network id, etc...\nA more in depth description of the connect options is available here.\n","title":"options.connect (optional)","titles":["Using Wagmi","Parameters"]},"247":{"href":"/sdk/typescript/connectors/03-wagmi#optionsdefaultnetwork-optional","html":"\n
The default network to connect to. Sequence will default all operations to this network. It can also be defined using a number (e.g. 1 for Mainnet, 5 for Goerli, etc...).
\n","isPage":false,"text":"\nThe default network to connect to. Sequence will default all operations to this network. It can also be defined using a number (e.g. 1 for Mainnet, 5 for Goerli, etc...).\n","title":"options.defaultNetwork (optional)","titles":["Using Wagmi","Parameters"]},"248":{"href":"/sdk/typescript/connectors/03-wagmi#using-older-versions-of-wagmi--012x","html":"\n
If you are using an older version of Wagmi (<= 0.12.x), which is based on ethers instead of viem, use the following command to install the appropriate version of the wagmi connector:
\n","isPage":false,"text":"\nIf you are using an older version of Wagmi (<= 0.12.x), which is based on ethers instead of viem, use the following command to install the appropriate version of the wagmi connector:\nnpm install @0xsequence/wagmi-connector@1.0 0xsequence ethers\nor\nyarn add @0xsequence/wagmi-connector@1.0 0xsequence ethers\n","title":"Using older versions of Wagmi (<= 0.12.x)","titles":["Using Wagmi"]},"249":{"href":"/sdk/typescript/connectors/03-wagmi#using-nextjs","html":"\n
There are special considerations to take into account when using Wagmi with NextJs such that it functions harmoniously with the server-side rendering of NextJs.\nThe correct technique to use differs depending on whether the application uses the older pages router or the more recent app router.
\n
See this section for an explanation on using the Wagmi connector with app router. \nSee the example app which uses the app router structure.
\n
See this section for an explanation on using the Wagmi connector with pages router. \nSee the example app which uses the pages router structure.
\n","isPage":false,"text":"\nThere are special considerations to take into account when using Wagmi with NextJs such that it functions harmoniously with the server-side rendering of NextJs.\nThe correct technique to use differs depending on whether the application uses the older pages router or the more recent app router.\nSee this section for an explanation on using the Wagmi connector with app router.\nSee the example app which uses the app router structure.\nSee this section for an explanation on using the Wagmi connector with pages router.\nSee the example app which uses the pages router structure.\n","title":"Using NextJs","titles":["Using Wagmi"]},"250":{"href":"/sdk/typescript/connectors/03-wagmi#examples","html":"\n
Below are example dapps using various versions of wagmi and libraries.
\n
A demo app for the lastest version of Wagmi is available here. \nA demo app is available for older version of Wagmi(<=0.12.x) is available here.
\n
A demo app for Wagmi + NextJs with the app router structure here. \nA demo app for Wagmi + NextJs with the older pages router structure here.
","isPage":false,"text":"\nBelow are example dapps using various versions of wagmi and libraries.\nA demo app for the lastest version of Wagmi is available here.\nA demo app is available for older version of Wagmi(<=0.12.x) is available here.\nA demo app for Wagmi + NextJs with the app router structure here.\nA demo app for Wagmi + NextJs with the older pages router structure here.","title":"Examples","titles":["Using Wagmi"]},"251":{"href":"/sdk/typescript/connectors/04-rainbow-kit#using-rainbowkit","html":"\n
The Sequence wallet can be added to RainbowKit through the connector.
\n
:::tip Try it live :)\nTry a live Dapp example using Sequence + Metamask + Rainbow + Wallet Connect with RainbowKit.
\n","isPage":true,"text":"\nThe Sequence wallet can be added to RainbowKit through the connector.\n:::tip Try it live :)\nTry a live Dapp example using Sequence + Metamask + Rainbow + Wallet Connect with RainbowKit.\nSource code is available too: https://github.com/0xsequence/demo-dapp-rainbowkit\n:::\n","title":"Using RainbowKit","titles":[]},"252":{"href":"/sdk/typescript/connectors/04-rainbow-kit#installation","html":"\n
The connector is installed via the npm package @0xsequence/rainbowkit-plugin.
\n","isPage":false,"text":"\nThe connector is then imported and added to the list of connectors alongside the other RainbowKit wallets.\nimport { sequenceWallet } from '@0xsequence/rainbowkit-plugin'\nimport { connectorsForWallets } from '@rainbow-me/rainbowkit';\n \nconst connectors = connectorsForWallets([\n {\n groupName: 'Recommended',\n wallets: [\n sequenceWallet({\n chains,\n defaultNetwork: 'polygon',\n connect: {\n app: 'Demo-app'\n }\n }),\n ...otherRainbowKitWallets\n ]\n }\n \n","title":"Usage","titles":["Using RainbowKit"]},"254":{"href":"/sdk/typescript/connectors/04-rainbow-kit#parameters","html":"\n","isPage":false,"text":"\n","title":"Parameters","titles":["Using RainbowKit"]},"255":{"href":"/sdk/typescript/connectors/04-rainbow-kit#chains","html":"\n
Chains supported by app. This is the same parameter as would be passed to other RainbowKit wallets.
\n","isPage":false,"text":"\nChains supported by app. This is the same parameter as would be passed to other RainbowKit wallets.\n","title":"chains","titles":["Using RainbowKit","Parameters"]},"256":{"href":"/sdk/typescript/connectors/04-rainbow-kit#connect-optional","html":"\n
Connect options for Sequence, including the name of the app and the default network id the wallet will attempt connection to.\nA more in depth description of the connect options is available here.
\n","isPage":false,"text":"\nConnect options for Sequence, including the name of the app and the default network id the wallet will attempt connection to.\nA more in depth description of the connect options is available here.\n","title":"connect (optional)","titles":["Using RainbowKit","Parameters"]},"257":{"href":"/sdk/typescript/connectors/04-rainbow-kit#defaultnetwork-optional","html":"\n
The default network to connect to. Sequence will default all operations to this network. It can also be defined using a number (e.g. 1 for Mainnet, 5 for Goerli, etc...).
\n","isPage":false,"text":"\nThe default network to connect to. Sequence will default all operations to this network. It can also be defined using a number (e.g. 1 for Mainnet, 5 for Goerli, etc...).\n","title":"defaultNetwork (optional)","titles":["Using RainbowKit","Parameters"]},"258":{"href":"/sdk/typescript/connectors/04-rainbow-kit#using-nextjs","html":"\n
There are special considerations to take into account when using NextJs with Wagmi-based libraries like RainbowKit, such that it functions harmoniously with the server-side rendering of NextJs.\nThe correct technique to use differs depending on whether the application uses the older pages router or the more recent app router.
\n
See this section for an explanation on using Wagmi or Wagmi-based libraries with app router. \nSee the example app which uses the app router structure.
\n
See this section for an explanation on using Wagmi or Wagmi-based libraries with pages router. \nSee the example app which uses the pages router structure.
\n","isPage":false,"text":"\nThere are special considerations to take into account when using NextJs with Wagmi-based libraries like RainbowKit, such that it functions harmoniously with the server-side rendering of NextJs.\nThe correct technique to use differs depending on whether the application uses the older pages router or the more recent app router.\nSee this section for an explanation on using Wagmi or Wagmi-based libraries with app router.\nSee the example app which uses the app router structure.\nSee this section for an explanation on using Wagmi or Wagmi-based libraries with pages router.\nSee the example app which uses the pages router structure.\n","title":"Using NextJs","titles":["Using RainbowKit"]},"259":{"href":"/sdk/typescript/connectors/04-rainbow-kit#using-older-versions-of-wagmi--012x","html":"\n
If you are using an older version of Wagmi (<= 0.12.x), which is based on ethers instead of viem, use the following command to install the appropriate version of the wagmi connector:
\n","isPage":false,"text":"\nIf you are using an older version of Wagmi (<= 0.12.x), which is based on ethers instead of viem, use the following command to install the appropriate version of the wagmi connector:\nnpm install @0xsequence/wagmi-connector@1.0 0xsequence ethers\nor\nyarn add @0xsequence/wagmi-connector@1.0 0xsequence ethers\n","title":"Using older versions of Wagmi (<= 0.12.x)","titles":["Using RainbowKit"]},"260":{"href":"/sdk/typescript/connectors/04-rainbow-kit#examples","html":"\n
A demo app for NextJs + Wagmi (which is applicable for wagmi-based libraries) with the app router structure here. \nA demo app for NextJs + Wagmi (which is applicable for wagmi-based libraries) with the older pages router structure here.
","isPage":false,"text":"\nA demo app for RainbowKit is available here\nA demo app for NextJs + Wagmi (which is applicable for wagmi-based libraries) with the app router structure here.\nA demo app for NextJs + Wagmi (which is applicable for wagmi-based libraries) with the older pages router structure here.","title":"Examples","titles":["Using RainbowKit"]},"261":{"href":"/sdk/typescript/connectors/05-web3-onboard#using-web3-onboard","html":"\n
The Sequence wallet can be added through the Blocknative web3-onboard package.
\n
:::tip Try it live :)\nTry a live Dapp example using Sequence + Metamask + Wallet Connect with Web3-Onboard.
\n","isPage":true,"text":"\nThe Sequence wallet can be added through the Blocknative web3-onboard package.\n:::tip Try it live :)\nTry a live Dapp example using Sequence + Metamask + Wallet Connect with Web3-Onboard.\nSource code is available too: https://github.com/0xsequence/demo-dapp-web3-onboard\n:::\n","title":"Using Web3-Onboard","titles":[]},"262":{"href":"/sdk/typescript/connectors/05-web3-onboard#installation","html":"\n
The default network that the Sequence wallet will attempt to connect to.
\n","isPage":false,"text":"\nThe default network that the Sequence wallet will attempt to connect to.\n","title":"network (optional)","titles":["Using Web3-Onboard","Parameters"]},"266":{"href":"/sdk/typescript/connectors/05-web3-onboard#appname-optional","html":"\n
The name of the app which will show up in Sequence's prompt upon an attempt to connect.
\n","isPage":false,"text":"\nThe name of the app which will show up in Sequence's prompt upon an attempt to connect.\n","title":"appName (optional)","titles":["Using Web3-Onboard","Parameters"]},"267":{"href":"/sdk/typescript/connectors/05-web3-onboard#example","html":"\n
An example demo of an integration of Sequence + Web3 Onboard is available here
","isPage":false,"text":"\nAn example demo of an integration of Sequence + Web3 Onboard is available here","title":"Example","titles":["Using Web3-Onboard"]},"268":{"href":"/sdk/typescript/connectors/06-web3-react-v6#using-web3-react-v6","html":"\n
The connector is available for web3-react V6. Please note that later versions of web3-react cannot be used with the Web3-React V6 connector due to breaking changes.
\n","isPage":true,"text":"\nThe connector is available for web3-react V6. Please note that later versions of web3-react cannot be used with the Web3-React V6 connector due to breaking changes.\n","title":"Using Web3-React V6","titles":[]},"269":{"href":"/sdk/typescript/connectors/06-web3-react-v6#installation","html":"\n
The connector may be installed via the npm package:
\n","isPage":false,"text":"\nThe connector may be installed via the npm package:\n npm install @0xsequence/web3-react-v6-connector 0xsequence ethers\n","title":"Installation","titles":["Using Web3-React V6"]},"270":{"href":"/sdk/typescript/connectors/06-web3-react-v6#usage","html":"\n","isPage":false,"text":"\n","title":"Usage","titles":["Using Web3-React V6"]},"271":{"href":"/sdk/typescript/connectors/06-web3-react-v6#initialization","html":"\n
The connector must be initialized similarly to other connectors.
\n","isPage":false,"text":"\nThe connection can be activated and deactivated from the initialized connector similarly to other connectors.\nimport { useWeb3React } from '@web3-react/core'\nimport { sequence as sequenceConnector } from './connectors/sequence'\n \nconst { activate } = useWeb3React()\n \nconst connectWeb3React = async () => {\n activate(sequenceConnector);\n}\n \nconst disconnectWeb3React = async () => {\n sequenceConnector.deactivate();\n}\n","title":"Activation/Deactivation","titles":["Using Web3-React V6","Usage"]},"273":{"href":"/sdk/typescript/connectors/06-web3-react-v6#options","html":"\n","isPage":false,"text":"\n","title":"Options","titles":["Using Web3-React V6"]},"274":{"href":"/sdk/typescript/connectors/06-web3-react-v6#chainid","html":"\n
The default chain id as number that the Sequence wallet will attempt to connect to.
\n","isPage":false,"text":"\nThe default chain id as number that the Sequence wallet will attempt to connect to.\n","title":"chainId","titles":["Using Web3-React V6","Options"]},"275":{"href":"/sdk/typescript/connectors/06-web3-react-v6#appname-optional","html":"\n
The value of appName will be displayed by the Sequence wallet when initiating a connection.
\n","isPage":false,"text":"\nThe value of appName will be displayed by the Sequence wallet when initiating a connection.\n","title":"appName (optional)","titles":["Using Web3-React V6","Options"]},"276":{"href":"/sdk/typescript/connectors/06-web3-react-v6#example","html":"\n
","isPage":false,"text":"\nA demo app for Web3-React v6 is available here","title":"Example","titles":["Using Web3-React V6"]},"277":{"href":"/sdk/typescript/connectors/07-web3modal#using-web3modal","html":"\n
The Sequence wallet can easily be used with Web3Modal.
\n
:::tip Try it live :)\nTry a live Dapp example using Sequence + Wallet Connect with Web3Modal.
\n","isPage":true,"text":"\nThe Sequence wallet can easily be used with Web3Modal.\n:::tip Try it live :)\nTry a live Dapp example using Sequence + Wallet Connect with Web3Modal.\nSource code is available too: https://github.com/0xsequence/demo-dapp-web3modal\n:::\n","title":"Using Web3Modal","titles":[]},"278":{"href":"/sdk/typescript/connectors/07-web3modal#usage","html":"\n
The sequence wallet is compatible with wallet connect V2 and is therefore fully compatible with web3modal by default.\nUsers can use the Scan button in the sequence wallet to connect.
\n\n","isPage":false,"text":"\nThe sequence wallet is compatible with wallet connect V2 and is therefore fully compatible with web3modal by default.\nUsers can use the Scan button in the sequence wallet to connect.\n\n","title":"Usage","titles":["Using Web3Modal"]},"279":{"href":"/sdk/typescript/connectors/07-web3modal#example","html":"\n
","isPage":false,"text":"\nAn example demo for the sequence Wallet + web3modal is available [here] (https://github.com/0xsequence/demo-dapp-web3modal)","title":"Example","titles":["Using Web3Modal"]},"280":{"href":"/sdk/typescript/connectors/08-FAQ#nextjs","html":"\n","isPage":true,"text":"\n","title":"NextJs","titles":[null]},"281":{"href":"/sdk/typescript/connectors/08-FAQ#why-does-my-wallet-integration-produce-an-error-when-used-with-nextjs","html":"\n
Wallet libraries and connectors must be rendered in the browser. This is particularly true for Wagmi and Wagmi-based libraries. Attempts to render the page elsewhere, such as on backend server, can produce errors in some situations. Rendering on the server is therefore highly discouraged.
\n
The method for fixing this issue will depend on the folder structure. The pages folder structure is available for all versions of NextJs, while the app folder structure is only available for NextJs version 13 and above and may require being turned on through an experimental setting.
\n","isPage":false,"text":"\nWallet libraries and connectors must be rendered in the browser. This is particularly true for Wagmi and Wagmi-based libraries. Attempts to render the page elsewhere, such as on backend server, can produce errors in some situations. Rendering on the server is therefore highly discouraged.\nThe method for fixing this issue will depend on the folder structure. The pages folder structure is available for all versions of NextJs, while the app folder structure is only available for NextJs version 13 and above and may require being turned on through an experimental setting.\nSee using wallet libraries with next.js pages directory\nSee using wallet libraries with next.js app directory(NextJs 13+ feature)\n","title":"Why does my wallet integration produce an error when used with next.js?","titles":[null,"NextJs"]},"282":{"href":"/sdk/typescript/connectors/08-FAQ#how-do-i-use-a-wallet-library-and-connector-with-nextjs-using-the-pages-directory-all-versions-of-nextjs","html":"\n
The content of the application which depends on Wagmi hooks must be mounted only once the application is rendered in the client. This is a limitation due to wagmi when used with NextJs, and all wagmi-based libraries will inherit this limitation. To do so we can use a useEffect hook to wait before rendering the application.
\n
In the example below, we wait until the app is mounted in the client before rendering the rest of the application:
\n
import { useIsMounted } from '../hooks'\nimport Home from '../components/Home'\n\nconst Page = () => {\n const isMounted = useIsMounted()\n\n if (!isMounted) return null\n return (\n <>\n <Home />\n </>\n )\n}\n\nexport default Page
\n
A full code example of this setup working with the Wagmi library can be found on github.\nThe method described above is the one recommended by Wagmi and is demonstrated in their official example.
\n","isPage":false,"text":"\nThe content of the application which depends on Wagmi hooks must be mounted only once the application is rendered in the client. This is a limitation due to wagmi when used with NextJs, and all wagmi-based libraries will inherit this limitation. To do so we can use a useEffect hook to wait before rendering the application.\nIn the example below, we wait until the app is mounted in the client before rendering the rest of the application:\nimport { useIsMounted } from '../hooks'\nimport Home from '../components/Home'\n \nconst Page = () => {\n const isMounted = useIsMounted()\n \n if (!isMounted) return null\n return (\n <>\n <Home />\n </>\n )\n}\n \nexport default Page\nA full code example of this setup working with the Wagmi library can be found on github.\nThe method described above is the one recommended by Wagmi and is demonstrated in their official example.\n","title":"How do I use a wallet library and connector with next.js using the pages directory (all versions of NextJs)?","titles":[null,"NextJs"]},"283":{"href":"/sdk/typescript/connectors/08-FAQ#how-do-i-use-a-wallet-library-and-connector-with-nextjs-using-the-app-directory-version-13-and-above-only","html":"\n
NextJs 13 and above allows using a new folder structure in which the content is placed in an app directory. Enabling this feature may require explicitly indicating it with an experimental setting.\nWhen using such a folder structure, NextJs allows the declaration of Client Components which are components that will be rendered in the browser.\nA wrapper component containing the wallet library initialized with all the connectors must be declared with the "use client" directive. The "use client" directive is what will turn the wrapper component into a Client Component to be rendered in the browser.
\n
In addition, there is a bug with wagmi and nextJs when using the autoConnect feature which causes
\n
In the example below, we declare a wrapper component with the "use client" directive:
\n
"use client" // this directive informs next.js that the component is a Client Component to be rendered in the browser\n\nconst WagmiWrapper = ({ children }) => {\n const wagmiClient = createClient({\n autoConnect: true,\n connectors,\n provider,\n webSocketProvider,\n });\n\n\n return (\n <WagmiConfig client={wagmiClient}>\n {children}\n </WagmiConfig>\n );\n}\n\nexport default WagmiWrapper
\n
This wrapper component can then be imported normally and wrap the rest of the application. The child components can be a combination of Client and Server components.
\n
// We import a custom wrapper component that initializes the wallet library and all its connectors\n// An example of the content of this wrapper component can be found here: https://github.com/0xsequence/demo-dapp-wagmi-next/blob/master/components/WagmiProvider.tsx\nimport WagmiWrapper from './WagmiWrapper'\n\n// We can then wrap our entire app with this browser's rendered component\nfunction MyApp({ Component, pageProps }: AppProps) {\n return (\n <WagmiWrapper>\n <Component {...pageProps} />\n </WagmiWrapper>\n );\n}
\n
A full code example using Nextjs and the app directory can be found on github.\nThe method described above is the one recommended by Wagmi through their NextJs example which can be consulted by running the command npx create-wagmi and selecting the nextJs option.
\n
Click here for more information about Client Components.
","isPage":false,"text":"\nNextJs 13 and above allows using a new folder structure in which the content is placed in an app directory. Enabling this feature may require explicitly indicating it with an experimental setting.\nWhen using such a folder structure, NextJs allows the declaration of Client Components which are components that will be rendered in the browser.\nA wrapper component containing the wallet library initialized with all the connectors must be declared with the "use client" directive. The "use client" directive is what will turn the wrapper component into a Client Component to be rendered in the browser.\nIn addition, there is a bug with wagmi and nextJs when using the autoConnect feature which causes\nIn the example below, we declare a wrapper component with the "use client" directive:\n"use client" // this directive informs next.js that the component is a Client Component to be rendered in the browser\n \nconst WagmiWrapper = ({ children }) => {\n const wagmiClient = createClient({\n autoConnect: true,\n connectors,\n provider,\n webSocketProvider,\n });\n \n \n return (\n <WagmiConfig client={wagmiClient}>\n {children}\n </WagmiConfig>\n );\n}\n \nexport default WagmiWrapper\nThis wrapper component can then be imported normally and wrap the rest of the application. The child components can be a combination of Client and Server components.\n// We import a custom wrapper component that initializes the wallet library and all its connectors\n// An example of the content of this wrapper component can be found here: https://github.com/0xsequence/demo-dapp-wagmi-next/blob/master/components/WagmiProvider.tsx\nimport WagmiWrapper from './WagmiWrapper'\n \n// We can then wrap our entire app with this browser's rendered component\nfunction MyApp({ Component, pageProps }: AppProps) {\n return (\n <WagmiWrapper>\n <Component {...pageProps} />\n </WagmiWrapper>\n );\n}\nA full code example using Nextjs and the app directory can be found on github.\nThe method described above is the one recommended by Wagmi through their NextJs example which can be consulted by running the command npx create-wagmi and selecting the nextJs option.\nClick here for more information about Client Components.","title":"How do I use a wallet library and connector with next.js using the app directory (version 13 and above only)?","titles":[null,"NextJs"]},"284":{"href":"/sdk/unity/Advanced/01-introduction#advanced---introduction","html":"\n
For advanced users with experience developing applications on EVM-based blockchains, we've provided our own lightweight, custom-made for Unity, Ethereum library: SequenceEthereum.\nSequenceEthereum should provide everything you need to build your Unity app on the EVM, without all the extra bells and whistles that the popular Nethereum library provides.
\n
While SequenceEthereum is heavily tested, in general, when working with asynchronous methods in the library, you should consider them to be "unsafe", in that they may throw Exceptions when used improperly.\nIn general, wrapping async calls that can potentially throw Exceptions in try catch blocks is a best practice; particularly in Unity, where Tasks can fail silently when throwing exceptions - making debugging difficult when not wrapping calls in try catch blocks.
\n","isPage":true,"text":"\nFor advanced users with experience developing applications on EVM-based blockchains, we've provided our own lightweight, custom-made for Unity, Ethereum library: SequenceEthereum.\nSequenceEthereum should provide everything you need to build your Unity app on the EVM, without all the extra bells and whistles that the popular Nethereum library provides.\nWhile SequenceEthereum is heavily tested, in general, when working with asynchronous methods in the library, you should consider them to be "unsafe", in that they may throw Exceptions when used improperly.\nIn general, wrapping async calls that can potentially throw Exceptions in try catch blocks is a best practice; particularly in Unity, where Tasks can fail silently when throwing exceptions - making debugging difficult when not wrapping calls in try catch blocks.\n","title":"Advanced - Introduction","titles":[]},"285":{"href":"/sdk/unity/Advanced/01-introduction#important-components","html":"\n
When working with the SequenceEthereum library it can be helpful to understand some of the main "components" and how they logically fit together.
\n","isPage":false,"text":"\nWhen working with the SequenceEthereum library it can be helpful to understand some of the main "components" and how they logically fit together.\n","title":"Important Components","titles":["Advanced - Introduction"]},"286":{"href":"/sdk/unity/Advanced/02-wallets#wallets","html":"\n
In the context of SequenceEthereum, a Wallet is defined by the IWallet interface. There are currently 2 implementations of the IWallet interface in this SDK.
\n","isPage":true,"text":"\nIn the context of SequenceEthereum, a Wallet is defined by the IWallet interface. There are currently 2 implementations of the IWallet interface in this SDK.\n","title":"Wallets","titles":[]},"287":{"href":"/sdk/unity/Advanced/02-wallets#1-ethwallet","html":"\n
EthWallet is a standard EOA wallet for EVM chains.
\n
An EthWallet is easily created:
\n
IWallet eoaWallet = new EthWallet(); // This will generate a cryptographically random private key\nIWallet eoaWallet = new EthWallet(privateKeyString); // Create a wallet using a previously generated private key
\n","isPage":false,"text":"\nEthWallet is a standard EOA wallet for EVM chains.\nAn EthWallet is easily created:\nIWallet eoaWallet = new EthWallet(); // This will generate a cryptographically random private key\nIWallet eoaWallet = new EthWallet(privateKeyString); // Create a wallet using a previously generated private key\n","title":"1.","titles":["Wallets"]},"288":{"href":"/sdk/unity/Advanced/02-wallets#2-waastowalletadapter","html":"\n
WaaSToWalletAdapter is an adapter that allows you to use a WaaSWallet with the same IWallet interface as an EthWallet so that it may be used interchangeably with EOA wallets throughout the rest of the SequenceEthereum library.
\n
A WaaSToWalletAdapter is easily created once you have a WaaSWallet:
\n
IWallet waasAdapter = new WaaSToWalletAdapter(waasWallet);
\n","isPage":false,"text":"\nWaaSToWalletAdapter is an adapter that allows you to use a WaaSWallet with the same IWallet interface as an EthWallet so that it may be used interchangeably with EOA wallets throughout the rest of the SequenceEthereum library.\nA WaaSToWalletAdapter is easily created once you have a WaaSWallet:\nIWallet waasAdapter = new WaaSToWalletAdapter(waasWallet);\n","title":"2.","titles":["Wallets"]},"289":{"href":"/sdk/unity/Advanced/02-wallets#methods","html":"\n
The IWallet interface provides a number of methods for you. The most important of which are:
\n","isPage":false,"text":"\nThe IWallet interface provides a number of methods for you. The most important of which are:\n","title":"Methods","titles":["Wallets"]},"290":{"href":"/sdk/unity/Advanced/02-wallets#getaddress","html":"\n
Returns the Address for the wallet
\n
Address address = wallet.GetAddress();
\n","isPage":false,"text":"\nReturns the Address for the wallet\nAddress address = wallet.GetAddress();\n","title":"GetAddress","titles":["Wallets","Methods"]},"291":{"href":"/sdk/unity/Advanced/02-wallets#sendtransaction","html":"\n
Signs the given EthTransaction and submits it via the given client
\n","isPage":false,"text":"\nSigns the given EthTransaction and submits it via the given client\nstring transactionHash = await wallet.SendTransaction(client, transaction);\n","title":"SendTransaction","titles":["Wallets","Methods"]},"292":{"href":"/sdk/unity/Advanced/02-wallets#sendtransactionandwaitforreceipt","html":"\n
Signs the given EthTransaction and submits it via the given client then waits for the TransactionReceipt
\n","isPage":false,"text":"\nSigns the given EthTransaction and submits it via the given client then waits for the TransactionReceipt\nTransactionReceipt receipt = await wallet.SendTransactionAndWaitForReceipt(client, transaction);\n","title":"SendTransactionAndWaitForReceipt","titles":["Wallets","Methods"]},"293":{"href":"/sdk/unity/Advanced/02-wallets#sendtransactionbatch","html":"\n
Signs the given EthTransaction[] and submits them via the given client.\nIf wallet is an EthWallet, the transactions will be submitted sequentially, each of which may pass or fail. If the wallet is a WaaSToWalletAdapter, the transactions will be batched together into a single transaction that is submitted all at once and either passes or fails as a whole.\nSimilarly, if a wallet is an EthWallet the string[] (transaction hashes) you receive will be equal in length to the EthTransaction[] you submitted. While, if the wallet is a WaaSToWalletAdapter, you will only receive one transaction hash (string[] of length 1)
\n","isPage":false,"text":"\nSigns the given EthTransaction[] and submits them via the given client.\nIf wallet is an EthWallet, the transactions will be submitted sequentially, each of which may pass or fail. If the wallet is a WaaSToWalletAdapter, the transactions will be batched together into a single transaction that is submitted all at once and either passes or fails as a whole.\nSimilarly, if a wallet is an EthWallet the string[] (transaction hashes) you receive will be equal in length to the EthTransaction[] you submitted. While, if the wallet is a WaaSToWalletAdapter, you will only receive one transaction hash (string[] of length 1)\nstring[] transactionHashes = await wallet.SendTransactionBatch(client, transactions);\n","title":"SendTransactionBatch","titles":["Wallets","Methods"]},"294":{"href":"/sdk/unity/Advanced/02-wallets#sendtransactionbatchandwaitforreceipts","html":"\n
Signs the given EthTransaction[] and submits them via the given client then waits for the TransactionReceipt[].\nIf wallet is an EthWallet, the transactions will be submitted sequentially, each of which may pass or fail. If the wallet is a WaaSToWalletAdapter, the transactions will be batched together into a single transaction that is submitted all at once and either passes or fails as a whole.\nSimilarly, if a wallet is an EthWallet the TransactionReceipt[] you receive will be equal in length to the EthTransaction[] you submitted. While, if the wallet is a WaaSToWalletAdapter, you will only receive one transaction receipt (TransactionReceipt[] of length 1)
\n","isPage":false,"text":"\nSigns the given EthTransaction[] and submits them via the given client then waits for the TransactionReceipt[].\nIf wallet is an EthWallet, the transactions will be submitted sequentially, each of which may pass or fail. If the wallet is a WaaSToWalletAdapter, the transactions will be batched together into a single transaction that is submitted all at once and either passes or fails as a whole.\nSimilarly, if a wallet is an EthWallet the TransactionReceipt[] you receive will be equal in length to the EthTransaction[] you submitted. While, if the wallet is a WaaSToWalletAdapter, you will only receive one transaction receipt (TransactionReceipt[] of length 1)\nTransactionReceipt[] receipts = await wallet.SendTransactionAndWaitForReceipt(client, transactions);\n","title":"SendTransactionBatchAndWaitForReceipts","titles":["Wallets","Methods"]},"295":{"href":"/sdk/unity/Advanced/02-wallets#signmessage","html":"\n
Given a message and an optional chain id, sign the message using the wallet. Omit the chain id from the signature if not provided
Note: the chainId is expected to be in hexadecimal format. If you are working with a Chain object (recommended), you can use the AsString method to get the hexadecimal format of the chain id
","isPage":false,"text":"\nGiven a message and an optional chain id, sign the message using the wallet. Omit the chain id from the signature if not provided\nstring signedMessage = await wallet.SignMessage(message, chainId)\nNote: the chainId is expected to be in hexadecimal format. If you are working with a Chain object (recommended), you can use the AsString method to get the hexadecimal format of the chain id\nstring signedMessage = await wallet.SignMessage(message, Chain.Polygon.AsString());","title":"SignMessage","titles":["Wallets","Methods"]},"296":{"href":"/sdk/unity/Advanced/03-clients#clients","html":"\n
In the context of SequenceEthereum, a Client is defined by the IEthClient interface.
\n
Creating a client requires a Chain. This will use our highly available and responsive Node Gateway service for your RPC requests; accessed using the API key from the Builder you've provided in your SequenceConfig scriptable object. If you prefer to use your own RPC URL, you can create a SequenceEthClient using a URL string as a parameter instead.
\n
You can create a client using this snippet:
\n
IEthClient client = new SequenceEthClient(Chain.Polygon);
\n","isPage":true,"text":"\nIn the context of SequenceEthereum, a Client is defined by the IEthClient interface.\nCreating a client requires a Chain. This will use our highly available and responsive Node Gateway service for your RPC requests; accessed using the API key from the Builder you've provided in your SequenceConfig scriptable object. If you prefer to use your own RPC URL, you can create a SequenceEthClient using a URL string as a parameter instead.\nYou can create a client using this snippet:\nIEthClient client = new SequenceEthClient(Chain.Polygon);\n","title":"Clients","titles":[]},"297":{"href":"/sdk/unity/Advanced/03-clients#methods","html":"\n
As your connection point to Ethereum nodes, there are a number of methods that can be performed by a client, these can be found in the IEthClient interface and are implemented by SequenceEthClient.
\n
Note: with the exception of BalanceAt (potentially), most users will not need to make use of these methods, but we have included them in our documentation for completeness.
\n","isPage":false,"text":"\nAs your connection point to Ethereum nodes, there are a number of methods that can be performed by a client, these can be found in the IEthClient interface and are implemented by SequenceEthClient.\nNote: with the exception of BalanceAt (potentially), most users will not need to make use of these methods, but we have included them in our documentation for completeness.\n","title":"Methods","titles":["Clients"]},"298":{"href":"/sdk/unity/Advanced/03-clients#balanceat","html":"\n
Used to get the gas currency balance of a given wallet at a given blockNumber (in hexadecimal format provided as a string)
\n
BigIntegar balance = await client.BalanceAt(wallet.GetAddress()); // By default, if no blockNumber string is provided, check the latest block\nBigIntegar balance = await client.BalanceAt(wallet.GetAddress(), blockNumber);
\n
Note: there are two special values for blockNumber. "earliest" will get the balance at the earliest block on the chain. "latest" will get the balance at the latest block on the chain and is the default parameter when none is provided. Otherwise, you'll want to provide the blockNumber string in hexadecimal format.
\nUnless you really want to get into the weeds with how things work, it is HIGHLY recommended to move on to the next page of the documentation at this point\n","isPage":false,"text":"\nUsed to get the gas currency balance of a given wallet at a given blockNumber (in hexadecimal format provided as a string)\nBigIntegar balance = await client.BalanceAt(wallet.GetAddress()); // By default, if no blockNumber string is provided, check the latest block\nBigIntegar balance = await client.BalanceAt(wallet.GetAddress(), blockNumber);\nNote: there are two special values for blockNumber. "earliest" will get the balance at the earliest block on the chain. "latest" will get the balance at the latest block on the chain and is the default parameter when none is provided. Otherwise, you'll want to provide the blockNumber string in hexadecimal format.\nUnless you really want to get into the weeds with how things work, it is HIGHLY recommended to move on to the next page of the documentation at this point\n","title":"BalanceAt","titles":["Clients","Methods"]},"299":{"href":"/sdk/unity/Advanced/03-clients#blockbynumber","html":"\n
Used to get the Block with a specific block number.
Note: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"
\n","isPage":false,"text":"\nUsed to get the Block with a specific block number.\nBlock block = await client.BlockByNumber(blockNumber);\nNote: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"\n","title":"BlockByNumber","titles":["Clients","Methods"]},"300":{"href":"/sdk/unity/Advanced/03-clients#blockbyhash","html":"\n
Used to get the Block by a specified block hash (string)
\n","isPage":false,"text":"\nUsed to get the Block by a specified block hash (string)\nBlock block = await client.BlockByHash(blockHash);\n","title":"BlockByHash","titles":["Clients","Methods"]},"301":{"href":"/sdk/unity/Advanced/03-clients#blocknumber","html":"\n
Used to get the most recent block number in hexadecimal format
\n
string blockNumber = await client.BlockNumber();
\n","isPage":false,"text":"\nUsed to get the most recent block number in hexadecimal format\nstring blockNumber = await client.BlockNumber();\n","title":"BlockNumber","titles":["Clients","Methods"]},"302":{"href":"/sdk/unity/Advanced/03-clients#blockrange","html":"\n
Used to get a List<Block> from the blocks in a range specified by blockNumbers
Note: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"
\n","isPage":false,"text":"\nUsed to get a List<Block> from the blocks in a range specified by blockNumbers\nList<Block> blockRange = await client.BlockRange(startingBlockNumber, endingBlockNumber);\nNote: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"\n","title":"BlockRange","titles":["Clients","Methods"]},"303":{"href":"/sdk/unity/Advanced/03-clients#chainid","html":"\n
Used to get the chain id in hexadecimal format for the chain the client is connected to
\n
string chainId = await client.ChainID();
\n","isPage":false,"text":"\nUsed to get the chain id in hexadecimal format for the chain the client is connected to\nstring chainId = await client.ChainID();\n","title":"ChainID","titles":["Clients","Methods"]},"304":{"href":"/sdk/unity/Advanced/03-clients#codeat","html":"\n
Used to get the bytecode for a smart contract at a given address in hexadecimal format at a specified blockNumber
Note: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"
\n","isPage":false,"text":"\nUsed to get the bytecode for a smart contract at a given address in hexadecimal format at a specified blockNumber\nstring code = await client.CodeAt(contractAddress, blockNumber);\nNote: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"\n","title":"CodeAt","titles":["Clients","Methods"]},"305":{"href":"/sdk/unity/Advanced/03-clients#estimategas","html":"\n
Given a TransactionCall estimate the amount of gas required for the transaction
\n
BigIntegar gas = await client.EstimateGas(transactionCall);
\n","isPage":false,"text":"\nGiven a TransactionCall estimate the amount of gas required for the transaction\nBigIntegar gas = await client.EstimateGas(transactionCall);\n","title":"EstimateGas","titles":["Clients","Methods"]},"306":{"href":"/sdk/unity/Advanced/03-clients#feehistory","html":"\n
Get a FeeHistoryResult for gas fees paid blockCount blocks since newestBlock (blockNumber)
\n
FeeHistoryResult feeHistory = await client.FeeHistory(blockCount, newestBlock, new int[] { });
\n
Note: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"
\n","isPage":false,"text":"\nGet a FeeHistoryResult for gas fees paid blockCount blocks since newestBlock (blockNumber)\nFeeHistoryResult feeHistory = await client.FeeHistory(blockCount, newestBlock, new int[] { });\nNote: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"\n","title":"FeeHistory","titles":["Clients","Methods"]},"307":{"href":"/sdk/unity/Advanced/03-clients#networkid","html":"\n
Used to get the chain id in integer format (as string) for the chain the client is connected to
\n
string networkId = await client.NetworkId();
\n","isPage":false,"text":"\nUsed to get the chain id in integer format (as string) for the chain the client is connected to\nstring networkId = await client.NetworkId();\n","title":"NetworkId","titles":["Clients","Methods"]},"308":{"href":"/sdk/unity/Advanced/03-clients#nonceat","html":"\n
Used to get the recommended nonce for a given Address at a given blockNumber (defaults to "latest")
Note: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"
\n","isPage":false,"text":"\nUsed to get the recommended nonce for a given Address at a given blockNumber (defaults to "latest")\nBigInteger nonce = await client.NonceAt(wallet.GetAddress()); // Nonce at latest\nBigIntegar nonce = await client.NonceAt(wallet.GetAddress(), blockNumber);\nNote: as above, blockNumber should be in hexadecimal format or special values "ealiest" and "latest"\n","title":"NonceAt","titles":["Clients","Methods"]},"309":{"href":"/sdk/unity/Advanced/03-clients#sendrawtransaction","html":"\n
Given a signed transaction string, submit the transaction to the network and return a transaction hash
\n","isPage":false,"text":"\nGiven a signed transaction string, submit the transaction to the network and return a transaction hash\nstring transactionHash = await client.SendRawTransaction(signedTransactionString);\n","title":"SendRawTransaction","titles":["Clients","Methods"]},"310":{"href":"/sdk/unity/Advanced/03-clients#suggestgasprice","html":"\n
\n","isPage":false,"text":"\nUsed to get a suggested gas price\nBigIntegar gasPrice = await client.SuggestGasPrice();\n","title":"SuggestGasPrice","titles":["Clients","Methods"]},"311":{"href":"/sdk/unity/Advanced/03-clients#suggestgastipcap","html":"\n
Used to get the max suggested priority fee for gas
\n","isPage":false,"text":"\nUsed to get the max suggested priority fee for gas\nBigIntegar gasTipCap = await client.SuggestGasTipCap();\n","title":"SuggestGasTipCap","titles":["Clients","Methods"]},"312":{"href":"/sdk/unity/Advanced/03-clients#transactionbyhash","html":"\n
\n","isPage":false,"text":"\nUsed to get a Transaction by transaction hash\nTransaction transaction = await client.TransactionByHash(transactionHash);\n","title":"TransactionByHash","titles":["Clients","Methods"]},"313":{"href":"/sdk/unity/Advanced/03-clients#transactioncount","html":"\n
Used to get the number of transactions in a block by block hash
\n","isPage":false,"text":"\nUsed to get the number of transactions in a block by block hash\nBigIntegar transactionCount = await client.TransactionCount(blockHash);\n","title":"TransactionCount","titles":["Clients","Methods"]},"314":{"href":"/sdk/unity/Advanced/03-clients#waitfortransactionreceipt","html":"\n
Provide a transaction hash in order to wait for and return the TransactionReceipt
","isPage":false,"text":"\nProvide a transaction hash in order to wait for and return the TransactionReceipt\nTransactionReceipt receipt = await client.WaitForTransactionReceipt(transactionHash);","title":"WaitForTransactionReceipt","titles":["Clients","Methods"]},"315":{"href":"/sdk/unity/Advanced/04-transfers#transfers","html":"\n
In order to transfer ETH (or the gas currency for your network), it is recommended to use TranferEth.CreateTransaction
Behind the scenes, this will create a GasLimitEstimator which will construct the transaction for you - including determining the appropriate gasPrice, gasLimit, and nonce.
","isPage":true,"text":"\nIn order to transfer ETH (or the gas currency for your network), it is recommended to use TranferEth.CreateTransaction\nEthTransaction transferTransaction = await TransferEth.CreateTransaction(client, wallet, recipientAddress, DecimalNormalizer.Normalize(1));\nTransactionReceipt receipt = await wallet.SendTransactionAndWaitForReceipt(client, transferTransaction);\nBehind the scenes, this will create a GasLimitEstimator which will construct the transaction for you - including determining the appropriate gasPrice, gasLimit, and nonce.","title":"Transfers","titles":[]},"316":{"href":"/sdk/unity/Advanced/05-contracts#contracts","html":"\n
Creating a Contract object for an already deployed contract is rather straightforward.
\n
Contract contract = new Contract(contractAddress, abi);
\n
While it is not strictly required, it is highly recommended to provide the contract ABI as a string when creating a contract object. Failure to do so will make it so that you cannot fully take advantage of our ABI encoding and decoding.\nIf you do chose to go down this route, you will need to provide the entire function signature (function name + parameter types in brackets - e.g. transfer(address,uint256) for the ERC20 transfer method) when calling a function or querying the contract and you will only ever receive a string as a response to queries.
\n","isPage":true,"text":"\nCreating a Contract object for an already deployed contract is rather straightforward.\nContract contract = new Contract(contractAddress, abi);\nWhile it is not strictly required, it is highly recommended to provide the contract ABI as a string when creating a contract object. Failure to do so will make it so that you cannot fully take advantage of our ABI encoding and decoding.\nIf you do chose to go down this route, you will need to provide the entire function signature (function name + parameter types in brackets - e.g. transfer(address,uint256) for the ERC20 transfer method) when calling a function or querying the contract and you will only ever receive a string as a response to queries.\n","title":"Contracts","titles":[]},"317":{"href":"/sdk/unity/Advanced/05-contracts#calling-smart-contract-functions","html":"\n
To call a smart contract, you'll use the CallFunction method to create a CallContractFunction object which will determine the appropriate gasPrice, gasLimit, nonce, and data to include in a newly assembled EthTransaction when provided with a client and a ContractCall object to the Create async Task
\n
An example of calling a smart contract would look like:
\n
Contract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case\nTransactionReceipt receipt = await erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger).SendTransactionMethodAndWaitForReceipt(wallet, client);
\n
Note: if you don't want to wait for the receipt, you can use SendTransactionMethod instead.
\n
Alternatively, if you want to simply create the EthTransaction and send it at a later time, you can use the CallContractFunction object from CallFunction directly.
\n
Contract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case\nEthTransaction transaction = await erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger).Create(client, new ContractCall(wallet.GetAddress()));\nTransactionReceipt receipt = await wallet.SendTransactionAndWaitForReceipt(client, transaction);\n\n// or \nCallContractFunction transactionCreator = erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger);\nEthTransaction transaction = await transactionCreator.Create(client, new ContractCall(wallet.GetAddress()));\nTransactionReceipt receipt = await wallet.SendTransactionAndWaitForReceipt(client, transaction);\n\n// or \nCallContractFunction transactionCreator = erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger);\nTransactionReceipt receipt = await transactionCreator.SendTransactionMethodAndWaitForReceipt(wallet, client);
\n
You'll notice that the CallFunction method accepts an arbitrary number of arguments. You'll want to provide the arguments in the order they are provided in the ABI/function signature.
\n","isPage":false,"text":"\nTo call a smart contract, you'll use the CallFunction method to create a CallContractFunction object which will determine the appropriate gasPrice, gasLimit, nonce, and data to include in a newly assembled EthTransaction when provided with a client and a ContractCall object to the Create async Task\nAn example of calling a smart contract would look like:\nContract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case\nTransactionReceipt receipt = await erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger).SendTransactionMethodAndWaitForReceipt(wallet, client);\nNote: if you don't want to wait for the receipt, you can use SendTransactionMethod instead.\nAlternatively, if you want to simply create the EthTransaction and send it at a later time, you can use the CallContractFunction object from CallFunction directly.\nContract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case\nEthTransaction transaction = await erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger).Create(client, new ContractCall(wallet.GetAddress()));\nTransactionReceipt receipt = await wallet.SendTransactionAndWaitForReceipt(client, transaction);\n\n// or \nCallContractFunction transactionCreator = erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger);\nEthTransaction transaction = await transactionCreator.Create(client, new ContractCall(wallet.GetAddress()));\nTransactionReceipt receipt = await wallet.SendTransactionAndWaitForReceipt(client, transaction);\n\n// or \nCallContractFunction transactionCreator = erc20Contract.CallFunction("transfer", toAddress, amountAsBigInteger);\nTransactionReceipt receipt = await transactionCreator.SendTransactionMethodAndWaitForReceipt(wallet, client);\nYou'll notice that the CallFunction method accepts an arbitrary number of arguments. You'll want to provide the arguments in the order they are provided in the ABI/function signature.\n","title":"Calling Smart Contract Functions","titles":["Contracts"]},"318":{"href":"/sdk/unity/Advanced/05-contracts#understanding-data-type-mappings","html":"\n
When interacting with smart contracts, it is important to understand how EVM datatypes are mapped to C# datatypes in the SequenceEthereum library.
If you were to, for example, provide a string where the ABI expects an Integer, you will receive an exception, even if that string could be converted into an integer.
\n","isPage":false,"text":"\nWhen interacting with smart contracts, it is important to understand how EVM datatypes are mapped to C# datatypes in the SequenceEthereum library.\nbool -> bool\nIntegers (int, uint, int256, uint8, ...) -> BigInteger\naddress -> Address or string\nstring -> string\nFixed bytes (bytesN for any N value) -> FixedByte\nbytes -> byte[]\nIf you were to, for example, provide a string where the ABI expects an Integer, you will receive an exception, even if that string could be converted into an integer.\n","title":"Understanding data type mappings","titles":["Contracts"]},"319":{"href":"/sdk/unity/Advanced/05-contracts#querying-contracts","html":"\n
To query a smart contract (read data from it), you'll use the SendQuery<T> method to query the contract and return the result as type T (if possible).\nAn example of querying a smart contract would look like:
\n
Contract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case\nBigIntegar balance = await erc20Contract.SendQuery<BigIntegar>(client, "balanceOf", address);
\n
Alternatively, if you wish to simply construct the query and send it at a later time, you can use QueryContract<T> to create a delegate.
\n
Contract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case\nQueryContractMessageSender<BigIntegar> balanceQuery = erc20Contract.QueryContract<BigIntegar>("balanceOf", address);\nBigIntegar balance = await balanceQuery(client);\n// or\nBigIntegar balance = await balanceQuery.SendQuery(client);
\n","isPage":false,"text":"\nTo query a smart contract (read data from it), you'll use the SendQuery<T> method to query the contract and return the result as type T (if possible).\nAn example of querying a smart contract would look like:\nContract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case\nBigIntegar balance = await erc20Contract.SendQuery<BigIntegar>(client, "balanceOf", address);\nAlternatively, if you wish to simply construct the query and send it at a later time, you can use QueryContract<T> to create a delegate.\nContract erc20Contract = new Contract(contractAddress, contractAbi); // We'll use the well-known ERC20 contract as our example case\nQueryContractMessageSender<BigIntegar> balanceQuery = erc20Contract.QueryContract<BigIntegar>("balanceOf", address);\nBigIntegar balance = await balanceQuery(client);\n// or\nBigIntegar balance = await balanceQuery.SendQuery(client);\n","title":"Querying Contracts","titles":["Contracts"]},"320":{"href":"/sdk/unity/Advanced/05-contracts#deploying-contracts","html":"\n
If you want to deploy a contract, you can use the ContractDeployer
","isPage":false,"text":"\nIf you want to deploy a contract, you can use the ContractDeployer\nContractDeploymentResult deploymentResult = await ContractDeployer.Deploy(client, wallet, contractBytecodeAsString);\nstring newlyDeployedContractAddress = deploymentResult.Receipt.contractAddress;","title":"Deploying Contracts","titles":["Contracts"]},"321":{"href":"/sdk/unity/Advanced/06-tokens#tokens","html":"\n
Since their use is so ubiquitous, we've provided ERC20, ERC721, and ERC1155 wrappers of the Contract class with pre-defined ABIs for your convenience. When interacting with tokens, it is recommended to use these.
\n
Any of these contract wrappers can be created via a standard constructor requiring only the contract address. For example:
\n
ERC20 erc20 = new ERC20(contractAddress);
\n
You may also provide your own ABI should you need to rewrite our default; however, doing so may require you to modify or rewrite the contract wrappers.
\n
An example of querying:
\n
string symbol = await erc20.Symbol(client);\nBigIntegar balance = await erc20.BalanceOf(client, address);
\n","isPage":true,"text":"\nSince their use is so ubiquitous, we've provided ERC20, ERC721, and ERC1155 wrappers of the Contract class with pre-defined ABIs for your convenience. When interacting with tokens, it is recommended to use these.\nAny of these contract wrappers can be created via a standard constructor requiring only the contract address. For example:\nERC20 erc20 = new ERC20(contractAddress);\nYou may also provide your own ABI should you need to rewrite our default; however, doing so may require you to modify or rewrite the contract wrappers.\nAn example of querying:\nstring symbol = await erc20.Symbol(client);\nBigIntegar balance = await erc20.BalanceOf(client, address);\nAn example of sending a transaction:\nTransactionReceipt receipt = await erc20.Mint(toAddress, DecimalNormalizer.NormalizeAsBigInteger(1)).SendTransactionMethodAndWaitForReceipt(wallet, client);\nAs a wrapper of Contract, you also have the option to not create the EthTransaction and send later on.\nCallContractFunction transactionCreator = erc20.Transfer(toAddress, DecimalNormalizer.NormalizeAsBigInteger(1));\nEthTransaction transaction = await transactionCreator.Create(client, new ContractCall(wallet.GetAddress()));\nTransactionReceipt receipt = await wallet.SendTransactionAndWaitForReceipt(client, transaction);\n","title":"Tokens","titles":[]},"322":{"href":"/sdk/unity/Advanced/06-tokens#bonus-ownable","html":"\n
Similar to with tokens, we have also provided an Ownable wrapper for your convenience as well which has a pre-defined ABI for methods implementing the Ownable interface.\nERC20, ERC721, and ERC1155 all inherit from this, but we encourage you to use Ownable whenever you wish to interact with the Ownable methods on any arbitrary contract for convenience and safety.
","isPage":false,"text":"\nSimilar to with tokens, we have also provided an Ownable wrapper for your convenience as well which has a pre-defined ABI for methods implementing the Ownable interface.\nERC20, ERC721, and ERC1155 all inherit from this, but we encourage you to use Ownable whenever you wish to interact with the Ownable methods on any arbitrary contract for convenience and safety.","title":"Bonus: Ownable","titles":[]},"323":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#how-to-manage-item-metadata-in-sequence-builder","html":"\n","isPage":true,"text":"\n","title":"How to Manage Item Metadata in Sequence Builder","titles":[]},"324":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#introduction","html":"\n
Following this guide, you can easily manage token metadata for your contract items in Sequence Builder, with a little help from Pinata for IPFS hosting.
\n","isPage":false,"text":"\nFollowing this guide, you can easily manage token metadata for your contract items in Sequence Builder, with a little help from Pinata for IPFS hosting.\n","title":"Introduction","titles":["How to Manage Item Metadata in Sequence Builder"]},"325":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-1-prepare-your-token-images-and-metadata","html":"\n
First things first, gather all your token images. For each token, you'll need a metadata file named id.json (like 1.json, 2.json, etc.). These files should look something like this at a minimum:
As you can guess, you can build from these basics. You could have your unique item attributes embedded in this token and generated on the fly.
\n","isPage":false,"text":"\nFirst things first, gather all your token images. For each token, you'll need a metadata file named id.json (like 1.json, 2.json, etc.). These files should look something like this at a minimum:\n{\n "name": "Token Name",\n "description": "Token Description",\n "image": "ipfs://"\n}\nAs you can guess, you can build from these basics. You could have your unique item attributes embedded in this token and generated on the fly.\n","title":"Step 1: Prepare Your Token Images and Metadata","titles":["How to Manage Item Metadata in Sequence Builder"]},"326":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-2-set-up-on-pinatacloud","html":"\n
Head over to Pinata.cloud and create an account. Upload each of your token images as separate files. Next, update the metadata JSON files with the ipfs address for each token. To do this, simply copy the CID (Content Identifier) for each file from Pinata and paste it after ipfs:// in your JSON files. It should look like this:
\n","isPage":false,"text":"\nHead over to Pinata.cloud and create an account. Upload each of your token images as separate files. Next, update the metadata JSON files with the ipfs address for each token. To do this, simply copy the CID (Content Identifier) for each file from Pinata and paste it after ipfs:// in your JSON files. It should look like this:\n{\n "name": "Token Name",\n "description": "Token Description",\n "image": "ipfs://QmdJzQExj2wnNY7pNNn4KauzckjH4vA5xhoxmmis919Ev3"\n}\n\n","title":"Step 2: Set Up on Pinata.cloud","titles":["How to Manage Item Metadata in Sequence Builder"]},"327":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-3-upload-your-metadata-files","html":"\n
Now, gather all your JSON metadata files into a single folder on your computer. Use Pinata's 'Upload > Folder' feature to upload this folder. Then, copy the CID for the entire folder.
\n
\n","isPage":false,"text":"\nNow, gather all your JSON metadata files into a single folder on your computer. Use Pinata's 'Upload > Folder' feature to upload this folder. Then, copy the CID for the entire folder.\n\n","title":"Step 3: Upload Your Metadata Files","titles":["How to Manage Item Metadata in Sequence Builder"]},"328":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-4-get-the-folder-url","html":"\n
Click on name of the folder you created on Pinata. This will open a new tab showing all your uploaded JSON files. Copy the URL of this folder.
\n
\n","isPage":false,"text":"\nClick on name of the folder you created on Pinata. This will open a new tab showing all your uploaded JSON files. Copy the URL of this folder.\n\n","title":"Step 4: Get the Folder URL","titles":["How to Manage Item Metadata in Sequence Builder"]},"329":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-5-set-up-on-sequence-builder","html":"\n
Navigate to Sequence Builder, set up your account, and create your project on the network of your choice. In the Contracts section, click on "Deploy New Contract".
\n
\n","isPage":false,"text":"\nNavigate to Sequence Builder, set up your account, and create your project on the network of your choice. In the Contracts section, click on "Deploy New Contract".\n\n","title":"Step 5: Set Up on Sequence Builder","titles":["How to Manage Item Metadata in Sequence Builder"]},"330":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-6-deploy-your-contract","html":"\n
Select "Web3 Game Item Collection (ERC-1155)" and name your contract. Sequence Builder will automatically deploy your contract on-chain.
\n
\n","isPage":false,"text":"\nSelect "Web3 Game Item Collection (ERC-1155)" and name your contract. Sequence Builder will automatically deploy your contract on-chain.\n\n","title":"Step 6: Deploy Your Contract","titles":["How to Manage Item Metadata in Sequence Builder"]},"331":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-7-move-to-contract-details","html":"\n
Once you sign the transaction, your contract is ready! Click on it to view the details screen.
\n
\n","isPage":false,"text":"\nOnce you sign the transaction, your contract is ready! Click on it to view the details screen.\n\n","title":"Step 7: Move to Contract Details","titles":["How to Manage Item Metadata in Sequence Builder"]},"332":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-8-update-contract-attributes","html":"\n
Navigate to the “Write Contract” section. This is where you can modify attributes of your freshly deployed ERC-1155 contract. Two methods are what you should focus on for now:
\n
\n
setBaseMetadataURI allows the creator to set the base metadata URL for this contract. You want this to point to the JSON files you’ve created, depending on NFT ID.
\n
mint mints one of your tokens and sends it to an address of your choosing.
\n
\n","isPage":false,"text":"\nNavigate to the “Write Contract” section. This is where you can modify attributes of your freshly deployed ERC-1155 contract. Two methods are what you should focus on for now:\n\nsetBaseMetadataURI allows the creator to set the base metadata URL for this contract. You want this to point to the JSON files you’ve created, depending on NFT ID.\nmint mints one of your tokens and sends it to an address of your choosing.\n\n","title":"Step 8: Update Contract Attributes","titles":["How to Manage Item Metadata in Sequence Builder"]},"333":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-9-set-the-base-metadata-uri","html":"\n
Scroll to setBaseMetadataURI, expand it, and under tokenBaseURI paste the URL for the JSON folder preview you got from Pinata earlier. It should look something like this:
Click “Write” and you will be prompted to sign again. This will modify the contract on chain to set the metadata base. Essentially any token ID you provide will be appended to this URL, along with the .json suffix. So if you mint token ID 123, it will look for tokenBaseURI + 123.json.
\n
\n","isPage":false,"text":"\nScroll to setBaseMetadataURI, expand it, and under tokenBaseURI paste the URL for the JSON folder preview you got from Pinata earlier. It should look something like this:\nhttps://azure-wooden-lemur-911.mypinata.cloud/ipfs/QmW5gvYGWb98GsN8VjTRWu4pLn6jryEXNxZKNWpPhVwtDm/\nClick “Write” and you will be prompted to sign again. This will modify the contract on chain to set the metadata base. Essentially any token ID you provide will be appended to this URL, along with the .json suffix. So if you mint token ID 123, it will look for tokenBaseURI + 123.json.\n\n","title":"Step 9: Set the Base Metadata URI","titles":["How to Manage Item Metadata in Sequence Builder"]},"334":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-10-minting-time","html":"\n
Finally, it's time to mint! Scroll up to mint, expand it, and fill in the details:
\n
\n
to (address): This is the address that the token will be sent to. Use your Sequence wallet address or any other valid address.
\n
tokenId (uint256): This is your token ID. As long as you have a tokenId.json file already uploaded to pinata.cloud under the folder, it will work.
\n
amount (uint256): The number of tokens to mint (usually 1).
\n
data (bytes): Enter 0x00 for this simple process.
\n
\n
\n","isPage":false,"text":"\nFinally, it's time to mint! Scroll up to mint, expand it, and fill in the details:\n\nto (address): This is the address that the token will be sent to. Use your Sequence wallet address or any other valid address.\ntokenId (uint256): This is your token ID. As long as you have a tokenId.json file already uploaded to pinata.cloud under the folder, it will work.\namount (uint256): The number of tokens to mint (usually 1).\ndata (bytes): Enter 0x00 for this simple process.\n\n\n","title":"Step 10: Minting Time","titles":["How to Manage Item Metadata in Sequence Builder"]},"335":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-11-finalize-and-admire","html":"\n
Click "Write" and sign the transaction. Congratulations, you've just minted a token! Head over to the "Tokens" section to see your minted tokens with their names and images.
\n
\n","isPage":false,"text":"\nClick "Write" and sign the transaction. Congratulations, you've just minted a token! Head over to the "Tokens" section to see your minted tokens with their names and images.\n\n","title":"Step 11: Finalize and Admire","titles":["How to Manage Item Metadata in Sequence Builder"]},"336":{"href":"/solutions/collectibles/metadata/800-manage-metadata-builder#step-12-updating-metadata","html":"\n
If you make mistakes with the token metadata, you can always update it and then call the Sequence Metadata refresh endpoint to reload the specific tokens:
\n
curl -X GET "https://metadata.sequence.app/tokens/mumbai/0xb392c99d9f8e3e0b248e5c283818be5bf5cecca7/1/refresh"
\n
This is in the format: https://metadata.sequence.app/tokens/<chain-name>/<contract-address>/<token-id>/refresh
","isPage":false,"text":"\nIf you make mistakes with the token metadata, you can always update it and then call the Sequence Metadata refresh endpoint to reload the specific tokens:\ncurl -X GET "https://metadata.sequence.app/tokens/mumbai/0xb392c99d9f8e3e0b248e5c283818be5bf5cecca7/1/refresh"\nThis is in the format: https://metadata.sequence.app/tokens/<chain-name>/<contract-address>/<token-id>/refresh\nNow that you are ready to mint, you might want to read about how you can launch your own serverless endpoint for securely minting tokens.","title":"Step 12: Updating Metadata","titles":["How to Manage Item Metadata in Sequence Builder"]},"337":{"href":"/solutions/marketplaces/orderbook/02-quickstart#quickstart","html":"\n","isPage":true,"text":"\n","title":"Quickstart","titles":[]},"338":{"href":"/solutions/marketplaces/orderbook/02-quickstart#try-a-demo","html":"\n\n","isPage":false,"text":"\nCheck out our demo to see a custom marketplace in action.\n","title":"Try a Demo","titles":["Quickstart"]},"339":{"href":"/solutions/marketplaces/orderbook/02-quickstart#template","html":"\n\n","isPage":false,"text":"\nGet started quickly with a template leveraging our Marketplace API.\n","title":"Template","titles":["Quickstart"]},"340":{"href":"/solutions/marketplaces/orderbook/02-quickstart#try-an-api-call","html":"\n
Sequence Wallet allows users to purchase cryptocurrencies directly with their credit card and debit card via on-ramp providers. Currently Sequence supports 6 on-ramp providers;
Only providers that support the region the users are in will be displayed.
\n
\n
As a developer integrating the Sequence Wallet, you can choose which payment provider can be visible to users. You can also specify which token will be available to purchase via the on-ramp providers.
","isPage":true,"text":"\nSequence Wallet allows users to purchase cryptocurrencies directly with their credit card and debit card via on-ramp providers. Currently Sequence supports 6 on-ramp providers;\n\nMoonpay\nRamp\nUPI via Onmeta\nSardine\nPayTrie\n\nOnly providers that support the region the users are in will be displayed.\n\nAs a developer integrating the Sequence Wallet, you can choose which payment provider can be visible to users. You can also specify which token will be available to purchase via the on-ramp providers.\nTo learn more on how to configure the on-ramp options, see Sequence Connect Options.","title":"Fiat On-Ramps","titles":[]},"342":{"href":"/solutions/technical-references/wallet-contracts/01-why#why-smart-contracts-wallets","html":"\n
Ethereum wallets may take two different forms, Externally owned accounts (EOAs) or Smart Contract Wallets.\nThe Sequence wallet is implemented as a smart contract, which allows the system to provide additional security and functionality.
\n","isPage":true,"text":"\nEthereum wallets may take two different forms, Externally owned accounts (EOAs) or Smart Contract Wallets.\nThe Sequence wallet is implemented as a smart contract, which allows the system to provide additional security and functionality.\n","title":"Why smart contracts wallets?","titles":[]},"343":{"href":"/solutions/technical-references/wallet-contracts/01-why#externally-owned-accounts","html":"\n
Externally owned accounts are the most primitive form of wallet on Ethereum; EOAs are accounts composed of a single ECDSA key pair.
\n","isPage":false,"text":"\nExternally owned accounts are the most primitive form of wallet on Ethereum; EOAs are accounts composed of a single ECDSA key pair.\n","title":"Externally owned accounts","titles":["Why smart contracts wallets?"]},"344":{"href":"/solutions/technical-references/wallet-contracts/01-why#pros","html":"\n
\n
Simple to implement
\n
Cheap to use (in some scenarios)
\n
Easy to backup
\n
\n","isPage":false,"text":"\n\nSimple to implement\nCheap to use (in some scenarios)\nEasy to backup\n\n","title":"Pros","titles":["Why smart contracts wallets?","Externally owned accounts"]},"345":{"href":"/solutions/technical-references/wallet-contracts/01-why#popular-examples","html":"\n
Smart contract wallets are wallets that are implemented as smart contracts; it allows the wallets to implement arbitrary logic within the bounds of what's supported by the underlying virtual machine.\nBecause of this, these contracts can implement functionality that's not available for EOAs, and can also be upgraded if they are prepared to do so.
\n","isPage":false,"text":"\nSmart contract wallets are wallets that are implemented as smart contracts; it allows the wallets to implement arbitrary logic within the bounds of what's supported by the underlying virtual machine.\nBecause of this, these contracts can implement functionality that's not available for EOAs, and can also be upgraded if they are prepared to do so.\n","title":"Smart contract wallets","titles":["Why smart contracts wallets?"]},"347":{"href":"/solutions/technical-references/wallet-contracts/01-why#pros-1","html":"\n
Sequence Embedded Wallet (or Wallet-as-a-Service) enables the creation, management and usage of fully functional EVM compatible wallets. These wallets can be created on-demand for each user and allow you to integrate an application with an Ethereum compatible blockchain, while using familiar constructions like RPC APIs.
\n
Sequence Embedded Wallet offers real non-custodial wallets and the system guarantees that each created wallet can only be accessed with the consent of the owner of the wallet.
\n","isPage":true,"text":"\nSequence Embedded Wallet (or Wallet-as-a-Service) enables the creation, management and usage of fully functional EVM compatible wallets. These wallets can be created on-demand for each user and allow you to integrate an application with an Ethereum compatible blockchain, while using familiar constructions like RPC APIs.\nSequence Embedded Wallet offers real non-custodial wallets and the system guarantees that each created wallet can only be accessed with the consent of the owner of the wallet.\n","title":"Sequence Embedded Wallet","titles":[]},"350":{"href":"/solutions/wallets/embedded-wallet/01-overview#architecture-overview","html":"\n
Sequence Embedded Wallets are native smart contract multisigs, the configuration of the multisig can be seen as a 2/2, both of which are required to sign in order to operate them; each one of the signers protects the wallet from a different facet of possible threats.
\n","isPage":false,"text":"\nSequence Embedded Wallets are native smart contract multisigs, the configuration of the multisig can be seen as a 2/2, both of which are required to sign in order to operate them; each one of the signers protects the wallet from a different facet of possible threats.\n","title":"Architecture overview","titles":["Sequence Embedded Wallet"]},"351":{"href":"/solutions/wallets/embedded-wallet/01-overview#signer-1-sequence-auth","html":"\n
Sequence Auth provides a simple way to add account creation, login, session management, and wallet support to your app, enabling applications to provide traditional web experiences (e.g. social login, email login, etc.) while providing access to crypto wallets to interact with smart contracts.
\n
All user and session data is encrypted by a Hardware Security Module operated by a third party. This makes it protected from both external attackers and internal access by Sequence Team or anyone else. Nobody can access a user's wallet but the user themselves.
\n
You won't need to trust us, this is a guarantee you can verify yourself: this service is hosted in a cryptographically attested secure enclave on Amazon Nitro platform. And we offer publicly available independently audited source code, so you can rest assured that it hasn't been tampered with.
\n","isPage":false,"text":"\nSequence Auth provides a simple way to add account creation, login, session management, and wallet support to your app, enabling applications to provide traditional web experiences (e.g. social login, email login, etc.) while providing access to crypto wallets to interact with smart contracts.\nAll user and session data is encrypted by a Hardware Security Module operated by a third party. This makes it protected from both external attackers and internal access by Sequence Team or anyone else. Nobody can access a user's wallet but the user themselves.\nYou won't need to trust us, this is a guarantee you can verify yourself: this service is hosted in a cryptographically attested secure enclave on Amazon Nitro platform. And we offer publicly available independently audited source code, so you can rest assured that it hasn't been tampered with.\n","title":"Signer 1: Sequence Auth","titles":["Sequence Embedded Wallet","Architecture overview"]},"352":{"href":"/solutions/wallets/embedded-wallet/01-overview#signer-2-sequence-guard","html":"\n
Sequence Guard is a service hosted by Sequence and contains the other key of the wallets. It's meant to be another line of defense, verifying not only user's identity but also their intent. It achieves this in two different ways:
\n
1 - Limits and allowlists: you can (from the development dashboard) configure what kind of actions are allowed, this means that the guard will only sign transactions within these constraints. For example, you can define that only NFT contract X can be called, and the guard will enforce that no other transactions can take place.
\n
2 - Authenticating the user: the Sequence Guard will authenticate the user independently of the Sequence Auth, it performs this action either by using a 3rd party OAuth 2.0 id token (from Meta, Google, X, etc.) or by directly communicating with the user via email/phone number with an OTP code. The direct communication is not always required and, when it does happen, it's seamless and branded with your project details.
\n","isPage":false,"text":"\nSequence Guard is a service hosted by Sequence and contains the other key of the wallets. It's meant to be another line of defense, verifying not only user's identity but also their intent. It achieves this in two different ways:\n1 - Limits and allowlists: you can (from the development dashboard) configure what kind of actions are allowed, this means that the guard will only sign transactions within these constraints. For example, you can define that only NFT contract X can be called, and the guard will enforce that no other transactions can take place.\n2 - Authenticating the user: the Sequence Guard will authenticate the user independently of the Sequence Auth, it performs this action either by using a 3rd party OAuth 2.0 id token (from Meta, Google, X, etc.) or by directly communicating with the user via email/phone number with an OTP code. The direct communication is not always required and, when it does happen, it's seamless and branded with your project details.\n","title":"Signer 2: Sequence Guard","titles":["Sequence Embedded Wallet","Architecture overview"]},"353":{"href":"/solutions/wallets/embedded-wallet/01-overview#threat-model","html":"\n
With these safeguards in place wallets are safe against the following scenarios:
\n\n
\n
Sequence.app backend is compromised, or guard keys are leaked: in this scenario, the user's identity must still be verified by Sequence Auth.
\n
\n
\n
Sequence Auth is compromised: in this scenario the Sequence Guard protects the wallets, because it independently authenticates the user, an attacker in this scenario wouldn't be able to access any wallets.
\n
\n\n
The model also provides partial protection against the scenario:
\n\n
Partner frontend is compromised, or MITM on the partner side: If an attacker were to be able to vulnerate the frontend of the partner, it could gain access to wallets at the time of login, but it cannot gain access to wallets of users who are currently inactive. This means that recovery from such a scenario is possible, with limited damage.
\n","isPage":false,"text":"\nWith these safeguards in place wallets are safe against the following scenarios:\n\n\nSequence.app backend is compromised, or guard keys are leaked: in this scenario, the user's identity must still be verified by Sequence Auth.\n\n\nSequence Auth is compromised: in this scenario the Sequence Guard protects the wallets, because it independently authenticates the user, an attacker in this scenario wouldn't be able to access any wallets.\n\n\nThe model also provides partial protection against the scenario:\n\nPartner frontend is compromised, or MITM on the partner side: If an attacker were to be able to vulnerate the frontend of the partner, it could gain access to wallets at the time of login, but it cannot gain access to wallets of users who are currently inactive. This means that recovery from such a scenario is possible, with limited damage.\n","title":"Threat model","titles":["Sequence Embedded Wallet"]},"354":{"href":"/solutions/wallets/embedded-wallet/02-quickstart#quickstart","html":"\n","isPage":true,"text":"\n","title":"Quickstart","titles":[]},"355":{"href":"/solutions/wallets/embedded-wallet/02-quickstart#try-a-demo","html":"\n\n","isPage":false,"text":"\nTry out seamless UX of our embedded wallet at our demo\n","title":"Try a Demo","titles":["Quickstart"]},"356":{"href":"/solutions/wallets/embedded-wallet/02-quickstart#template","html":"\n\n","isPage":false,"text":"\nGet started quickly with a template leveraging our embedded wallet.\n","title":"Template","titles":["Quickstart"]},"357":{"href":"/solutions/wallets/embedded-wallet/02-quickstart#getting-started","html":"\n","isPage":false,"text":"\n","title":"Getting Started","titles":["Quickstart"]},"358":{"href":"/solutions/wallets/embedded-wallet/02-quickstart#sdk-installation","html":"\n
We provide TypeScript and Unity SDKs for the Embedded Wallet authentication system. You can install the TypeScript SDK with:
\n
pnpm install @0xsequence/waas
\n
For more information on the Unity Embedded Wallet SDK, please refer to the TODO add link Unity SDK documentation
\n","isPage":false,"text":"\nWe provide TypeScript and Unity SDKs for the Embedded Wallet authentication system. You can install the TypeScript SDK with:\npnpm install @0xsequence/waas\nFor more information on the Unity Embedded Wallet SDK, please refer to the TODO add link Unity SDK documentation\n","title":"SDK Installation","titles":["Quickstart","Getting Started"]},"359":{"href":"/solutions/wallets/embedded-wallet/02-quickstart#project-setup","html":"\n
Sequence Embedded Wallet is currently only available as a closed beta. To start using the Embedded Wallet SDKs, you'll need to contact the Sequence team and acquire API credentials. Once this is done, you will be provided with two keys:
\n
\n
Project access key
\n
Embedded Wallet configuration key
\n
\n","isPage":false,"text":"\nSequence Embedded Wallet is currently only available as a closed beta. To start using the Embedded Wallet SDKs, you'll need to contact the Sequence team and acquire API credentials. Once this is done, you will be provided with two keys:\n\nProject access key\nEmbedded Wallet configuration key\n\n","title":"Project Setup","titles":["Quickstart","Getting Started"]},"360":{"href":"/solutions/wallets/embedded-wallet/02-quickstart#library-setup","html":"\n
To start using Sequence Embedded Wallet SDK, you'll need to create a new instance of the waas class:
\n
import { SequenceWaaS } from "@0xsequence/waas";\n\nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);
\n
Note that the library is operational, but it can't be used to interact with any wallet until you have authenticated as a user.
","isPage":false,"text":"\nTo start using Sequence Embedded Wallet SDK, you'll need to create a new instance of the waas class:\nimport { SequenceWaaS } from "@0xsequence/waas";\n \nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\nNote that the library is operational, but it can't be used to interact with any wallet until you have authenticated as a user.","title":"Library Setup","titles":["Quickstart","Getting Started"]},"361":{"href":"/solutions/wallets/universal-wallet/02-quickstart#quickstart","html":"\n","isPage":true,"text":"\n","title":"Quickstart","titles":[]},"362":{"href":"/solutions/wallets/universal-wallet/02-quickstart#try-a-demo","html":"\n\n","isPage":false,"text":"\nTry out the Universal Wallet leveraging SequenceKit at our demo\n","title":"Try a Demo","titles":["Quickstart"]},"363":{"href":"/solutions/wallets/universal-wallet/02-quickstart#template","html":"\n\n","isPage":false,"text":"\nGet started quickly with a template using SequenceKit\n","title":"Template","titles":["Quickstart"]},"364":{"href":"/solutions/wallets/universal-wallet/02-quickstart#install","html":"\n
The sequence.js SDK is composed of several sub-packages combined into a single meta-package called 0xsequence.\nTo add the SDK to your project, add a dependency on 0xsequence to your package.json:
\n
npm install 0xsequence ethers
\n
or
\n
pnpm install 0xsequence ethers
\n
or
\n
yarn add 0xsequence ethers
\n
If you know that your project only requires specific sub-packages, you can also depend on those directly with\nnpm add @0xsequence/<sub-package name>.
\n
Your package.json should look something like this (actual version may vary):
\n","isPage":false,"text":"\nThe sequence.js SDK is composed of several sub-packages combined into a single meta-package called 0xsequence.\nTo add the SDK to your project, add a dependency on 0xsequence to your package.json:\nnpm install 0xsequence ethers\nor\npnpm install 0xsequence ethers\nor\nyarn add 0xsequence ethers\nIf you know that your project only requires specific sub-packages, you can also depend on those directly with\nnpm add @0xsequence/<sub-package name>.\nYour package.json should look something like this (actual version may vary):\n{\n "name": "my-dapp",\n ...\n "dependencies": {\n "0xsequence": "^1.0.0",\n "ethers": ^5.7.0"\n ...\n }\n}\n","title":"Install","titles":["Quickstart"]},"365":{"href":"/solutions/wallets/universal-wallet/02-quickstart#cdn-distribution-as-native-js","html":"\n
Optionally, 0xsequence can be installed as a JS script source (UMD distribution) via:
","isPage":false,"text":"\nOptionally, 0xsequence can be installed as a JS script source (UMD distribution) via:\n<script src="https://cdn.ethers.io/lib/ethers-5.7.umd.min.js"></script>\n<script src="https://unpkg.com/0xsequence@latest/dist/0xsequence.umd.min.js"></script>","title":"CDN distribution as native JS","titles":["Quickstart","Install",null]},"366":{"href":"/solutions/wallets/universal-wallet/04-sequence-kit#sequence-kit-seamlessly-integrate-web3-wallets-into-your-applications","html":"\n
Sequence Kit 🧰 is the ultimate toolkit for effortlessly integrating web3 wallets into your applications, providing your users with a smooth and secure onboarding experience. With our robust tools built on the popular wagmi library, unlock a realm of possibilities in the world of web3.
\n","isPage":true,"text":"\nSequence Kit 🧰 is the ultimate toolkit for effortlessly integrating web3 wallets into your applications, providing your users with a smooth and secure onboarding experience. With our robust tools built on the popular wagmi library, unlock a realm of possibilities in the world of web3.\n","title":"Sequence Kit: Seamlessly Integrate Web3 Wallets into Your Applications","titles":[]},"367":{"href":"/solutions/wallets/universal-wallet/04-sequence-kit#key-features","html":"\n
\n
\n
Universal Connections: Seamlessly connect via popular social logins such as Facebook, Google, Discord, and more! Your users will enjoy a smooth, secure onboarding process. 🔐🪪
\n
\n
\n
Web3 Wallet Integration: Effortlessly integrate with leading web3 wallets like WalletConnect and MetaMask. Unleash the power of blockchain with just a few clicks! 🦊 ⛓️
\n
\n
\n
Embedded Wallet Experience: Provide your users with a comprehensive embedded wallet, enabling them to manage their coins and collectibles all within your own application. 👛 🖼️ 🪙
\n
\n
\n
Explore the potential of Sequence Kit by trying out our demo!
\n","isPage":false,"text":"\n\n\nUniversal Connections: Seamlessly connect via popular social logins such as Facebook, Google, Discord, and more! Your users will enjoy a smooth, secure onboarding process. 🔐🪪\n\n\nWeb3 Wallet Integration: Effortlessly integrate with leading web3 wallets like WalletConnect and MetaMask. Unleash the power of blockchain with just a few clicks! 🦊 ⛓️\n\n\nEmbedded Wallet Experience: Provide your users with a comprehensive embedded wallet, enabling them to manage their coins and collectibles all within your own application. 👛 🖼️ 🪙\n\n\nExplore the potential of Sequence Kit by trying out our demo!\n","title":"Key Features","titles":["Sequence Kit: Seamlessly Integrate Web3 Wallets into Your Applications"]},"368":{"href":"/solutions/wallets/universal-wallet/04-sequence-kit#next-steps","html":"\n
Ready to integrate Sequence Kit into your application? Check out our Getting Started guide. If you're already familiar with Sequence Kit dive into the available configuration options or take a look at the checkout.
","isPage":false,"text":"\nReady to integrate Sequence Kit into your application? Check out our Getting Started guide. If you're already familiar with Sequence Kit dive into the available configuration options or take a look at the checkout.","title":"Next Steps","titles":[]},"369":{"href":"/solutions/wallets/universal-wallet/05-platforms#platforms","html":"\n","isPage":true,"text":"\n","title":"Platforms","titles":[]},"370":{"href":"/solutions/wallets/universal-wallet/05-platforms#web-wallet","html":"\n
Sequence works beautifully on all modern Web Browsers! Try it at https://sequence.app from any computer, phone or tablet.
\n","isPage":false,"text":"\nSequence works beautifully on all modern Web Browsers! Try it at https://sequence.app from any computer, phone or tablet.\nSee Build With Sequence to get started.\n","title":"Web Wallet","titles":["Platforms"]},"371":{"href":"/solutions/wallets/universal-wallet/05-platforms#mobile-wallet","html":"\n
Sequence works beautifully on your Mobile Web Browser! Try it at https://sequence.app from any phone or tablet.
\n
This means dapps which integrate the Sequence Wallet will automatically support users on all mobile devices,\nwhile using standard Ethereum web3 dapp-to-wallet communication. See Build With Sequence to get started.
\n","isPage":false,"text":"\nSequence works beautifully on your Mobile Web Browser! Try it at https://sequence.app from any phone or tablet.\nThis means dapps which integrate the Sequence Wallet will automatically support users on all mobile devices,\nwhile using standard Ethereum web3 dapp-to-wallet communication. See Build With Sequence to get started.\n","title":"Mobile Wallet","titles":["Platforms"]},"372":{"href":"/solutions/wallets/universal-wallet/05-platforms#browser-extension-wallet","html":"\n
Sequence Wallet allows users to purchase cryptocurrencies directly with their credit card and debit card via on-ramp providers. Currently Sequence supports 6 on-ramp providers;
Only providers that support the region the users are in will be displayed.
\n
\n
As a developer integrating the Sequence Wallet, you can choose which payment provider can be visible to users. You can also specify which token will be available to purchase via the on-ramp providers.
","isPage":true,"text":"\nSequence Wallet allows users to purchase cryptocurrencies directly with their credit card and debit card via on-ramp providers. Currently Sequence supports 6 on-ramp providers;\n\nMoonpay\nRamp\nUPI via Onmeta\nSardine\nPayTrie\nWyre (deprecated)\n\nOnly providers that support the region the users are in will be displayed.\n\nAs a developer integrating the Sequence Wallet, you can choose which payment provider can be visible to users. You can also specify which token will be available to purchase via the on-ramp providers.\nTo learn more on how to configure the on-ramp options, see Sequence Connect Options.","title":"Fiat On-Ramps","titles":[]},"374":{"href":"/solutions/wallets/universal-wallet/07-key-management#key-management","html":"\n
Each Sequence wallet can be controlled by multiple private keys, acting like a multisignature wallet. Users can either create a Sequence wallet using one of the supported social login options or create a wallet with a private key stored only on that device.
\n
The improved security compared to traditional blockchain wallet comes from the fact that multiple independent keys need to be compromised for a malicious actor to take control of a user’s wallet, instead of a single key. The philosophy is that the more independent private-keys the user adds to their wallet, the more secure their wallet becomes, even if each individual key is only moderately secure on their own.
\n","isPage":true,"text":"\nEach Sequence wallet can be controlled by multiple private keys, acting like a multisignature wallet. Users can either create a Sequence wallet using one of the supported social login options or create a wallet with a private key stored only on that device.\nThe improved security compared to traditional blockchain wallet comes from the fact that multiple independent keys need to be compromised for a malicious actor to take control of a user’s wallet, instead of a single key. The philosophy is that the more independent private-keys the user adds to their wallet, the more secure their wallet becomes, even if each individual key is only moderately secure on their own.\n","title":"Key Management","titles":[]},"375":{"href":"/solutions/wallets/universal-wallet/07-key-management#social-login-wallets","html":"\n
Sequence Wallet created with social logins are currently secured using three private keys: Session keys, a Guard key and a Torus key. The Session key and Torus key are both generated for the first time when a user creates their Sequence Wallet via social login or email authentication.\nAt least two of the three keys are needed to unlock an account. This means that if one of the three keys is lost or compromised, a user can use the two remaining keys to replace the lost/compromised key. For example, if a user lost their device containing their Session Key, they can unlock their Sequence Wallet account by email or social login for the Torus key combined with the Guard key. Once done, another session key is auto-generated and the user is back in their account with all 3 keys accessible again.
\n","isPage":false,"text":"\nSequence Wallet created with social logins are currently secured using three private keys: Session keys, a Guard key and a Torus key. The Session key and Torus key are both generated for the first time when a user creates their Sequence Wallet via social login or email authentication.\nAt least two of the three keys are needed to unlock an account. This means that if one of the three keys is lost or compromised, a user can use the two remaining keys to replace the lost/compromised key. For example, if a user lost their device containing their Session Key, they can unlock their Sequence Wallet account by email or social login for the Torus key combined with the Guard key. Once done, another session key is auto-generated and the user is back in their account with all 3 keys accessible again.\n","title":"Social Login Wallets","titles":["Key Management"]},"376":{"href":"/solutions/wallets/universal-wallet/07-key-management#session-keys","html":"\n
Session keys are stored in the browser's IndexedDB.\nUsers should be prudent in safeguarding their devices from unauthorized access since an attacker with access to their IndexedDB effectively has control of their session key.
\n","isPage":false,"text":"\nSession keys are stored in the browser's IndexedDB.\nUsers should be prudent in safeguarding their devices from unauthorized access since an attacker with access to their IndexedDB effectively has control of their session key.\n","title":"Session Keys","titles":["Key Management","Social Login Wallets"]},"377":{"href":"/solutions/wallets/universal-wallet/07-key-management#guard-key","html":"\n
A Guard key is a key owned by Horizon. This key allows Horizon to help users that lost their Session key and can require additional information from the user in case of suspicious activity, if the user wants this additional protection. This key would be compromised if a malicious actor took control over Horizon servers hosting the Guard key.
\n","isPage":false,"text":"\nA Guard key is a key owned by Horizon. This key allows Horizon to help users that lost their Session key and can require additional information from the user in case of suspicious activity, if the user wants this additional protection. This key would be compromised if a malicious actor took control over Horizon servers hosting the Guard key.\n","title":"Guard Key","titles":["Key Management","Social Login Wallets"]},"378":{"href":"/solutions/wallets/universal-wallet/07-key-management#torus-key","html":"\n
A Torus key is a key generated by the Torus network, and is generated using a user’s email or social login credentials such as Google or AppleID. Torus uses threshold cryptography to ensure that only the user can access their private key, making these keys non-custodial. A Torus key would be compromised if a malicious actor had control over the social account or email a user used to generate their Torus key. All Torus keys could be compromised if the Torus network itself was compromised.
\n
:::info DEFAULTS + CUSTOMIZATION
\n
While this is the default setup for new Sequence Wallets, we intend to add the ability for users to add, remove and replace the keys controlling their wallet such that users can choose their preference in terms of security and user experience tradeoff. Even the Guard key will be able to be removed. Security tips and recommendations will be added to ensure users are well informed of the risks and how to protect themselves against them.
\n
:::
","isPage":false,"text":"\nA Torus key is a key generated by the Torus network, and is generated using a user’s email or social login credentials such as Google or AppleID. Torus uses threshold cryptography to ensure that only the user can access their private key, making these keys non-custodial. A Torus key would be compromised if a malicious actor had control over the social account or email a user used to generate their Torus key. All Torus keys could be compromised if the Torus network itself was compromised.\n:::info DEFAULTS + CUSTOMIZATION\nWhile this is the default setup for new Sequence Wallets, we intend to add the ability for users to add, remove and replace the keys controlling their wallet such that users can choose their preference in terms of security and user experience tradeoff. Even the Guard key will be able to be removed. Security tips and recommendations will be added to ensure users are well informed of the risks and how to protect themselves against them.\n:::","title":"Torus Key","titles":["Key Management","Social Login Wallets"]},"379":{"href":"/solutions/marketplaces/orderbook/examples/05-get-user-activities#getuseractivities","html":"\n
Retrieve activity data for a specific user, including orders and trades.
\n
\n
Request: POST /api/Marketplace/GetUserActivities
\n
Content-Type: application/json
\n
Body (in JSON):\n
\n
orderbookContractAddress (string) -- the address of the protocol contract.
\n
collectionAddress (string) -- the address of the NFT collection.
\n
currencyAddresses (string[]) -- an array of currency contract addresses.
\n
userAddress (string) -- the address of the user whose activities are being queried.
\n
tokenIDs (string[]) -- an array of token IDs to filter the activities by.
\n
\n
\n
Response (in JSON):\n
\n
page\n
\n
page (i32) -- number of the page
\n
pageSize (i32) -- number of orders on the page
\n
more (bool) -- if there are more orders
\n
\n
\n
orders (OrderbookOrder[])\n[\n
\n
orderId (string) -- order id
\n
tokenContract (string) -- the collection contract
\n
tokenId (string) -- the tokenId of the collection in the order
\n
isListing (bool) -- is true if it's a listing for sale, or false if it's an offer
\n
quantity (string) -- the number of tokens the order is for
\n
quantityRemaining (string) -- the number of tokens after the order
\n
currencyAddress (string) -- the currency the token is trading in
\n
pricePerToken (string) -- the price per token
\n
expiry (string) -- the expiry of when the order is no longer valid
\n
orderStatus (OrderStatus) -- the status of the order as an enum fom "OPEN", "CLOSED", "CANCELLED"
\n
createdBy (string) -- the address the order was created by
\n
createdAt (uint64) -- the time the order was created
\n
orderbookContractAddress (string) -- the orderbook contract address\n]
\n
\n
\n
\n
\n
\nExample: GetUserActivities for a user with specific token IDs\n
// Works in both a Webapp (browser) or Node.js:\nimport fetch from "cross-fetch";\n\n(async () => {\n const res = await fetch(\n "https://dev-marketplace-api.sequence.app/arbitrum-sepolia/rpc/Marketplace/GetUserActivities",\n {\n method: "POST",\n headers: {\n "Content-Type": "application/json",\n },\n body: JSON.stringify({\n "orderbookContractAddress": "0xB537a160472183f2150d42EB1c3DD6684A55f74c",\n "collectionAddress": "0x1693ffc74edbb50d6138517fe5cd64fd1c917709",\n "currencyAddresses": [\n "0xa9c88358862211870db6f18bc9b3f6e4f8b3eae7"\n ],\n "userAddress": "0xC2Be9CF6D9ee4fd211f88620760e829792659b16",\n "tokenIDs": ["1"]\n }),\n }\n );\n\n console.log("res", await res.json());\n})();
Please contact our team for assistance with integrations to another target.
","isPage":true,"text":"\nRetrieve activity data for a specific user, including orders and trades.\n\nRequest: POST /api/Marketplace/GetUserActivities\nContent-Type: application/json\nBody (in JSON):\n\norderbookContractAddress (string) -- the address of the protocol contract.\ncollectionAddress (string) -- the address of the NFT collection.\ncurrencyAddresses (string[]) -- an array of currency contract addresses.\nuserAddress (string) -- the address of the user whose activities are being queried.\ntokenIDs (string[]) -- an array of token IDs to filter the activities by.\n\n\nResponse (in JSON):\n\npage\n\npage (i32) -- number of the page\npageSize (i32) -- number of orders on the page\nmore (bool) -- if there are more orders\n\n\norders (OrderbookOrder[])\n[\n\norderId (string) -- order id\ntokenContract (string) -- the collection contract\ntokenId (string) -- the tokenId of the collection in the order\nisListing (bool) -- is true if it's a listing for sale, or false if it's an offer\nquantity (string) -- the number of tokens the order is for\nquantityRemaining (string) -- the number of tokens after the order\ncurrencyAddress (string) -- the currency the token is trading in\npricePerToken (string) -- the price per token\nexpiry (string) -- the expiry of when the order is no longer valid\norderStatus (OrderStatus) -- the status of the order as an enum fom "OPEN", "CLOSED", "CANCELLED"\ncreatedBy (string) -- the address the order was created by\ncreatedAt (uint64) -- the time the order was created\norderbookContractAddress (string) -- the orderbook contract address\n]\n\n\n\n\n\nExample: GetUserActivities for a user with specific token IDs\ncurl -X POST -H "Content-Type: application/json" https://dev-marketplace-api.sequence.app/arbitrum-sepolia/rpc/Marketplace/GetUserActivities -d '{\n "orderbookContractAddress": "0xB537a160472183f2150d42EB1c3DD6684A55f74c",\n "collectionAddress": "0x1693ffc74edbb50d6138517fe5cd64fd1c917709",\n "currencyAddresses": [\n "0xa9c88358862211870db6f18bc9b3f6e4f8b3eae7"\n ],\n "userAddress": "0xC2Be9CF6D9ee4fd211f88620760e829792659b16",\n "tokenIDs": ["1"]\n}'// Works in both a Webapp (browser) or Node.js:\nimport fetch from "cross-fetch";\n \n(async () => {\n const res = await fetch(\n "https://dev-marketplace-api.sequence.app/arbitrum-sepolia/rpc/Marketplace/GetUserActivities",\n {\n method: "POST",\n headers: {\n "Content-Type": "application/json",\n },\n body: JSON.stringify({\n "orderbookContractAddress": "0xB537a160472183f2150d42EB1c3DD6684A55f74c",\n "collectionAddress": "0x1693ffc74edbb50d6138517fe5cd64fd1c917709",\n "currencyAddresses": [\n "0xa9c88358862211870db6f18bc9b3f6e4f8b3eae7"\n ],\n "userAddress": "0xC2Be9CF6D9ee4fd211f88620760e829792659b16",\n "tokenIDs": ["1"]\n }),\n }\n );\n \n console.log("res", await res.json());\n})(); Please contact our team for assistance with integrations to another target.","title":"GetUserActivities","titles":[null]},"380":{"href":"/solutions/marketplaces/orderbook/examples/05-get-user-activities#example-implementation","html":"
With the use of the GetUserActivities api developers can build custom and personalized social or tracking experiences to follow certain users in various interfaces.
","isPage":false,"text":"With the use of the GetUserActivities api developers can build custom and personalized social or tracking experiences to follow certain users in various interfaces.","title":"Example implementation","titles":[null,"GetUserActivities"]},"381":{"href":"/solutions/technical-references/internals/v1/04-wallet-configuration#wallet-configuration","html":"\n
Every Sequence wallet has a configuration defined by a threshold and a list of signers with their corresponding weights.
\n","isPage":true,"text":"\nEvery Sequence wallet has a configuration defined by a threshold and a list of signers with their corresponding weights.\n","title":"Wallet Configuration","titles":[]},"382":{"href":"/solutions/technical-references/internals/v1/04-wallet-configuration#configuration-layout","html":"\n
Name
Type
Range
Description
Threshold
uint16
1 - 65535
Required combined total "weight" of signers for a signature to be considered valid.
Signers
signer[]
unlimited - bounded by gas
List of signers that with their corresponding "weight"s.
\n","isPage":false,"text":"\nNameTypeRangeDescriptionThresholduint161 - 65535Required combined total "weight" of signers for a signature to be considered valid.Signerssigner[]unlimited - bounded by gasList of signers that with their corresponding "weight"s.\n","title":"Configuration layout","titles":["Wallet Configuration"]},"383":{"href":"/solutions/technical-references/internals/v1/04-wallet-configuration#signer-layout","html":"\n
Name
Type
Range
Description
"weight"
uint8
0 - 255
"weight" of every signature of the signer.
"address"
"address"
--
"address" of the signer, it may be an EOA or another smart contract wallet with EIP-1271 support.
\n","isPage":false,"text":"\nNameTypeRangeDescription"weight"uint80 - 255"weight" of every signature of the signer."address""address"--"address" of the signer, it may be an EOA or another smart contract wallet with EIP-1271 support.\n","title":"Signer layout","titles":["Wallet Configuration","Configuration layout"]},"384":{"href":"/solutions/technical-references/internals/v1/04-wallet-configuration#example","html":"\n
Any combination of signers with a combined weight under the threshold is considered invalid; any additional signers above the threshold are ignored.
\n","isPage":false,"text":"\n- 0x4fbf69aa2a75f9942a768dc8da7804ec965f7bea & 0x596af90cecdbf9a768886e771178fd5561dd27ab - combined weight of 2 + 3 = 5\n- 0x6192e0fdcd868b3de01c7fbc0ad98baebd7330c1 & 0x596af90cecdbf9a768886e771178fd5561dd27ab - combined weight of 2 + 3 = 5\n- 0x4fbf69aa2a75f9942a768dc8da7804ec965f7bea, 0x6192e0fdcd868b3de01c7fbc0ad98baebd7330c1 & 0xec9a7204a43d3f4a82c84fde92d25bfc9110981e - combined weight of 2 + 2 + 1 = 5\nAny combination of signers with a combined weight under the threshold is considered invalid; any additional signers above the threshold are ignored.\n","title":"The valid combinations of signers are:","titles":["Wallet Configuration","Configuration layout","Signer layout"]},"386":{"href":"/solutions/technical-references/internals/v1/04-wallet-configuration#configuration-hash---imagehash","html":"\n
The configuration is never stored directly on the contract, but instead is hashed and checked against every time a signature is validated. This allows the wallet contracts to reduce the usage of storage and therefore the gas cost.
\n
Wallets that never have been updated don't store the imageHash directly, instead the imageHash is used as the salt during the contract creation, and signatures are validated against the address of the wallet.
\n","isPage":false,"text":"\nThe configuration is never stored directly on the contract, but instead is hashed and checked against every time a signature is validated. This allows the wallet contracts to reduce the usage of storage and therefore the gas cost.\nWallets that never have been updated don't store the imageHash directly, instead the imageHash is used as the salt during the contract creation, and signatures are validated against the address of the wallet.\n","title":"Configuration hash - ImageHash","titles":["Wallet Configuration","Configuration layout"]},"387":{"href":"/solutions/technical-references/internals/v1/04-wallet-configuration#compute-image-hash","html":"\n
The initial wallet configuration determines the address of the wallet, subsequent updates don't change the address.
\n
The wallet address can be computed using the imageHash, the factory and mainModule of the wallet.
\n","isPage":false,"text":"\nThe initial wallet configuration determines the address of the wallet, subsequent updates don't change the address.\nThe wallet address can be computed using the imageHash, the factory and mainModule of the wallet.\n","title":"Initial wallet configuration","titles":["Wallet Configuration"]},"389":{"href":"/solutions/technical-references/internals/v1/04-wallet-configuration#compute-wallet-address","html":"\n
// The code of the wallet proxy contract\nconst WalletProxyBytecode =\n"0x603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3";\n\n// These values are defined by the wallet context\n// they must be known in order to validate the counter-factual wallet imageHash\nconst factory = "0xf9D09D634Fb818b05149329C1dcCFAeA53639d96";\nconst mainModule = "0xd01F11855bCcb95f88D7A48492F66410d4637313";\n\n// Append the `mainModule` to the `WalletProxyBytecode`\n// this completed the creation code of the proxy contract\n// used for computing the wallet address as defined by the CREATE2 opcode\nconst codeHash = ethers.utils.keccak256(\nethers.utils.solidityPack(\n["bytes", "bytes32"],\n[WalletContractBytecode, ethers.utils.hexZeroPad(mainModule, 32)]\n)\n);\n\n// Compute the wallet address\nconst hash = ethers.utils.keccak256(\nethers.utils.solidityPack(\n["bytes1", "address", "bytes32", "bytes32"],\n["0xff", factory, salt, codeHash]\n)\n);\n\nconst address = ethers.utils.getAddress(ethers.utils.hexDataSlice(hash, 12));
","isPage":false,"text":"\n// The code of the wallet proxy contract\nconst WalletProxyBytecode =\n"0x603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3";\n \n// These values are defined by the wallet context\n// they must be known in order to validate the counter-factual wallet imageHash\nconst factory = "0xf9D09D634Fb818b05149329C1dcCFAeA53639d96";\nconst mainModule = "0xd01F11855bCcb95f88D7A48492F66410d4637313";\n \n// Append the `mainModule` to the `WalletProxyBytecode`\n// this completed the creation code of the proxy contract\n// used for computing the wallet address as defined by the CREATE2 opcode\nconst codeHash = ethers.utils.keccak256(\nethers.utils.solidityPack(\n["bytes", "bytes32"],\n[WalletContractBytecode, ethers.utils.hexZeroPad(mainModule, 32)]\n)\n);\n \n// Compute the wallet address\nconst hash = ethers.utils.keccak256(\nethers.utils.solidityPack(\n["bytes1", "address", "bytes32", "bytes32"],\n["0xff", factory, salt, codeHash]\n)\n);\n \nconst address = ethers.utils.getAddress(ethers.utils.hexDataSlice(hash, 12));","title":"Compute wallet address","titles":["Wallet Configuration","Initial wallet configuration","Configuration hash - ImageHash"]},"390":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#modules--wallet-update","html":"\n
Sequence modules are the underlying program implementation of the wallets; wallets can change modules at runtime.
\n
The MainModule is the initial module of every Sequence wallet; it differs from the other modules because it doesn't store the set of signers on contract storage; it uses the salt provided to the Factory contract.
\n","isPage":true,"text":"\nSequence modules are the underlying program implementation of the wallets; wallets can change modules at runtime.\nThe MainModule is the initial module of every Sequence wallet; it differs from the other modules because it doesn't store the set of signers on contract storage; it uses the salt provided to the Factory contract.\n","title":"Modules & wallet update","titles":[]},"391":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#wallet-implementation","html":"\n
Sequence modules can be assigned to wallets either by the factory or by updating it after the initial deployment. Only one module can be assigned to a wallet at a time.
\n","isPage":false,"text":"\nSequence modules can be assigned to wallets either by the factory or by updating it after the initial deployment. Only one module can be assigned to a wallet at a time.\n","title":"Wallet implementation","titles":["Modules & wallet update"]},"392":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#_updateconfiguration","html":"\n
The updateImplementation allows to update the underlying implementation of the wallet proxy. This implementation contains all the core code that defines the wallet's behaviour.
\n
:::warning Dangerous operation\nCalling updateImplementation with an invalid implementation will result in the corruption of the wallet.
\n
Corrupt wallets may lead to the loss of funds.\n:::
\n
function updateImplementation(\n address _implementation\n) external override onlySelf {
\n","isPage":false,"text":"\nThe updateImplementation allows to update the underlying implementation of the wallet proxy. This implementation contains all the core code that defines the wallet's behaviour.\n:::warning Dangerous operation\nCalling updateImplementation with an invalid implementation will result in the corruption of the wallet.\nCorrupt wallets may lead to the loss of funds.\n:::\nfunction updateImplementation(\n address _implementation\n) external override onlySelf {\n","title":"_updateConfiguration","titles":["Modules & wallet update","Wallet implementation"]},"393":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#parameters","html":"\n
Name
Type
Description
_implementation
address
Address of the new wallet implementation.
\n
This method has the onlySelf modifier, which means that it can only be called by the wallet itself using a self-referencing transaction. Calls to this method coming from other addresses, even if these addresses are signers of the wallet, will be rejected.
\n","isPage":false,"text":"\nNameTypeDescription_implementationaddressAddress of the new wallet implementation.\nThis method has the onlySelf modifier, which means that it can only be called by the wallet itself using a self-referencing transaction. Calls to this method coming from other addresses, even if these addresses are signers of the wallet, will be rejected.\n","title":"Parameters:","titles":["Modules & wallet update","Wallet implementation","_updateConfiguration"]},"394":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#reading-current-implementation","html":"\n
The wallet implementation is stored on the contract storage slot defined by the address of the wallet itself. Given that every wallet has a unique address, the implementation slot varies from wallet to wallet.
\n","isPage":false,"text":"\nThe wallet implementation is stored on the contract storage slot defined by the address of the wallet itself. Given that every wallet has a unique address, the implementation slot varies from wallet to wallet.\nimport "ethers"\n \nconst address = "0x596af90cecdbf9a768886e771178fd5561dd27ab"\nconst provider = new ethers.providers.JsonRpcProvider("http://localhost:8545")\n \n// Read storage slot address(address)\nconst slot = await provider.getStorageAt(address, ethers.utils.defaultAbiCoder.encode(['address'], [address]))\n \n// Decode bytes32 as address value\nconst implementation = ethers.utils.defaultAbiCoder.decode(['address'], slot)[0]\n \nconsole.log(implementation)\n","title":"Reading current implementation","titles":["Modules & wallet update","Wallet implementation"]},"395":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#wallet-configuration-validation","html":"\n
:::info Fixed configuration\nSigner's configuration on wallets using MainModule can't be changed. The only way to change the set of signers or threshold is by updating the module of the wallet.\n:::
\n
All sequence modules must implement the ModuleAuth interface, this interface allows the rest of the module to validate signatures for the wallet. In the case of MainModule this interface is implemented as a counter-factual validation of hash passed to the factory during the contract wallet creation.
\n","isPage":false,"text":"\n:::info Fixed configuration\nSigner's configuration on wallets using MainModule can't be changed. The only way to change the set of signers or threshold is by updating the module of the wallet.\n:::\nAll sequence modules must implement the ModuleAuth interface, this interface allows the rest of the module to validate signatures for the wallet. In the case of MainModule this interface is implemented as a counter-factual validation of hash passed to the factory during the contract wallet creation.\n","title":"Wallet configuration validation","titles":["Modules & wallet update"]},"396":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#_isvalidimage","html":"\n
Validates if the provided imageHash corresponds to the one configured in the wallet. This function is called internally to validate transaction and message signatures.
\n
The imageHash is a hash of the wallet configuration, which contains the wallet's threshold, signers and weights.
\n","isPage":false,"text":"\n function _isValidImage(\n bytes32 _imageHash\n ) internal override view returns (bool _isValid)\nValidates if the provided imageHash corresponds to the one configured in the wallet. This function is called internally to validate transaction and message signatures.\nThe imageHash is a hash of the wallet configuration, which contains the wallet's threshold, signers and weights.\n","title":"_isValidImage","titles":["Modules & wallet update","Wallet configuration validation"]},"397":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#parameters-1","html":"\n
Name
Type
Description
_imageHash
bytes32
Hash of wallet configuration to be validated.
\n","isPage":false,"text":"\nNameTypeDescription_imageHashbytes32Hash of wallet configuration to be validated.\n","title":"Parameters:","titles":["Modules & wallet update","Wallet configuration validation","_isValidImage"]},"398":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#return-values","html":"\n
Name
Type
Description
_isValid
bool
True if the given imageHash corresponds to the current wallet configuration.
\n","isPage":false,"text":"\nNameTypeDescription_isValidboolTrue if the given imageHash corresponds to the current wallet configuration.\n","title":"Return Values:","titles":["Modules & wallet update","Wallet configuration validation","_isValidImage"]},"399":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#mainmoduleupgradeable","html":"\n
MainModuleUpgradable is a module that mimics the behaviour of the MainModule but allows the wallet configuration to be updated.
\n","isPage":false,"text":"\nMainModuleUpgradable is a module that mimics the behaviour of the MainModule but allows the wallet configuration to be updated.\n","title":"MainModuleUpgradeable","titles":["Modules & wallet update"]},"400":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#updateimagehash","html":"\n
Updates the wallet imageHash, this is the hash that defines the wallet configuration (signers, weights, threshold).
\n
function updateImageHash(\n bytes32 _imageHash\n ) external override onlySelf {
\n","isPage":false,"text":"\nUpdates the wallet imageHash, this is the hash that defines the wallet configuration (signers, weights, threshold).\n function updateImageHash(\n bytes32 _imageHash\n ) external override onlySelf {\n","title":"updateImageHash","titles":["Modules & wallet update","MainModuleUpgradeable"]},"401":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#parameters-2","html":"\n
Name
Type
Description
_imageHash
bytes32
Hash of the new configuration for the wallet.
\n
:::caution Unsanitized input\nThe imageHash is not validated, it is the responsibility of the caller to ensure that the hash is correct. Reasons for incorrect hashes include:
\n
\n
The combined weight of the signers is below the threshold.
\n
The signers are not valid addresses.
\n
The signers are smart contract wallets without proper support for EIP-1271.
\n
The imageHash doesn't correspond to any wallet configuration (may be a random string).
\n
The imageHash corresponds to an unknown wallet configuration.
\n
\n
In any of this cases the wallet will be rendered unusable.\n:::
\n
This method has the onlySelf modifier, which means that it can only be called by the wallet itself using a self-referencing transaction. Calls to this method coming from other addresses, even if these addresses are signers of the wallet, will be rejected.
\n","isPage":false,"text":"\nNameTypeDescription_imageHashbytes32Hash of the new configuration for the wallet.\n:::caution Unsanitized input\nThe imageHash is not validated, it is the responsibility of the caller to ensure that the hash is correct. Reasons for incorrect hashes include:\n\nThe combined weight of the signers is below the threshold.\nThe signers are not valid addresses.\nThe signers are smart contract wallets without proper support for EIP-1271.\nThe imageHash doesn't correspond to any wallet configuration (may be a random string).\nThe imageHash corresponds to an unknown wallet configuration.\n\nIn any of this cases the wallet will be rendered unusable.\n:::\nThis method has the onlySelf modifier, which means that it can only be called by the wallet itself using a self-referencing transaction. Calls to this method coming from other addresses, even if these addresses are signers of the wallet, will be rejected.\n","title":"Parameters:","titles":["Modules & wallet update","MainModuleUpgradeable","updateImageHash"]},"402":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#first-configuration-update","html":"\n
When Sequence wallets are created, the factory contract doesn't call an initialize function. The configuration is instead defined by the salt provided to the factory, the MainModule then checks the counterfactual validity of all signatures against the wallet address.
\n
This means there is no direct way to update the configuration of a wallet while still using the MainModule. Given that the first configuration update needs to also change the wallet implementation to the MainModuleUpgradable, the MainModule is updated to the MainModuleUpgradable and the updateImageHash method is called to update the wallet configuration.
\n","isPage":false,"text":"\nWhen Sequence wallets are created, the factory contract doesn't call an initialize function. The configuration is instead defined by the salt provided to the factory, the MainModule then checks the counterfactual validity of all signatures against the wallet address.\nThis means there is no direct way to update the configuration of a wallet while still using the MainModule. Given that the first configuration update needs to also change the wallet implementation to the MainModuleUpgradable, the MainModule is updated to the MainModuleUpgradable and the updateImageHash method is called to update the wallet configuration.\nconst transactions = [\n {\n delegateCall: false,\n revertOnError: true,\n to: wallet,\n data: walletInterface.encodeFunctionData(\n walletInterface.getFunction('updateImplementation'), [this.context.mainModuleUpgradable]\n ),\n value: ethers.constants.Zero,\n gasLimit: ethers.constants.Zero,\n },\n {\n delegateCall: false,\n revertOnError: true,\n to: wallet,\n data: mainModuleInterface.encodeFunctionData(\n mainModuleInterface.getFunction('updateImageHash'), [newImageHash]\n ),\n value: ethers.constants.Zero,\n gasLimit: ethers.constants.Zero,\n }\n]\n","title":"First configuration update","titles":["Modules & wallet update"]},"403":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#delegatecall-false","html":"\n
delegateCall is used to extend the wallet functionality beyond what's allowed by the module. In this case the called methods are defined on the modules themselves, so there is no need to use delegateCall.
\n","isPage":false,"text":"\ndelegateCall is used to extend the wallet functionality beyond what's allowed by the module. In this case the called methods are defined on the modules themselves, so there is no need to use delegateCall.\n","title":"delegateCall: false","titles":["Modules & wallet update","First configuration update","updateImageHash"]},"404":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#revertonerror-true","html":"\n
revertOnError is used to revert the whole transaction bundle if a transaction flagged by it fails. In this case the operation should be atomic given that a partial wallet configuration update will render the wallet unusable.
\n","isPage":false,"text":"\nrevertOnError is used to revert the whole transaction bundle if a transaction flagged by it fails. In this case the operation should be atomic given that a partial wallet configuration update will render the wallet unusable.\n","title":"revertOnError: true","titles":["Modules & wallet update","First configuration update","updateImageHash"]},"405":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#to-wallet","html":"\n
The methods being called are defined on the wallet itself, but need to be called externally, so the to address is the wallet itself.
\n","isPage":false,"text":"\nThe methods being called are defined on the wallet itself, but need to be called externally, so the to address is the wallet itself.\n","title":"to: wallet","titles":["Modules & wallet update","First configuration update","updateImageHash"]},"406":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#value-ethersconstantszero","html":"\n
The value of the transaction is always zero, since the transaction is a self-referencing transaction and doesn't require transferring funds.
\n","isPage":false,"text":"\nThe value of the transaction is always zero, since the transaction is a self-referencing transaction and doesn't require transferring funds.\n","title":"value: ethers.constants.Zero","titles":["Modules & wallet update","First configuration update","updateImageHash"]},"407":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#gaslimit-ethersconstantszero","html":"\n
The gasLimit of the transaction is always zero, since it represents an unlimited amount of gas.
\n
:::warning Dangerous operation
\n
When the wallet is first updated to the MainModuleUpgradable it doesn't have a valid imageHash yet. It's imperative that the imageHash is updated before the transaction bundle finishes executing.\nIf the imageHash is not updated before the transaction bundle finishes executing, the wallet will be rendered unusable.
\n
For this reason the following considerations should be taken when updating the wallet for the first time:
\n
\n
All transactions should be marked revertOnError = true.
\n
updateImplementation and updateImageHash should both be declared on the same transaction bundle.
\n
The gasLimit of both transactions should be set to unlimited (0).
\n
\n
:::
\n","isPage":false,"text":"\nThe gasLimit of the transaction is always zero, since it represents an unlimited amount of gas.\n:::warning Dangerous operation\nWhen the wallet is first updated to the MainModuleUpgradable it doesn't have a valid imageHash yet. It's imperative that the imageHash is updated before the transaction bundle finishes executing.\nIf the imageHash is not updated before the transaction bundle finishes executing, the wallet will be rendered unusable.\nFor this reason the following considerations should be taken when updating the wallet for the first time:\n\nAll transactions should be marked revertOnError = true.\nupdateImplementation and updateImageHash should both be declared on the same transaction bundle.\nThe gasLimit of both transactions should be set to unlimited (0).\n\n:::\n","title":"gasLimit: ethers.constants.Zero","titles":["Modules & wallet update","First configuration update","updateImageHash"]},"408":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#subsequent-configuration-updates","html":"\n
Once the wallet is updated to the MainModuleUpgradable it can be updated by calling the updateImageHash method, without any additional transaction.
\n","isPage":false,"text":"\nOnce the wallet is updated to the MainModuleUpgradable it can be updated by calling the updateImageHash method, without any additional transaction.\nconst transactions = [\n {\n delegateCall: false,\n revertOnError: true,\n to: wallet,\n data: mainModuleInterface.encodeFunctionData(\n mainModuleInterface.getFunction('updateImageHash'), [newImageHash]\n ),\n value: ethers.constants.Zero,\n gasLimit: ethers.constants.Zero,\n }\n]\n","title":"Subsequent configuration updates","titles":["Modules & wallet update","First configuration update"]},"409":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#retrieving-the-current-configuration","html":"\n
If the wallet is updated to the MainModuleUpgradable it can be queried for the current configuration by calling the getImageHash method.
\n
This method should return the wallet's current configuration hash, which can be compared to a list of known wallet configurations to find the correct one.
\n","isPage":false,"text":"\nIf the wallet is updated to the MainModuleUpgradable it can be queried for the current configuration by calling the getImageHash method.\nThis method should return the wallet's current configuration hash, which can be compared to a list of known wallet configurations to find the correct one.\n","title":"Retrieving the current configuration","titles":["Modules & wallet update","First configuration update"]},"410":{"href":"/solutions/technical-references/internals/v1/05-modules-and-updates#retrieving-the-wallet-configuration","html":"\n
The imageHash method returns bytes32(0) if the wallet is not yet updated to the MainModuleUpgradable.\nIn this case the wallet is in a counter-factual state and the imageHash can't be directly queried.
\n
This is also the case for non-deployed wallets.
\n
To find the imageHash of a non-deployed or non-updated wallet, a candidate known imageHash needs to be compared against the wallet address.
","isPage":false,"text":"\nThe imageHash method returns bytes32(0) if the wallet is not yet updated to the MainModuleUpgradable.\nIn this case the wallet is in a counter-factual state and the imageHash can't be directly queried.\nThis is also the case for non-deployed wallets.\nTo find the imageHash of a non-deployed or non-updated wallet, a candidate known imageHash needs to be compared against the wallet address.\nSee Compute wallet address.","title":"Retrieving the wallet configuration","titles":["Modules & wallet update","First configuration update","Retrieving the current configuration"]},"411":{"href":"/solutions/technical-references/internals/v1/06-main-module-upgradeable#mainmoduleupgradeable--configuration-migration","html":"","isPage":true,"text":"","title":"MainModuleUpgradeable & configuration migration","titles":[]},"412":{"href":"/solutions/technical-references/internals/v1/08-signature-encoding#signature-encoding","html":"\n
\n","isPage":true,"text":"\nSequence Wallets support ERC-1271 Standard Contract Signature Verification to allow signing of transactions and messages.\n","title":"Signature Encoding","titles":[]},"413":{"href":"/solutions/technical-references/internals/v1/08-signature-encoding#erc-191-ethereum-signed-data","html":"\n
import { Wallet } from '@0xsequence/wallet'\n\n// Construct your Sequence Wallet (out of scope for this section)\nconst wallet: Wallet\n\nconst message = "Hello, World!"\n\nconst prefixedMessage = "\\x19Ethereum Signed Message:\\n" + len(message) + message\nconst signature = await wallet.signMessage(prefixedMessage)
\n
The above will iterate through local, signing the message. If the threshold is reached, the signature is returned.\nOtherwise the library will iterate through the remote signers as well.\nThe resulting signatures are joined and encoded as a hex string.
\n","isPage":false,"text":"\nMessages encoded with as ERC-191 Ethereum Signed Data are able to be created and signed as follows.\nimport { Wallet } from '@0xsequence/wallet'\n \n// Construct your Sequence Wallet (out of scope for this section)\nconst wallet: Wallet\n \nconst message = "Hello, World!"\n \nconst prefixedMessage = "\\x19Ethereum Signed Message:\\n" + len(message) + message\nconst signature = await wallet.signMessage(prefixedMessage)\nThe above will iterate through local, signing the message. If the threshold is reached, the signature is returned.\nOtherwise the library will iterate through the remote signers as well.\nThe resulting signatures are joined and encoded as a hex string.\n","title":"ERC-191 Ethereum Signed Data","titles":["Signature Encoding"]},"414":{"href":"/solutions/technical-references/internals/v1/08-signature-encoding#erc-712-structured-data-signatures","html":"\n
import { Wallet } from '@0xsequence/wallet'\nimport { encodeTypedDataDigest } from '@0xsequence/utils'\n\n// Construct your Sequence Wallet (out of scope for this section)\nconst wallet: Wallet\n\n// Encode the typed data\nconst chainId = 1\nconst typedData = {\n\ttypes: {\n\t\tPerson: [\n\t\t\t{ name: 'name', type: 'string' },\n\t\t\t{ name: 'wallet', type: 'address' },\n\t\t\t{ name: 'count', type: 'uint8' }\n\t\t]\n\t},\n\tprimaryType: 'Person' as const,\n\tdomain: {\n\t\tname: 'Ether Mail',\n\t\tversion: '1',\n\t\tchainId: chainId,\n\t\tverifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC'\n\t},\n\tmessage: {\n\t\tname: 'Bob',\n\t\twallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n\t\tcount: 4\n\t}\n} \nconst hashedData = encodeTypedDataDigest(typedData)\n\nconst signature = await wallet.signMessage(hashedData)
\n
The above will iterate through local, signing the message. If the threshold is reached, the signature is returned.\nOtherwise the library will iterate through the remote signers as well.\nThe resulting signatures are joined and encoded as a hex string.
\n","isPage":false,"text":"\nERC-712 Structured Data can also be signed in a similar fashion.\nimport { Wallet } from '@0xsequence/wallet'\nimport { encodeTypedDataDigest } from '@0xsequence/utils'\n \n// Construct your Sequence Wallet (out of scope for this section)\nconst wallet: Wallet\n \n// Encode the typed data\nconst chainId = 1\nconst typedData = {\n\ttypes: {\n\t\tPerson: [\n\t\t\t{ name: 'name', type: 'string' },\n\t\t\t{ name: 'wallet', type: 'address' },\n\t\t\t{ name: 'count', type: 'uint8' }\n\t\t]\n\t},\n\tprimaryType: 'Person' as const,\n\tdomain: {\n\t\tname: 'Ether Mail',\n\t\tversion: '1',\n\t\tchainId: chainId,\n\t\tverifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC'\n\t},\n\tmessage: {\n\t\tname: 'Bob',\n\t\twallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n\t\tcount: 4\n\t}\n} \nconst hashedData = encodeTypedDataDigest(typedData)\n \nconst signature = await wallet.signMessage(hashedData)\nThe above will iterate through local, signing the message. If the threshold is reached, the signature is returned.\nOtherwise the library will iterate through the remote signers as well.\nThe resulting signatures are joined and encoded as a hex string.\n","title":"ERC-712 Structured Data Signatures","titles":["Signature Encoding"]},"415":{"href":"/solutions/technical-references/internals/v1/08-signature-encoding#verification","html":"\n
The signature can be verified by calling the isValidSignature method on the wallet.
\n
/**\n * @notice Verifies whether the provided signature is valid with respect to the provided hash\n * @dev MUST return the correct magic value if the signature provided is valid for the provided hash\n * > The bytes4 magic value to return when signature is valid is 0x1626ba7e : bytes4(keccak256("isValidSignature(bytes32,bytes)"))\n * @param _hash keccak256 hash that was signed\n * @param _signatures Signature byte array associated with _data.\n * Encoded as abi.encode(Signature[], Configs)\n * @return magicValue Magic value 0x1626ba7e if the signature is valid and 0x0 otherwise\n */\n function isValidSignature(\n bytes32 _hash,\n bytes calldata _signatures\n ) public override virtual view returns (bytes4) {\n // Validate signatures\n (bool isValid,) = _signatureValidation(_hash, _signatures);\n if (isValid) {\n return SELECTOR_ERC1271_BYTES32_BYTES;\n }\n\n return bytes4(0);\n }
\n
This will iterate through the combined signatures and validate that the resulting signature breaches the wallet's threshold.
","isPage":false,"text":"\nThe signature can be verified by calling the isValidSignature method on the wallet.\n /**\n * @notice Verifies whether the provided signature is valid with respect to the provided hash\n * @dev MUST return the correct magic value if the signature provided is valid for the provided hash\n * > The bytes4 magic value to return when signature is valid is 0x1626ba7e : bytes4(keccak256("isValidSignature(bytes32,bytes)"))\n * @param _hash keccak256 hash that was signed\n * @param _signatures Signature byte array associated with _data.\n * Encoded as abi.encode(Signature[], Configs)\n * @return magicValue Magic value 0x1626ba7e if the signature is valid and 0x0 otherwise\n */\n function isValidSignature(\n bytes32 _hash,\n bytes calldata _signatures\n ) public override virtual view returns (bytes4) {\n // Validate signatures\n (bool isValid,) = _signatureValidation(_hash, _signatures);\n if (isValid) {\n return SELECTOR_ERC1271_BYTES32_BYTES;\n }\n\n return bytes4(0);\n }\nThis will iterate through the combined signatures and validate that the resulting signature breaches the wallet's threshold.","title":"Verification","titles":["Signature Encoding"]},"416":{"href":"/solutions/technical-references/internals/v1/09-nested-transaction-batching#nested-transaction-batching","html":"","isPage":true,"text":"","title":"Nested Transaction Batching","titles":[]},"417":{"href":"/solutions/technical-references/internals/v1/10-guest-module#guestmodule-and-on-demand-deployment","html":"","isPage":true,"text":"","title":"GuestModule and on-demand deployment","titles":[]},"418":{"href":"/solutions/technical-references/internals/v1/11-wallet-context#wallet-context","html":"\n
Sequence wallet contracts underwent two independent audits by Consensys Diligence and Quantstamp.
\n
Note: Sequence Wallet was formerly known as "Arcadeum Wallet". Any references of "Arcadeum" in these reports are synonymous with "Sequence".
\n","isPage":true,"text":"\nSequence wallet contracts underwent two independent audits by Consensys Diligence and Quantstamp.\nNote: Sequence Wallet was formerly known as "Arcadeum Wallet". Any references of "Arcadeum" in these reports are synonymous with "Sequence".\n","title":"Contract Audits","titles":[]},"420":{"href":"/solutions/technical-references/internals/v1/12-contract-audits#quantstamp","html":"\n
In the context of Sequence Wallets, the "Wallet Configuration" is a set of parameters that defines the behavior of the wallet, primarily used to define the access control of the wallet, meaning who can sign transactions and how many signatures are needed.
\n","isPage":true,"text":"\nIn the context of Sequence Wallets, the "Wallet Configuration" is a set of parameters that defines the behavior of the wallet, primarily used to define the access control of the wallet, meaning who can sign transactions and how many signatures are needed.\n","title":"Wallet Configuration","titles":[]},"424":{"href":"/solutions/technical-references/internals/v2/04-configuration#top-level-properties","html":"\n
Sequence v2 configurations contain the following 3 properties:
\n
\n
threshold - The required "weight sum" needed for a signature to be considered valid.
\n
checkpoint - Used as a salt and ordering mechanism for wallet updates.
\n
tree - Determines the signers and their weights for the wallet.
\n
\n","isPage":false,"text":"\nSequence v2 configurations contain the following 3 properties:\n\nthreshold - The required "weight sum" needed for a signature to be considered valid.\ncheckpoint - Used as a salt and ordering mechanism for wallet updates.\ntree - Determines the signers and their weights for the wallet.\n\n","title":"Top level properties","titles":["Wallet Configuration"]},"425":{"href":"/solutions/technical-references/internals/v2/04-configuration#threshold","html":"\n
The threshold is a uint16; it can have any value between 0 and 65535. Signatures are only considered valid or invalid if the sum of the weights of the signers that signed the transaction is greater or equal to the threshold.
\n","isPage":false,"text":"\nThe threshold is a uint16; it can have any value between 0 and 65535. Signatures are only considered valid or invalid if the sum of the weights of the signers that signed the transaction is greater or equal to the threshold.\n","title":"Threshold","titles":["Wallet Configuration","Top level properties"]},"426":{"href":"/solutions/technical-references/internals/v2/04-configuration#checkpoint","html":"\n
The checkpoint is a uint32. During wallet creation, a semi-random value can be provided to generate independent wallets with the same initial configuration. Then, during normal operation, the checkpoint is used by Light State Sync to ensure that wallet updates are applied in the correct order.
\n","isPage":false,"text":"\nThe checkpoint is a uint32. During wallet creation, a semi-random value can be provided to generate independent wallets with the same initial configuration. Then, during normal operation, the checkpoint is used by Light State Sync to ensure that wallet updates are applied in the correct order.\n","title":"Checkpoint","titles":["Wallet Configuration","Top level properties"]},"427":{"href":"/solutions/technical-references/internals/v2/04-configuration#tree","html":"\n
The tree is an unbalanced binary Merkle tree, where each leaf may contain a signer, a static signature, or a subtree. The tree can represent any combination of signers and weights and can be used to create complex multi-signature wallets.
\n
The possible leaf types are:
\n","isPage":false,"text":"\nThe tree is an unbalanced binary Merkle tree, where each leaf may contain a signer, a static signature, or a subtree. The tree can represent any combination of signers and weights and can be used to create complex multi-signature wallets.\nThe possible leaf types are:\n","title":"Tree","titles":["Wallet Configuration","Top level properties"]},"428":{"href":"/solutions/technical-references/internals/v2/04-configuration#signer","html":"\n
Signers are represented by a signer address and a uint8 weight. The weight is how much the signer contributes to the threshold.\nThe address can belong to either an ERC1271 compliant contract or an EOA wallet.
\n","isPage":false,"text":"\nSigners are represented by a signer address and a uint8 weight. The weight is how much the signer contributes to the threshold.\nThe address can belong to either an ERC1271 compliant contract or an EOA wallet.\nThe leaf hash is calculated as follows:\nbytes32(uint256(weight) << 160 | uint256(uint160(addr)))\n","title":"Signer","titles":["Wallet Configuration","Top level properties","Tree"]},"429":{"href":"/solutions/technical-references/internals/v2/04-configuration#subdigest","html":"\n
This represents a static subdigest for which any signature is valid. If a signature for this subdigest is provided, the total weight of the signature is automatically set to Infinity.
\n
Notice static subdigests that exist within nested trees will have their "Infinity" weight reduced to the weight of the nested tree.
\n","isPage":false,"text":"\nThis represents a static subdigest for which any signature is valid. If a signature for this subdigest is provided, the total weight of the signature is automatically set to Infinity.\nNotice static subdigests that exist within nested trees will have their "Infinity" weight reduced to the weight of the nested tree.\nThe leaf hash is calculated as follows:\nkeccak256(abi.encodePacked('Sequence static digest:\\n', subdigest));\n","title":"Subdigest","titles":["Wallet Configuration","Top level properties","Tree"]},"430":{"href":"/solutions/technical-references/internals/v2/04-configuration#subtree-nested-configuration","html":"\n
This represents a whole new wallet configuration, this "nested configuration" has its own:
\n
\n
External weight (uint8)
\n
Internal threshold (uint16)
\n
Internal tree
\n
\n
The way it works is that if a signature reaches the internal threshold within the subtree it is considered valid, and the external weight is added to the parent tree. Any number of nested configurations can be created, and it is possible to create multiple nesting levels.
\n
This pattern can be used, among other things, to express the following scenarios:
\n
\n
Non-linear weight distribution, A and B signers can provide 1 weight each, but together they can provide 3 weight.
\n
Limited total weight contribution, A, B, and C signers can provide 1 weight each, but together they can only provide 2 weight.
\n
"Department configurations", N departments are required to sign, and each department has its own inner configuration.
\n\n","isPage":false,"text":"\nThis represents a whole new wallet configuration, this "nested configuration" has its own:\n\nExternal weight (uint8)\nInternal threshold (uint16)\nInternal tree\n\nThe way it works is that if a signature reaches the internal threshold within the subtree it is considered valid, and the external weight is added to the parent tree. Any number of nested configurations can be created, and it is possible to create multiple nesting levels.\nThis pattern can be used, among other things, to express the following scenarios:\n\nNon-linear weight distribution, A and B signers can provide 1 weight each, but together they can provide 3 weight.\nLimited total weight contribution, A, B, and C signers can provide 1 weight each, but together they can only provide 2 weight.\n"Department configurations", N departments are required to sign, and each department has its own inner configuration.\n\nThe leaf hash is calculated as follows:\nkeccak256(abi.encodePacked(\n 'Sequence nested config:\\n',\n imageHash(tree),\n threshold,\n weight\n))\nThe wallet contracts have no way of validating the correctness of the configuration, the responsibility of ensuring the configuration is correct is on the SDKs interacting with the contracts.Things like threshold == 0 or threshold > total weight will result in fully unauthenticated wallets or inaccessible wallets respectively.\n","title":"Subtree (nested configuration)","titles":["Wallet Configuration","Top level properties","Tree"]},"431":{"href":"/solutions/technical-references/internals/v2/04-configuration#imagehash","html":"\n
The configuration is never stored as a whole; instead, the Merkle tree is hashed into a single bytes32 value, this is internally called the imageHash of the configuration.
\n","isPage":false,"text":"\nThe configuration is never stored as a whole; instead, the Merkle tree is hashed into a single bytes32 value, this is internally called the imageHash of the configuration.\nThe imageHash is calculated as follows:\nimageHash := keccak256(abi.encode(\n keccak256(abi.encode(\n hashTree(tree),\n threshold\n )),\n checkpoint\n))\nThe hashTree function is a recursive function that hashes the tree into a single bytes32 value, pseudo code for the hashTree function is as follows:\nexport function hashTree(node: Node | Leaf): string {\n if (isSignerLeaf(node)) {\n return ethers.utils.solidityPack(\n ['uint96', 'address'],\n [node.weight, node.address]\n )\n }\n \n if (isSubdigestLeaf(node)) {\n return ethers.utils.solidityKeccak256(\n ['string', 'bytes32'],\n ['Sequence static digest:\\n', node.subdigest]\n )\n }\n \n if (isNestedLeaf(node)) {\n const nested = hashTree(node.tree)\n return ethers.utils.solidityKeccak256(\n ['string', 'bytes32', 'uint256', 'uint256'],\n ['Sequence nested config:\\n', nested, node.threshold, node.weight]\n )\n }\n \n return ethers.utils.solidityKeccak256(\n ['bytes32', 'bytes32'],\n [hashTree(node.left), hashTree(node.right)]\n )\n}\n","title":"ImageHash","titles":["Wallet Configuration"]},"432":{"href":"/solutions/technical-references/internals/v2/04-configuration#initial-configuration","html":"\n
All Sequence Wallets have an "initial configuration", implemented by using the imageHash of the initial configuration as the SALT during the CREATE2 deployment of the wallet.
\n
Wallets are deployed by calling the deploy function of the Factory contract, which takes the following parameters:
\n
\n
mainModule: The address of the initial code implementation of the wallet.
\n
salt: The imageHash of the initial configuration.
\n
\n","isPage":false,"text":"\nAll Sequence Wallets have an "initial configuration", implemented by using the imageHash of the initial configuration as the SALT during the CREATE2 deployment of the wallet.\nWallets are deployed by calling the deploy function of the Factory contract, which takes the following parameters:\n\nmainModule: The address of the initial code implementation of the wallet.\nsalt: The imageHash of the initial configuration.\n\nThe MainModule should always be used as the initial code implementation of the wallet. The MainModule validates the imageHash (during signature validation) by re-computing the counterfactual address of the wallet, hence it does not require any storage initialization.If the imageHash is ever changed, MainModule will automatically replace the wallet code implementation with MainModuleUpgradeable, while handling the storage initialization.","title":"Initial Configuration","titles":["Wallet Configuration"]},"433":{"href":"/solutions/wallets/embedded-wallet/examples/03-manage-sessions#session-management","html":"\n
Sequence Auth + Embedded Wallet handles the following aspects of your application:
\n
\n
User creation
\n
User authentication
\n
Session management
\n
\n
This means you don't need to implement an account system yourself; instead, you interact with the Auth + WaaS SDK whenever you need to authenticate a user.
\n","isPage":true,"text":"\nSequence Auth + Embedded Wallet handles the following aspects of your application:\n\nUser creation\nUser authentication\nSession management\n\nThis means you don't need to implement an account system yourself; instead, you interact with the Auth + WaaS SDK whenever you need to authenticate a user.\n","title":"Session Management","titles":[]},"434":{"href":"/solutions/wallets/embedded-wallet/examples/03-manage-sessions#sign-in--sign-up","html":"\n
Signing in and signing up are the same operation; the account is automatically created if it doesn't already exist.
\n
import { SequenceWaaS } from "@0xsequence/waas";\n\nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n\n// Get a sessionHash\nconst sessionHash = await waas.getSessionHash();\n\n// Get an idToken using the social auth provider of your choice\n// (Google, Facebook, Twitter, etc.)\n// Note: remember to pass the sessionHash as a nonce!\n\n// Then sign in with Sequence WaaS\nconst res = await waas.signIn({ idToken }, "MacBook Pro - Chrome");\n\nconsole.log(res);
\n\n","isPage":false,"text":"\nSigning in and signing up are the same operation; the account is automatically created if it doesn't already exist.\nimport { SequenceWaaS } from "@0xsequence/waas";\n \nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n \n// Get a sessionHash\nconst sessionHash = await waas.getSessionHash();\n \n// Get an idToken using the social auth provider of your choice\n// (Google, Facebook, Twitter, etc.)\n// Note: remember to pass the sessionHash as a nonce!\n \n// Then sign in with Sequence WaaS\nconst res = await waas.signIn({ idToken }, "MacBook Pro - Chrome");\n \nconsole.log(res);\n{\n "sessionId": "0x63A21cCa14ed7454B9cF6466af422B5c597c6b57",\n "wallet": "0xd6043fe6f06d90ec2cB36cA5CD1B193A8515f350"\n}\nSessions opened with some providers might require a second step in order to be usable for sending transactions.See Email validation.\n","title":"Sign in / Sign Up","titles":["Session Management"]},"435":{"href":"/solutions/wallets/embedded-wallet/examples/03-manage-sessions#email-sign-in--sign-up","html":"\n
Email sign-in is directly supported by the SDK, as long as the used key has been generated with the email scope. Email logins work similarly to social logins, except that the idToken is generated by the SDK itself.
\n
To open a session using an email, you will need to provide an email for the user. The Embedded Wallet Nitro API will then send an email to the user with a One-Time Password (OTP) that can be used to open a session. This OTP has to be provided to the SDK to obtain an idToken.
\n
Once the idToken is obtained, the session can be opened as usual.
\n
import { SequenceWaaS } from "@0xsequence/waas";\n\n// Define the user's email address\nconst email = "user@example.com";\n\nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n\n// This will send an email to the user with an OTP\nconst { instance } = await waas.email.initiateAuth({ email });\n\n// Obtain the OTP from the user\nconst answer = "123456";\n\nconst sessionHash = await sequence.getSessionHash();\nconst { idToken } = await waas.email.finalizeAuth({\n instance,\n answer,\n email,\n sessionHash,\n});\n\n// Log in using the idToken, as usual\nawait waas.signIn({ idToken }, "Apple Vision Pro - Chrome");
\n","isPage":false,"text":"\nEmail sign-in is directly supported by the SDK, as long as the used key has been generated with the email scope. Email logins work similarly to social logins, except that the idToken is generated by the SDK itself.\nTo open a session using an email, you will need to provide an email for the user. The Embedded Wallet Nitro API will then send an email to the user with a One-Time Password (OTP) that can be used to open a session. This OTP has to be provided to the SDK to obtain an idToken.\nOnce the idToken is obtained, the session can be opened as usual.\nimport { SequenceWaaS } from "@0xsequence/waas";\n \n// Define the user's email address\nconst email = "user@example.com";\n \nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n \n// This will send an email to the user with an OTP\nconst { instance } = await waas.email.initiateAuth({ email });\n \n// Obtain the OTP from the user\nconst answer = "123456";\n \nconst sessionHash = await sequence.getSessionHash();\nconst { idToken } = await waas.email.finalizeAuth({\n instance,\n answer,\n email,\n sessionHash,\n});\n \n// Log in using the idToken, as usual\nawait waas.signIn({ idToken }, "Apple Vision Pro - Chrome");\n","title":"Email Sign In / Sign Up","titles":["Session Management","Sign in / Sign Up"]},"436":{"href":"/solutions/wallets/embedded-wallet/examples/03-manage-sessions#google--apple-auth","html":"\n
Google and Apple auth are directly supported by the SDK. The idToken is obtained from the social auth provider and used to open a session. You can see a sample React application using Google auth below. To see a complete application, see the demo-waas-auth repository. A functional demo is also available here.
\n
Begin with a simple main.tsx file that sets up the WaaS SDK, the router, and the Google OAuth provider.
The useSessionHash hook is used to obtain a session hash that is used to prevent replay attacks. The sequence.getSessionHash function is used to obtain the session hash, and the sequence.onSessionStateChanged function is used to update the session hash when the session state changes.
To handle the Google login, you can use the GoogleLogin component from the @react-oauth/google package. The handleGoogleLogin function is called when the user successfully logs in.
\n","isPage":false,"text":"\nGoogle and Apple auth are directly supported by the SDK. The idToken is obtained from the social auth provider and used to open a session. You can see a sample React application using Google auth below. To see a complete application, see the demo-waas-auth repository. A functional demo is also available here.\nBegin with a simple main.tsx file that sets up the WaaS SDK, the router, and the Google OAuth provider.\nimport { SequenceWaaS } from "@0xsequence/waas";\nimport { GoogleOAuthProvider } from "@react-oauth/google";\nimport { createHashRouter, RouterProvider } from "react-router-dom";\n \nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n \nexport const router = createHashRouter([\n {\n path: "/login",\n element: <Login />,\n },\n {\n path: "/",\n element: <App />,\n },\n]);\n \nReactDOM.createRoot(document.getElementById("root")!).render(\n <React.StrictMode>\n <GoogleOAuthProvider clientId={GOOGLE_CLIENT_ID}>\n <RouterProvider router={router} />\n </GoogleOAuthProvider>\n </React.StrictMode>\n);\nThe useSessionHash hook is used to obtain a session hash that is used to prevent replay attacks. The sequence.getSessionHash function is used to obtain the session hash, and the sequence.onSessionStateChanged function is used to update the session hash when the session state changes.\nimport { sequence } from "./main";\nimport { useEffect, useState } from "react";\n \nexport function useSessionHash() {\n const [sessionHash, setSessionHash] = useState("");\n const [error, setError] = useState<any>(undefined);\n \n useEffect(() => {\n const handler = async () => {\n try {\n setSessionHash(await sequence.getSessionHash());\n } catch (error) {\n console.error(error);\n setError(error);\n }\n };\n handler();\n return sequence.onSessionStateChanged(handler);\n }, [setSessionHash, setError]);\n \n return {\n sessionHash,\n error,\n loading: !!sessionHash,\n };\n}\nTo handle the Google login, you can use the GoogleLogin component from the @react-oauth/google package. The handleGoogleLogin function is called when the user successfully logs in.\nimport { router, sequence } from './main'\nimport { CredentialResponse, GoogleLogin } from '@react-oauth/google'\nimport { useSessionHash } from "./useSessionHash.ts";\n \nfunction Login() {\n const { sessionHash } = useSessionHash()\n const [signingIn, setSigningIn] = useState(false)\n \n useEffect(() => {\n (async () => {\n if (await sequence.isSignedIn()) {\n router.navigate('/')\n }\n })()\n }, [])\n \n const handleGoogleLogin = async (tokenResponse: CredentialResponse) => {\n const walletAddress = await sequence.signIn({\n idToken: tokenResponse.credential!\n }, "MacBook Pro - Chrome")\n \n console.log(`Wallet address: ${walletAddress}`)\n router.navigate('/')\n }\n \n return (\n {!!sessionHash && (<>\n <GoogleLogin onSuccess={handleGoogleLogin} shape="circle" width={230} nonce={sessionHash} />\n </>)}\n )\n}\n \nexport default Login\n","title":"Google / Apple Auth","titles":["Session Management","Sign in / Sign Up"]},"437":{"href":"/solutions/wallets/embedded-wallet/examples/03-manage-sessions#list-sessions","html":"\n
This function returns a list of sessions for the current user and only includes sessions that are still valid.
\n
import { SequenceWaaS } from "@0xsequence/waas";\n\nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n\nawait waas.signIn({ idToken }, "MacBook Pro - Chrome");\n\nconst sessions = await waas.listSessions();\nconsole.log(sessions);
","isPage":false,"text":"\nA session can be closed using the id of the session. Any session can be closed from any device with an active session.\nimport { SequenceWaaS } from "@0xsequence/waas";\n \nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n \nawait waas.signIn({ idToken }, "MacBook Pro - Chrome");\n \nconst sessions = await waas.listSessions();\nawait waas.dropSession({ sessionId: sessions[0].id });","title":"Close Session","titles":["Session Management"]},"439":{"href":"/solutions/wallets/embedded-wallet/examples/05-validation#validation","html":"\n
Users with Auth + Embedded Wallet go through two distinct flows based on the login method:
\n","isPage":true,"text":"\nUsers with Auth + Embedded Wallet go through two distinct flows based on the login method:\n","title":"Validation","titles":[]},"440":{"href":"/solutions/wallets/embedded-wallet/examples/05-validation#email-login-one-time-code","html":"\n
For users logging in with an email, Amazon Cognito sends a one-time code to validate their identity. This is a trusted method that does not require additional verification.
\n","isPage":false,"text":"\nFor users logging in with an email, Amazon Cognito sends a one-time code to validate their identity. This is a trusted method that does not require additional verification.\n","title":"Email login (one-time code)","titles":["Validation",null]},"441":{"href":"/solutions/wallets/embedded-wallet/examples/05-validation#social-login","html":"\n
Users who log in via established social auth providers like Google or Facebook don't need additional validation. However, when logging in using a custom provider, we cannot guarantee sufficient protection of user's identity. Due to this, we might require additional verification by asking the user to provide a one-time code we send to their email address.
\n
Please contact Sequence support if you wish to discuss whether your authentication provider can be considered trusted.
\n","isPage":false,"text":"\nUsers who log in via established social auth providers like Google or Facebook don't need additional validation. However, when logging in using a custom provider, we cannot guarantee sufficient protection of user's identity. Due to this, we might require additional verification by asking the user to provide a one-time code we send to their email address.\nPlease contact Sequence support if you wish to discuss whether your authentication provider can be considered trusted.\n","title":"Social login","titles":["Validation",null]},"442":{"href":"/solutions/wallets/embedded-wallet/examples/05-validation#validation-status","html":"\n
To check the validation status of the current session, use the isSessionValid method. This returns true for email login and trusted social logins and false for custom logins until email validation is complete.
\n","isPage":false,"text":"\nTo check the validation status of the current session, use the isSessionValid method. This returns true for email login and trusted social logins and false for custom logins until email validation is complete.\nconst isValid = await waas.isSessionValid();\nconsole.log(isValid);\ntrue\n","title":"Validation status","titles":["Validation"]},"443":{"href":"/solutions/wallets/embedded-wallet/examples/05-validation#trigger-session-validation","html":"\n
Manually trigger a session validation with the validateSession method. This will send a code to the user's email. If validated within 10 minutes, the method returns true; otherwise, it returns false.
\n
const result = await waas.validateSession();
\n
true
\n
Once user receives the code, he can validate the session with the finishValidateSession method that takes the code as an argument. If the code is valid, the method returns true; otherwise, it returns false.
\n
const result = await waas.finishValidateSession("123456");
\n
true
\n","isPage":false,"text":"\nManually trigger a session validation with the validateSession method. This will send a code to the user's email. If validated within 10 minutes, the method returns true; otherwise, it returns false.\nconst result = await waas.validateSession();\ntrue\nOnce user receives the code, he can validate the session with the finishValidateSession method that takes the code as an argument. If the code is valid, the method returns true; otherwise, it returns false.\nconst result = await waas.finishValidateSession("123456");\ntrue\n","title":"Trigger session validation","titles":["Validation","Validation status"]},"444":{"href":"/solutions/wallets/embedded-wallet/examples/05-validation#onvalidationrequired-callback","html":"\n
The onValidationRequired callback is triggered when a session validation is required. This can happen when a user tries to perform an action that requires validation, such as sending a transaction or signing a message. It determines whether the session validation should be triggered or not. If the callback returns true, the session validation is triggered. If it returns false, the action is cancelled.
\n","isPage":false,"text":"\nThe onValidationRequired callback is triggered when a session validation is required. This can happen when a user tries to perform an action that requires validation, such as sending a transaction or signing a message. It determines whether the session validation should be triggered or not. If the callback returns true, the session validation is triggered. If it returns false, the action is cancelled.\nconst tx = await waas.sendERC20({\n validation: {\n onValidationRequired: () => true,\n },\n chainId: 42161,\n token: "0x6b175474e89094c44da98b954eedeac495271d0f", // DAI\n to: "0x27CabC9700EE6Db2797b6AC1e1eCe81C72A2cD8D", // Recipient\n value: "200000000000000000000", // 200 DAI\n});\n","title":"onValidationRequired callback","titles":["Validation","Validation status","Trigger session validation"]},"445":{"href":"/solutions/wallets/embedded-wallet/examples/05-validation#listen-for-session-validations","html":"\n
Events like transaction sends may silently prompt session validation. Use the onValidationRequired hook to catch such instances.
\n
waas.onValidationRequired(() => {\n console.log("Session has been triggered for validation");\n});\n\nawait waas.sendTransaction({ chainId: 1 }, { to: "0x...", value: "1" });
\n
Session has been triggered for validation
\n","isPage":false,"text":"\nEvents like transaction sends may silently prompt session validation. Use the onValidationRequired hook to catch such instances.\nwaas.onValidationRequired(() => {\n console.log("Session has been triggered for validation");\n});\n \nawait waas.sendTransaction({ chainId: 1 }, { to: "0x...", value: "1" });\nSession has been triggered for validation\n","title":"Listen for session validations","titles":["Validation","Validation status"]},"446":{"href":"/solutions/wallets/embedded-wallet/examples/05-validation#automatic-session-validation","html":"\n
Session validation is automatic when certain actions requiring validation are performed. This can be managed using the onValidationRequired hook.
\n
const tx = await waas.sendTransaction({\n chainId: 1,\n validation: {\n onValidationRequired: () => {\n console.log("Session has been triggered for validation");\n return true;\n },\n },\n to: "0x061150e5574716DBb1a2cdf54b3DcE9F94395f65",\n value: "1",\n});
\n
By returning true or false from the onValidationRequired hook, you either continue or cancel the action, respectively.
","isPage":false,"text":"\nSession validation is automatic when certain actions requiring validation are performed. This can be managed using the onValidationRequired hook.\nconst tx = await waas.sendTransaction({\n chainId: 1,\n validation: {\n onValidationRequired: () => {\n console.log("Session has been triggered for validation");\n return true;\n },\n },\n to: "0x061150e5574716DBb1a2cdf54b3DcE9F94395f65",\n value: "1",\n});\nBy returning true or false from the onValidationRequired hook, you either continue or cancel the action, respectively.","title":"Automatic session validation","titles":["Validation"]},"447":{"href":"/solutions/wallets/embedded-wallet/examples/06-transaction-receipts#transaction-receipts","html":"\n
Any methods that involve sending transactions will return either successful or failed transaction receipts. Failed transaction receipts are generated without executing the transaction.
\n","isPage":true,"text":"\nAny methods that involve sending transactions will return either successful or failed transaction receipts. Failed transaction receipts are generated without executing the transaction.\n","title":"Transaction receipts","titles":[]},"448":{"href":"/solutions/wallets/embedded-wallet/examples/06-transaction-receipts#successful-transaction-response","html":"\n
Any transaction that is successfully included in a block will return a SentTransactionResponse object. This must be checked for before accessing the transaction hash, using the isSentTransactionResponse type guard.
\n","isPage":false,"text":"\nAny transaction that is successfully included in a block will return a SentTransactionResponse object. This must be checked for before accessing the transaction hash, using the isSentTransactionResponse type guard.\nimport { Sequence, isSentTransactionResponse } from "@0xsequence/waas";\n \nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n \nawait waas.signIn({ idToken }, "Session name");\n \nconst tx = await waas.sendTransaction({\n chainId: 42161,\n transactions: [\n {\n to: "0xD72C236Be524Ec24F72329317e2785E687105B69",\n value: "0",\n },\n ],\n});\n \nif (isSentTransactionResponse(tx)) {\n console.log(tx);\n}\nThe relevant fields are:\n\ntxHash: The transaction hash of the transaction that was sent to the network.\nreceipt.logs: Logs emitted by the transaction.\nreceipt.status: The status of the transaction. SUCCEEDED or FAILED.\nreceipt.revertReason: If the transaction was executed but reverted, it includes the reason.\n\nTo view the full response object, see the [Transaction Receipt Response] section.\n{\n "code": "transactionReceipt",\n "data": {\n "txHash": "0xf2e9f728abd65089f25efda5852e605ced377f4e2c89dbf143b124623ed09b2c",\n "metaTxHash": "acc36ed4ef40db74137266e48d863083a5c7e85e2735d69adafcb5b362b6cfc0",\n "nativeReceipt": { ... },\n "receipt": {\n "id": "acc36ed4ef40db74137266e48d863083a5c7e85e2735d69adafcb5b362b6cfc0",\n "index": 0,\n "logs": [\n {\n "address": "0x4d4EE1b8583e31fe789eAF2e1b6e011C220c10B6",\n "data": "0x0000000000000000000000001119e72b4af230becebd933d0e07f0eec51d8c2a0000000000000000000000000000000000000000000000000000000000000001",\n "topics": [\n "0x1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881"\n ]\n },\n {\n "address": "0x4d4EE1b8583e31fe789eAF2e1b6e011C220c10B6",\n "data": "0x0000000000000000000000000000000000000000000000000000000000000000",\n "topics": [\n "0x5c4eeb02dabf8976016ab414d617f9a162936dcace3cdef8c69ef6e262ad5ae7",\n "0xacc36ed4ef40db74137266e48d863083a5c7e85e2735d69adafcb5b362b6cfc0"\n ]\n }\n ],\n "receipts": [ ... ],\n "revertReason": null,\n "status": "SUCCEEDED"\n },\n "request": { ... },\n "simulations": [ ... ]\n }\n}\n","title":"Successful transaction response","titles":["Transaction receipts"]},"449":{"href":"/solutions/wallets/embedded-wallet/examples/06-transaction-receipts#failed-transaction-response","html":"\n
An Embedded Wallet will try to catch any failing transactions before they are sent to the network. This is done by simulating the transaction on the network before sending it. If the simulation fails, the transaction will not be sent to the network and a FailedTransactionResponse will be returned.
\n
To view the full response object, see the TODO: link to wallet API [Transaction Receipt Response] section.
\n
import { Sequence, isSentTransactionResponse } from "@0xsequence/waas";\n\nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n\nawait waas.signIn({ idToken }, "Session name");\n\nconst tx = await waas.sendTransaction({\n chainId: 137,\n transactions: [\n {\n // This address always fails on Polygon, give it a try :D\n to: "0x839eE023B21f4Ffe2294025DE0AC30Ba7278D6Fd",\n value: "0",\n },\n ],\n});\n\nif (isSentTransactionResponse(tx)) {\n // ... This will never be executed\n} else {\n // tx can only be `SentTransactionResponse` or `FailedTransactionResponse`\n console.log(tx);\n}
","isPage":false,"text":"\nAn Embedded Wallet will try to catch any failing transactions before they are sent to the network. This is done by simulating the transaction on the network before sending it. If the simulation fails, the transaction will not be sent to the network and a FailedTransactionResponse will be returned.\nTo view the full response object, see the TODO: link to wallet API [Transaction Receipt Response] section.\nimport { Sequence, isSentTransactionResponse } from "@0xsequence/waas";\n \nconst waas = new SequenceWaaS(\n {\n projectAccessKey: `${process.env.PROJECT_ACCESS_KEY}`,\n waasConfigKey: `${process.env.WAAS_CONFIG_KEY}`,\n network: "mumbai",\n },\n defaults.TEST\n);\n \nawait waas.signIn({ idToken }, "Session name");\n \nconst tx = await waas.sendTransaction({\n chainId: 137,\n transactions: [\n {\n // This address always fails on Polygon, give it a try :D\n to: "0x839eE023B21f4Ffe2294025DE0AC30Ba7278D6Fd",\n value: "0",\n },\n ],\n});\n \nif (isSentTransactionResponse(tx)) {\n // ... This will never be executed\n} else {\n // tx can only be `SentTransactionResponse` or `FailedTransactionResponse`\n console.log(tx);\n}\n{\n "code": "transactionFailed",\n "data": {\n "error": "This is an error message",\n "request": {\n "code": "sendTransaction",\n "expires": 1699443005,\n "identifier": "ts-sdk-1699442705965-0x153824576D03629b264683B430bBF9AcEA1d0975",\n "issued": 1699442705,\n "network": "137",\n "transactions": [\n {\n "data": "0x",\n "to": "0x839eE023B21f4Ffe2294025DE0AC30Ba7278D6Fd",\n "type": "transaction",\n "value": "0x00"\n }\n ],\n "wallet": "0x4d4EE1b8583e31fe789eAF2e1b6e011C220c10B6"\n },\n "simulations": [\n {\n "executed": true,\n "gasLimit": 7908,\n "gasUsed": 5931,\n "reason": "This is an error message :)",\n "result": null,\n "succeeded": false\n }\n ]\n }\n}","title":"Failed transaction response","titles":["Transaction receipts"]},"450":{"href":"/solutions/wallets/universal-wallet/examples/02-auth-address#authenticate-users-with-message-signature","html":"\n","isPage":true,"text":"\n","title":"Authenticate Users with Message Signature","titles":[]},"451":{"href":"/solutions/wallets/universal-wallet/examples/02-auth-address#ask-for-the-wallet-address","html":"\n
\n","isPage":false,"text":"\nTo get the user's Sequence wallet address:\nconst wallet = sequence.getWallet()\nconst address = wallet.getAddress()\nconsole.log(address)\n","title":"Ask for the wallet address","titles":["Authenticate Users with Message Signature"]},"452":{"href":"/solutions/wallets/universal-wallet/examples/02-auth-address#authenticate-wallet","html":"\n
In many cases, you'll want your users to connect and then verify they do control this wallet address. Applications typically do this by asking the user\nto sign a message with their wallet, and then verify the signature from the user to ensure its integrity.
\n
As this is such a common workflow, Sequence can automatically authenticate the account address at the same time\nwhile the user is prompt to connect their wallet to your dapp. This allows the user experience to be simpler and\nmore seamless.
\n
import { sequence } from '0xsequence'\n\nconst wallet = sequence.getWallet()\n\nconst connectDetails = await wallet.connect({\n app: 'Your Dapp name',\n authorize: true // <---<<< this will automatically sign+verify a EIP712 message when user clicks "Connect"\n})
\n
It will look like this to your users:
\n\n
In the above example, we pass authorize: true to the connect() function, which will automatically have the user\nsign a EIP712 signed message to prove their identity. This allows you to then easily authenticate the connected\nwallet address with absolute certainty.
\n
You can find the signed message proof returned in connectDetails.proof, which is an EIP712 signed object using\na simple convention from ethauth. NOTE: EIP712 allows you to use an actual object for\nsigning instead of just a plain-text string.
\n","isPage":false,"text":"\nIn many cases, you'll want your users to connect and then verify they do control this wallet address. Applications typically do this by asking the user\nto sign a message with their wallet, and then verify the signature from the user to ensure its integrity.\nAs this is such a common workflow, Sequence can automatically authenticate the account address at the same time\nwhile the user is prompt to connect their wallet to your dapp. This allows the user experience to be simpler and\nmore seamless.\nimport { sequence } from '0xsequence'\n \nconst wallet = sequence.getWallet()\n \nconst connectDetails = await wallet.connect({\n app: 'Your Dapp name',\n authorize: true // <---<<< this will automatically sign+verify a EIP712 message when user clicks "Connect"\n})\nIt will look like this to your users:\n\nIn the above example, we pass authorize: true to the connect() function, which will automatically have the user\nsign a EIP712 signed message to prove their identity. This allows you to then easily authenticate the connected\nwallet address with absolute certainty.\nYou can find the signed message proof returned in connectDetails.proof, which is an EIP712 signed object using\na simple convention from ethauth. NOTE: EIP712 allows you to use an actual object for\nsigning instead of just a plain-text string.\n","title":"Authenticate wallet","titles":["Authenticate Users with Message Signature"]},"453":{"href":"/solutions/wallets/universal-wallet/examples/02-auth-address#authenticate-wallet-server-side","html":"\n
The above example demonstrates how to connect and verify the user's identity in your dapp on the client-side,\nbut if you'd like to authenticate the Sequence authorization proof on your server, then you can do so with the following snippet:
\n
import { ValidateSequenceWalletProof } from '@0xsequence/auth'\nimport { commons, v2 } from '@0xsequence/core'\nimport { ETHAuth } from '@0xsequence/ethauth'\nimport { trackers } from '@0xsequence/sessions'\nimport * as ethers from 'ethers'\n\n// ...\n\nconst rpcUrl = 'https://polygon-mainnet.infura.io/v3/<your infura key here>'\nconst provider = new ethers.providers.JsonRpcProvider(rpcUrl)\n\n// create an EIP-6492-aware ETHAuth proof validator\nconst validator = ValidateSequenceWalletProof(\n () => new commons.reader.OnChainReader(provider),\n new trackers.remote.RemoteConfigTracker('https://sessions.sequence.app'),\n v2.DeployedWalletContext\n)\nconst ethauth = new ETHAuth(validator)\nawait ethauth.configJsonRpcProvider(rpcUrl)\n\ntry {\n const proof = await ethAuth.decodeProof(connectDetails.proof.proofString)\n console.log(`proof for address ${proof.address} is valid`)\n} catch (err) {\n console.log(`invalid proof -- do not trust address: ${err}`)\n}
\n
See the Go Sequence SDK on using Sequence in your Go applications.
As always, if you have any questions or require help, reach out to us on Discord.
","isPage":false,"text":"\nThe above example demonstrates how to connect and verify the user's identity in your dapp on the client-side,\nbut if you'd like to authenticate the Sequence authorization proof on your server, then you can do so with the following snippet:\nimport { ValidateSequenceWalletProof } from '@0xsequence/auth'\nimport { commons, v2 } from '@0xsequence/core'\nimport { ETHAuth } from '@0xsequence/ethauth'\nimport { trackers } from '@0xsequence/sessions'\nimport * as ethers from 'ethers'\n \n// ...\n \nconst rpcUrl = 'https://polygon-mainnet.infura.io/v3/<your infura key here>'\nconst provider = new ethers.providers.JsonRpcProvider(rpcUrl)\n \n// create an EIP-6492-aware ETHAuth proof validator\nconst validator = ValidateSequenceWalletProof(\n () => new commons.reader.OnChainReader(provider),\n new trackers.remote.RemoteConfigTracker('https://sessions.sequence.app'),\n v2.DeployedWalletContext\n)\nconst ethauth = new ETHAuth(validator)\nawait ethauth.configJsonRpcProvider(rpcUrl)\n \ntry {\n const proof = await ethAuth.decodeProof(connectDetails.proof.proofString)\n console.log(`proof for address ${proof.address} is valid`)\n} catch (err) {\n console.log(`invalid proof -- do not trust address: ${err}`)\n}\nSee the Go Sequence SDK on using Sequence in your Go applications.\nIf your server is written in a language other than Javascript/Typescript or Go, all you have to do is validate\nthe signature with EIP1271, the standard method for validating signed messages for a smart wallet.\nAs always, if you have any questions or require help, reach out to us on Discord.","title":"Authenticate wallet server-side","titles":["Authenticate Users with Message Signature"]},"454":{"href":"/solutions/wallets/universal-wallet/examples/04-session-keys#no-wallet-confirmation-signatures","html":"\n
It is possible to build an application where users sign messages without requiring a confirmation in their Sequence wallet every time. This is possible using session keys, or ephemeral keys.
\n","isPage":true,"text":"\nIt is possible to build an application where users sign messages without requiring a confirmation in their Sequence wallet every time. This is possible using session keys, or ephemeral keys.\n","title":"No-Wallet-Confirmation Signatures","titles":[]},"455":{"href":"/solutions/wallets/universal-wallet/examples/04-session-keys#session-keys","html":"\n
Session keys are ephemeral private keys that can be generated and stored client-side, typically in a user's local storage. They provide a convenient and secure way for users to authorize specific actions in a decentralized application without requiring them to confirm each action through their primary wallet.
\n
By signing a message with their primary wallet (e.g., Sequence Wallet), users can authorize a session key to act on their behalf for a limited time or scope. Applications can then interpret signed messages from the session key as if they were coming directly from the user's wallet, streamlining the user experience.
\n
Session keys are particularly useful for applications that require frequent user interactions, as they help reduce the number of wallet confirmations needed, while still maintaining a secure and verifiable authentication process.
\n","isPage":false,"text":"\nSession keys are ephemeral private keys that can be generated and stored client-side, typically in a user's local storage. They provide a convenient and secure way for users to authorize specific actions in a decentralized application without requiring them to confirm each action through their primary wallet.\nBy signing a message with their primary wallet (e.g., Sequence Wallet), users can authorize a session key to act on their behalf for a limited time or scope. Applications can then interpret signed messages from the session key as if they were coming directly from the user's wallet, streamlining the user experience.\nSession keys are particularly useful for applications that require frequent user interactions, as they help reduce the number of wallet confirmations needed, while still maintaining a secure and verifiable authentication process.\n","title":"Session Keys","titles":[]},"456":{"href":"/solutions/wallets/universal-wallet/examples/04-session-keys#using-session-keys-with-sequence","html":"\n","isPage":false,"text":"\n","title":"Using Session keys with Sequence","titles":[]},"457":{"href":"/solutions/wallets/universal-wallet/examples/04-session-keys#1-initialize-sequence-wallet-and-connect","html":"\n
import { Wallet } from '@0xsequence/wallet'\nimport { ethers } from 'ethers'\n\nconst wallet = new Wallet()\nawait wallet.connect()\n\nconst signer = wallet.getSigner()\nconst userAddress = signer.getAddress()
\n","isPage":false,"text":"\nimport { Wallet } from '@0xsequence/wallet'\nimport { ethers } from 'ethers'\n \nconst wallet = new Wallet()\nawait wallet.connect()\n \nconst signer = wallet.getSigner()\nconst userAddress = signer.getAddress()\n","title":"1. Initialize Sequence Wallet and Connect","titles":["Using Session keys with Sequence",null]},"458":{"href":"/solutions/wallets/universal-wallet/examples/04-session-keys#2-generate-a-session-key","html":"\n
Create a new ephemeral private key, store it in local storage, and derive the associated address:
\n","isPage":false,"text":"\nCreate a new ephemeral private key, store it in local storage, and derive the associated address:\nconst sessionPrivateKey = ethers.utils.randomBytes(32)\nlocalStorage.setItem('sessionPrivateKey', ethers.utils.hexlify(sessionPrivateKey))\nconst sessionWallet = new ethers.Wallet(sessionPrivateKey)\nconst sessionAddress = await sessionWallet.getAddress()\n","title":"2. Generate a Session Key","titles":["Using Session keys with Sequence",null]},"459":{"href":"/solutions/wallets/universal-wallet/examples/04-session-keys#3-sign-authorization-message","html":"\n
Sign a message with the user's Sequence Wallet to authorize the session key:
\n
const authorizationMessage = `Authorize this device to play this game.`\nconst signature = await signer.signMessage(authorizationMessage)
\n","isPage":false,"text":"\nSign a message with the user's Sequence Wallet to authorize the session key:\nconst authorizationMessage = `Authorize this device to play this game.`\nconst signature = await signer.signMessage(authorizationMessage)\n","title":"3. Sign Authorization Message","titles":["Using Session keys with Sequence",null]},"460":{"href":"/solutions/wallets/universal-wallet/examples/04-session-keys#4-verify-authorization-signature","html":"\n
Verify the signature on the server or client side using Sequence utility functions:
\n","isPage":false,"text":"\nUse the session key to sign a message client-side without user interaction:\nconst message = 'Perform action without wallet confirmation'\nconst sessionSignature = await sessionWallet.signMessage(message)\n","title":"5. Sign Message with Session Key","titles":["Using Session keys with Sequence",null]},"462":{"href":"/solutions/wallets/universal-wallet/examples/04-session-keys#6-verify-session-signature","html":"\n
Verify the session signature on the server or client side:
Note: You should retrieve the session key stored in local storage upon loading the application and only create a new session key if none can be found.
","isPage":false,"text":"\nVerify the session signature on the server or client side:\nconst recoveredSessionAddress = ethers.utils.verifyMessage(message, sessionSignature)\nif (recoveredSessionAddress === sessionAddress) {\n console.log('Session signature valid')\n} else {\n console.log('Session signature invalid')\n}\nNote: You should retrieve the session key stored in local storage upon loading the application and only create a new session key if none can be found.","title":"6. Verify Session Signature","titles":["Using Session keys with Sequence",null]},"463":{"href":"/solutions/wallets/universal-wallet/examples/05-send-transaction#sending-transactions","html":"\n
Signing a transaction will only retrieve the signed payload.\nIf you want the wallet to actually dispatch the transaction to the network as well, that requires only a small modification to the previous example (note the change from signTransactions to sendTransaction):
","isPage":true,"text":"\nSigning a transaction will only retrieve the signed payload.\nIf you want the wallet to actually dispatch the transaction to the network as well, that requires only a small modification to the previous example (note the change from signTransactions to sendTransaction):\nconst transaction = {\n to: recipientAddress,\n value: 1000000000000000000\n}\n \nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n ","title":"Sending Transactions","titles":[]},"464":{"href":"/solutions/wallets/universal-wallet/examples/06-send-erc20#sending-erc-20-tokens","html":"\n
You can ask the wallet to send a single ERC-20 token transfer:
\n
const erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\n\n// Encode an ERC-20 token transfer to recipient of the specified amount\nconst data = erc20Interface.encodeFunctionData(\n 'transfer', [recipientAddress, amount]\n)\n\nconst transaction = {\n to: daiContractAddress,\n data\n}\n\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n
\n
With batching functionality, you can send multiple token transfers in a single native transaction:
\n
const erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\n\n// Encode two different ERC-20 token transfers\nconst data1 = erc20Interface.encodeFunctionData(\n 'transfer', [recipient1Address, amount1]\n)\nconst data2 = erc20Interface.encodeFunctionData(\n 'transfer', [recipient2Address, amount2]\n)\n\nconst transaction1 = {\n to: daiContractAddress,\n data: data1\n}\n\nconst transaction2 = {\n to: daiContractAddress,\n data: data2\n}\n\n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction([transaction1, transaction2])\nconsole.log(txnResponse)\n
","isPage":true,"text":"\nYou can ask the wallet to send a single ERC-20 token transfer:\nconst erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\n \n// Encode an ERC-20 token transfer to recipient of the specified amount\nconst data = erc20Interface.encodeFunctionData(\n 'transfer', [recipientAddress, amount]\n)\n \nconst transaction = {\n to: daiContractAddress,\n data\n}\n \nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n \nWith batching functionality, you can send multiple token transfers in a single native transaction:\nconst erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\n \n// Encode two different ERC-20 token transfers\nconst data1 = erc20Interface.encodeFunctionData(\n 'transfer', [recipient1Address, amount1]\n)\nconst data2 = erc20Interface.encodeFunctionData(\n 'transfer', [recipient2Address, amount2]\n)\n \nconst transaction1 = {\n to: daiContractAddress,\n data: data1\n}\n \nconst transaction2 = {\n to: daiContractAddress,\n data: data2\n}\n \n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction([transaction1, transaction2])\nconsole.log(txnResponse)\n ","title":"Sending ERC-20 Tokens","titles":[]},"465":{"href":"/solutions/wallets/universal-wallet/examples/07-send-erc721#sending-erc-721-nft-tokens","html":"\n
Sending an ERC-721 NFT is similar to sending an ERC-20 token.\nThe only notable difference is in the contract standard itself:
\n
const erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\n\n// Encode the transfer of the NFT tokenId to recipient\nconst address = await wallet.getAddress()\nconst data = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipientAddress, tokenId]\n)\n\nconst transaction = {\n to: erc721TokenAddress,\n data\n}\n\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n
\n
With batching functionality, you can send multiple token transfers in a single native transaction:
\n
const erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\n\n// Encode two different ERC-721 token transfers\nconst data1 = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient1Address, amount1]\n)\nconst data2 = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient2Address, amount2]\n)\n\nconst transaction1 = {\n to: erc721ContractAddress,\n data: data1\n}\n\nconst transaction2 = {\n to: erc721ContractAddress,\n data: data2\n}\n\n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransactionBatch([transaction1, transaction2])\nconsole.log(txnResponse)\n
","isPage":true,"text":"\nSending an ERC-721 NFT is similar to sending an ERC-20 token.\nThe only notable difference is in the contract standard itself:\nconst erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\n \n// Encode the transfer of the NFT tokenId to recipient\nconst address = await wallet.getAddress()\nconst data = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipientAddress, tokenId]\n)\n \nconst transaction = {\n to: erc721TokenAddress,\n data\n}\n \nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n \nWith batching functionality, you can send multiple token transfers in a single native transaction:\nconst erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\n \n// Encode two different ERC-721 token transfers\nconst data1 = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient1Address, amount1]\n)\nconst data2 = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient2Address, amount2]\n)\n \nconst transaction1 = {\n to: erc721ContractAddress,\n data: data1\n}\n \nconst transaction2 = {\n to: erc721ContractAddress,\n data: data2\n}\n \n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransactionBatch([transaction1, transaction2])\nconsole.log(txnResponse)\n ","title":"Sending ERC-721 (NFT) Tokens","titles":[]},"466":{"href":"/solutions/wallets/universal-wallet/examples/08-send-erc1155#sending-erc-1155-collectible-tokens","html":"\n
Sending an ERC-1155 collectible is similar to sending an ERC-20 token.\nThe only notable difference is in the contract standard itself:
\n
const erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n\n// Encode the transfer of the collectible to recipient\nconst address = await wallet.getAddress()\nconst data = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipientAddress, tokenId, amount, '0x']\n)\n\nconst transaction = {\n to: erc1155TokenAddress,\n data\n}\n\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n
\n
With batching functionality, you can send multiple token transfers in a single native transaction:
\n
const erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n\n// Encode two different ERC-1155 token transfers\nconst data1 = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient1Address, token1Id, amount1, '0x']\n)\nconst data2 = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient2Address, token2Id, amount2, '0x']\n)\n\nconst transaction1 = {\n to: erc1155ContractAddress,\n data: data1\n}\nconst transaction2 = {\n to: erc1155ContractAddress,\n data: data2\n}\n\n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransactionBatch([transaction1, transaction2])\nconsole.log(txnResponse)\n
","isPage":true,"text":"\nSending an ERC-1155 collectible is similar to sending an ERC-20 token.\nThe only notable difference is in the contract standard itself:\nconst erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n \n// Encode the transfer of the collectible to recipient\nconst address = await wallet.getAddress()\nconst data = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipientAddress, tokenId, amount, '0x']\n)\n \nconst transaction = {\n to: erc1155TokenAddress,\n data\n}\n \nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransaction(transaction)\nconsole.log(txnResponse)\n \nWith batching functionality, you can send multiple token transfers in a single native transaction:\nconst erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n \n// Encode two different ERC-1155 token transfers\nconst data1 = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient1Address, token1Id, amount1, '0x']\n)\nconst data2 = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient2Address, token2Id, amount2, '0x']\n)\n \nconst transaction1 = {\n to: erc1155ContractAddress,\n data: data1\n}\nconst transaction2 = {\n to: erc1155ContractAddress,\n data: data2\n}\n \n// Send a multiple transactions as a single bundle which is executed as one transaction on chain.\nconst signer = wallet.getSigner()\nconst txnResponse = await signer.sendTransactionBatch([transaction1, transaction2])\nconsole.log(txnResponse)\n ","title":"Sending ERC-1155 (Collectible) Tokens","titles":[]},"467":{"href":"/solutions/wallets/universal-wallet/examples/09-send-batch-transactions#sending-a-batch-of-transactions","html":"\n
Likewise, bundling multiple transactions to be sent in a single native transaction is equally as easy:
","isPage":true,"text":"\nLikewise, bundling multiple transactions to be sent in a single native transaction is equally as easy:\nconst transaction1 = {\n to: recipient1Address,\n value: 1000000000000000000\n}\n \nconst transaction2 = {\n to: recipient2Address,\n value: 1000000000000000000\n}\n \nconst signer = wallet.getSigner()\nconst response = await signer.sendTransaction([transaction1, transaction2])\nconsole.log(response)\nThe transactions don't have to be the same token or even token standard either.\nYou can mix and match:\nconst erc20Interface = new ethers.utils.Interface([\n 'function transfer(address _to, uint256 _value)'\n])\nconst erc721Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _tokenId)'\n])\nconst erc1155Interface = new ethers.utils.Interface([\n 'function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data)'\n])\n \nconst erc20Data = erc20Interface.encodeFunctionData(\n 'transfer', [recipient2Address, amount2]\n)\nconst erc721Data = erc721Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient3Address, amount3]\n)\nconst erc1155Data = erc1155Interface.encodeFunctionData(\n 'safeTransferFrom', [address, recipient4Address, token4Id, amount4, '0x']\n)\n \nconst transactions = [\n { to: recipient1Address, value: '1000000000000000000' },\n { to: daiContractAddress, data: erc20Data },\n { to: erc721ContractAddress, data: erc721Data },\n { to: erc1155ContractAddress, data: erc1155Data }\n]\n \nconst signer = wallet.getSigner()\nconst response = await signer.sendTransaction(transactions)\nconsole.log(response)","title":"Sending a Batch of Transactions","titles":[]},"468":{"href":"/solutions/wallets/universal-wallet/examples/10-building-backends#building-backends-with-sequence","html":"\n","isPage":true,"text":"\n","title":"Building Backends with Sequence","titles":[]},"469":{"href":"/solutions/wallets/universal-wallet/examples/10-building-backends#nodejs","html":"\n
The 0xsequence package which is available for browser / client use, also works perfectly on nodejs backends\nwritten in Javascript or Typescript.
\n","isPage":false,"text":"\nThe 0xsequence package which is available for browser / client use, also works perfectly on nodejs backends\nwritten in Javascript or Typescript.\n","title":"nodejs","titles":["Building Backends with Sequence",null]},"470":{"href":"/solutions/wallets/universal-wallet/examples/10-building-backends#go","html":"\n
go-sequence is the equivalent of 0xsequence\nbut for Go / Golang backends. In fact, all of Sequence's infrastructure is written in Go and is built with go-sequence.
\n","isPage":false,"text":"\nA complete Sequence SDK is also available in Go: https://github.com/0xsequence/go-sequence.\ngo-sequence is the equivalent of 0xsequence\nbut for Go / Golang backends. In fact, all of Sequence's infrastructure is written in Go and is built with go-sequence.\n","title":"Go","titles":["Building Backends with Sequence",null]},"471":{"href":"/solutions/wallets/universal-wallet/examples/10-building-backends#ethkit","html":"\n
As part of the Sequence open source tools, our team has also built ethkit, which\nis an Ethereum dev toolkit for Go backends. ethkit supports EOA wallets,\nand you can think of it like ethers.js but for Go.
\n","isPage":false,"text":"\nAs part of the Sequence open source tools, our team has also built ethkit, which\nis an Ethereum dev toolkit for Go backends. ethkit supports EOA wallets,\nand you can think of it like ethers.js but for Go.\n","title":"ethkit","titles":["Building Backends with Sequence",null]},"472":{"href":"/solutions/wallets/universal-wallet/examples/10-building-backends#support-for-other-backend-languages","html":"\n
If your backend services are written in a language other than JS or Go, you can still easily integrate Sequence,\nas Sequence is really just a standard Ethereum client library with some extra features. In many cases, the extra\nfeatures are best utilized on the client-side / dapp.
\n
If your situation for example is a Python or Java backend where you'd like to verify signatures from a Sequence Wallet,\nwell then, you can call the standard EIP1271 function for the account address\nfrom your backend.
","isPage":false,"text":"\nIf your backend services are written in a language other than JS or Go, you can still easily integrate Sequence,\nas Sequence is really just a standard Ethereum client library with some extra features. In many cases, the extra\nfeatures are best utilized on the client-side / dapp.\nIf your situation for example is a Python or Java backend where you'd like to verify signatures from a Sequence Wallet,\nwell then, you can call the standard EIP1271 function for the account address\nfrom your backend.\nIf you'd like to use the Sequence's Meta-Transaction capabilities, see Building Relaying Server with Sequence.","title":"Support for other backend languages","titles":["Building Backends with Sequence",null]}},"dirtCount":0,"index":[["|",{"2":{"428":1,"431":1}}],["||",{"2":{"80":4}}],["zellic",{"0":{"422":1}}],["zero",{"0":{"406":1,"407":1},"2":{"402":4,"406":1,"407":1,"408":2}}],["^5",{"2":{"235":1,"364":1}}],["^1",{"2":{"235":1,"364":1}}],["❤️",{"2":{"125":1}}],["🖼️",{"2":{"96":1,"239":1,"367":1}}],["👛",{"2":{"96":1,"239":1,"367":1}}],["🔐🪪",{"2":{"96":1,"239":1,"367":1}}],["⛓️",{"2":{"96":1,"239":1,"367":1}}],["🪙",{"2":{"96":1,"239":1,"367":1}}],["🦊",{"2":{"96":1,"239":1,"367":1}}],["🧰",{"2":{"95":1,"238":1,"366":1}}],["7908",{"2":{"449":1}}],["712",{"0":{"414":1},"2":{"414":1}}],["7f1",{"2":{"139":2}}],["7",{"0":{"331":1},"2":{"85":1,"99":3,"235":1,"236":1,"364":1,"365":1}}],["721",{"0":{"41":1,"227":1,"465":1},"2":{"35":1,"61":1,"227":2,"465":2}}],["5931",{"2":{"449":1}}],["50",{"2":{"437":3}}],["500",{"2":{"80":1}}],["5",{"0":{"223":1,"329":1,"461":1},"2":{"85":1,"99":3,"142":1,"161":1,"185":2,"236":1,"247":1,"257":1,"340":1,"365":1,"384":2,"385":3}}],["~0",{"2":{"73":1}}],["`failedtransactionresponse`",{"2":{"449":1}}],["`wallet",{"2":{"436":1}}],["`walletproxybytecode`",{"2":{"389":1}}],["`mainmodule`",{"2":{"389":1}}],["`authorize",{"2":{"221":1,"459":1}}],["`invalid",{"2":{"214":1,"453":1}}],["`proof",{"2":{"214":1,"453":1}}],["`senttransactionresponse`",{"2":{"449":1}}],["`sequenceconfig`",{"2":{"139":2}}],["`something",{"2":{"80":2}}],["`https",{"2":{"85":3}}],["`block",{"2":{"80":1}}],["`unauthorized",{"2":{"80":1}}],["`unauthorized`",{"2":{"80":1}}],["`unexpected",{"2":{"66":2,"72":1}}],["`$",{"2":{"80":1,"92":2,"360":2,"434":2,"435":2,"436":2,"437":2,"438":2,"448":2,"449":2}}],["`your",{"2":{"77":1}}],["`",{"2":{"66":2,"72":1,"77":1,"80":5,"85":2,"92":2,"167":4,"172":6,"175":4,"214":1,"221":1,"360":2,"434":2,"435":2,"436":3,"437":2,"438":2,"448":2,"449":2,"453":1,"459":1}}],["$",{"2":{"66":2,"72":1,"77":1,"80":4,"85":2,"214":2,"436":1,"453":2}}],["815189234z",{"2":{"437":1}}],["815189174z",{"2":{"437":1}}],["819722082z",{"2":{"437":1}}],["8545",{"2":{"394":1}}],["8",{"0":{"332":1},"2":{"62":1,"139":2}}],["09t18",{"2":{"437":2}}],["03",{"2":{"437":3}}],["02t18",{"2":{"437":4}}],["0a1",{"2":{"139":1}}],["0b3",{"2":{"139":1}}],["0",{"0":{"248":1,"259":1},"2":{"61":1,"83":1,"84":1,"126":3,"129":1,"139":2,"150":2,"158":1,"160":3,"235":3,"242":2,"248":3,"259":3,"340":1,"352":1,"364":3,"394":1,"407":1,"410":1,"415":1,"425":1,"430":1,"438":1,"448":2,"449":1}}],["0x4d4ee1b8583e31fe789eaf2e1b6e011c220c10b6",{"2":{"448":2,"449":1}}],["0x4fbf69aa2a75f9942a768dc8da7804ec965f7bea",{"2":{"384":1,"385":2}}],["0x3c4e11e4dbf23b87c14bd75d0da9c75707392d21",{"2":{"437":2}}],["0x5c4eeb02dabf8976016ab414d617f9a162936dcace3cdef8c69ef6e262ad5ae7",{"2":{"448":1}}],["0x574372ff1a0eede68b5358cce7bbb93155a9dfe0",{"2":{"437":2}}],["0x596af90cecdbf9a768886e771178fd5561dd27ab",{"2":{"384":1,"385":2,"394":1}}],["0xe6b9b21c077f382333220a072e4c44280b873907",{"2":{"418":1}}],["0xec9a7204a43d3f4a82c84fde92d25bfc9110981e",{"2":{"384":1,"385":1}}],["0xd72c236be524ec24f72329317e2785e687105b69",{"2":{"448":1}}],["0xd6043fe6f06d90ec2cb36ca5cd1b193a8515f350",{"2":{"434":1}}],["0xd130b43062d875a4b7af3f8fc036bc6e9d3e1b3e",{"2":{"418":1}}],["0xd01f11855bccb95f88d7a48492f66410d4637313",{"2":{"389":1,"418":1}}],["0x061150e5574716dbb1a2cdf54b3dce9f94395f65",{"2":{"446":1}}],["0x02390f3e6e5fd1c6786cb78fd3027c117a9955a7",{"2":{"418":1}}],["0x0",{"2":{"415":1}}],["0x0000000000000000000000000000000000000000000000000000000000000000",{"2":{"448":1}}],["0x0000000000000000000000001119e72b4af230becebd933d0e07f0eec51d8c2a0000000000000000000000000000000000000000000000000000000000000001",{"2":{"448":1}}],["0x00",{"2":{"85":1,"334":1,"449":1}}],["0xcccccccccccccccccccccccccccccccccccccccc",{"2":{"414":1}}],["0xc2be9cf6d9ee4fd211f88620760e829792659b16",{"2":{"379":2}}],["0xf2e9f728abd65089f25efda5852e605ced377f4e2c89dbf143b124623ed09b2c",{"2":{"448":1}}],["0xff",{"2":{"389":1}}],["0xf9d09d634fb818b05149329c1dccfaea53639d96",{"2":{"389":1,"418":1}}],["0x6b175474e89094c44da98b954eedeac495271d0f",{"2":{"444":1}}],["0x63a21cca14ed7454b9cf6466af422b5c597c6b57",{"2":{"434":1}}],["0x631998e91476da5b870d741192fc5cbc55f5a52e",{"2":{"24":2,"30":1,"39":3,"41":3,"43":3,"47":1,"50":7,"52":3,"56":3,"57":3,"121":1}}],["0x603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3",{"2":{"389":1}}],["0x6192e0fdcd868b3de01c7fbc0ad98baebd7330c1",{"2":{"384":1,"385":2}}],["0x153824576d03629b264683b430bbf9acea1d0975",{"2":{"449":1}}],["0x1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881",{"2":{"448":1}}],["0x1626ba7e",{"2":{"415":2}}],["0x1693ffc74edbb50d6138517fe5cd64fd1c917709",{"2":{"340":1,"379":2}}],["0x17b66009af459dc8ebf37acf8a8b355379be2fe5",{"2":{"43":2}}],["0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",{"2":{"414":1}}],["0xb537a160472183f2150d42eb1c3dd6684a55f74c",{"2":{"340":1,"379":2}}],["0xb392c99d9f8e3e0b248e5c283818be5bf5cecca7",{"2":{"336":1}}],["0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d",{"2":{"61":2}}],["0x9766bf76b2e3e7bcb8c61410a3fc873f1e89b43f",{"2":{"143":2}}],["0x9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6",{"2":{"77":1}}],["0x",{"2":{"80":1,"84":1,"228":3,"229":1,"445":1,"449":1,"466":3,"467":1}}],["0xacc36ed4ef40db74137266e48d863083a5c7e85e2735d69adafcb5b362b6cfc0",{"2":{"448":1}}],["0xa9c88358862211870db6f18bc9b3f6e4f8b3eae7",{"2":{"340":1,"379":2}}],["0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4",{"2":{"43":2}}],["0xabc",{"2":{"23":1,"24":1,"32":1,"37":1}}],["0x7efe6ce415956c5f80c6530cc6cc81b4808f6118",{"2":{"418":1}}],["0x7c0ebabfc394ec6d926e801fe0e69a1f15a7fe4d",{"2":{"43":2}}],["0x7227e371540cf7b8e512544ba6871472031f3335",{"2":{"43":2,"61":1}}],["0x27cabc9700ee6db2797b6ac1e1ece81c72a2cd8d",{"2":{"444":1}}],["0x27a11c1563a5dda238379b95c91b3abbad9c0cf6",{"2":{"62":2}}],["0x2791bca1f2de4661ed88a30c99a7a9449aa84174",{"2":{"43":2,"66":1,"120":1}}],["0x2953399124f0cbb46d2cbacd8a89cf0599974963",{"2":{"43":2}}],["0x839ee023b21f4ffe2294025de0ac30ba7278d6fd",{"2":{"449":2}}],["0x8f3cf7ad23cd3cadbd9735aff958023239c6a063",{"2":{"43":2}}],["0x8bb759bb68995343ff1e9d57ac85ff5c5fb79334",{"2":{"30":1}}],["0x8e3e38fe7367dd3b52d1e281e4e8400447c8d8b9",{"2":{"23":1,"24":1,"32":1,"37":1}}],["0xsequence",{"0":{"188":1},"2":{"23":2,"24":2,"27":5,"28":2,"30":1,"32":2,"37":2,"39":2,"41":2,"43":2,"46":4,"47":2,"56":2,"57":4,"66":2,"72":1,"77":1,"80":5,"85":2,"90":1,"92":1,"93":2,"99":10,"100":2,"101":4,"102":1,"103":1,"117":4,"118":1,"122":1,"124":1,"129":1,"187":1,"188":3,"213":1,"214":4,"219":1,"231":1,"232":2,"235":7,"236":3,"241":1,"242":5,"243":1,"248":4,"251":1,"252":5,"253":1,"259":4,"261":1,"262":2,"269":2,"271":1,"277":1,"279":1,"283":1,"358":1,"360":1,"364":7,"365":3,"413":1,"414":2,"434":1,"435":1,"436":1,"437":1,"438":1,"448":1,"449":1,"452":1,"453":4,"457":1,"469":1,"470":2}}],["qmw5gvygwb98gsn8vjtrwu4pln6jryexnxzknwpphvwtdm",{"2":{"333":1}}],["qmdjzqexj2wnny7pnnn4kauzckjh4va5xhoxmmis919ev3",{"2":{"326":1}}],["qmuqgkka8ew7exiuhnmwz4uoxa11wv7nfjhaogvabassyy",{"2":{"61":1}}],["qr",{"2":{"210":2}}],["quantstamp",{"0":{"420":1},"2":{"419":1}}],["quantityremaining",{"2":{"379":1}}],["quantityraw",{"2":{"121":1}}],["quantity",{"2":{"379":1}}],["quicker",{"2":{"159":1}}],["quickly",{"2":{"88":1,"339":1,"356":1,"363":1}}],["quickstart",{"0":{"86":1,"337":1,"354":1,"361":1},"1":{"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"338":1,"339":1,"340":1,"355":1,"356":1,"357":1,"358":1,"359":1,"360":1,"362":1,"363":1,"364":1,"365":1},"2":{"182":1,"186":1}}],["quite",{"2":{"49":1}}],["quot",{"2":{"4":4,"7":8,"23":26,"24":30,"28":8,"30":16,"32":24,"37":30,"39":28,"41":26,"42":2,"43":46,"47":8,"50":78,"55":2,"56":44,"57":56,"61":93,"62":68,"66":8,"72":8,"73":4,"75":2,"77":14,"80":40,"81":8,"83":12,"84":12,"85":2,"129":8,"130":14,"131":4,"133":2,"139":58,"143":8,"144":10,"150":12,"153":2,"154":2,"157":2,"158":2,"167":14,"179":2,"188":38,"199":2,"200":2,"201":12,"202":2,"203":6,"204":4,"205":2,"210":2,"213":2,"235":13,"236":4,"243":6,"283":8,"284":2,"285":2,"298":4,"299":4,"302":4,"304":4,"306":4,"308":6,"317":8,"319":4,"325":12,"326":12,"329":2,"330":2,"335":4,"336":2,"340":32,"360":4,"364":13,"365":4,"379":60,"382":4,"383":10,"384":28,"389":20,"394":6,"413":4,"415":2,"419":6,"423":2,"424":2,"429":2,"430":4,"432":2,"434":14,"435":10,"436":26,"437":86,"438":6,"443":2,"444":6,"445":6,"446":6,"448":74,"449":76,"452":2}}],["queried",{"2":{"379":1,"409":1,"410":1}}],["queries",{"2":{"27":1,"28":1,"35":1,"316":1}}],["querycontractmessagesender",{"2":{"319":1}}],["querycontract",{"2":{"319":2}}],["queryclientprovider",{"2":{"100":3,"101":5,"117":2,"124":2}}],["queryclient",{"2":{"100":4,"101":5,"117":1,"124":1}}],["querying",{"0":{"319":1},"2":{"30":1,"50":1,"61":1,"62":1,"64":1,"316":1,"319":1,"321":1}}],["query",{"0":{"10":1},"2":{"2":1,"23":1,"24":1,"25":1,"27":1,"28":1,"32":1,"33":3,"37":1,"39":6,"41":6,"42":2,"45":1,"49":3,"50":6,"55":2,"99":3,"100":1,"101":1,"319":3}}],["questions",{"2":{"214":1,"237":1,"453":1}}],["question",{"2":{"0":1}}],["911",{"2":{"333":1}}],["9",{"0":{"333":1},"2":{"61":3}}],["6492",{"2":{"214":1,"453":1}}],["6",{"0":{"224":1,"330":1,"462":1},"2":{"134":1,"341":1,"373":1}}],["6f1",{"2":{"127":1}}],["66597",{"2":{"121":1}}],["65548",{"2":{"62":3}}],["65535",{"2":{"425":1}}],["65535required",{"2":{"382":1}}],["65539",{"2":{"56":2,"57":1}}],["65538",{"2":{"56":2,"57":1}}],["65537",{"2":{"56":2,"57":1}}],["65556",{"2":{"50":1}}],["6x",{"2":{"50":1,"62":1}}],["230",{"2":{"436":1}}],["24th",{"2":{"420":1}}],["2nd",{"2":{"420":1}}],["255",{"2":{"383":1}}],["2fa",{"2":{"134":2}}],["22",{"2":{"50":2,"437":3}}],["2123",{"2":{"437":2}}],["21",{"2":{"50":2,"52":1}}],["2",{"0":{"71":1,"77":1,"135":1,"220":1,"288":1,"326":1,"352":1,"458":1},"1":{"78":1,"79":1,"136":1,"137":1,"138":1,"139":1,"140":1},"2":{"50":1,"56":1,"57":2,"62":1,"77":1,"85":1,"99":3,"129":1,"139":2,"161":1,"185":1,"286":1,"325":1,"340":1,"350":2,"352":2,"384":2,"385":4,"387":2,"430":1}}],["2020",{"2":{"420":1,"421":1}}],["2023",{"2":{"139":4,"422":1,"437":4}}],["2022",{"2":{"139":3}}],["2021",{"2":{"127":1,"139":1,"420":1}}],["200000000000000000000",{"2":{"444":1}}],["200",{"2":{"80":1,"206":1,"444":1}}],["20",{"0":{"226":1,"464":1},"2":{"50":8,"52":2,"66":1,"73":2,"74":1,"226":3,"227":1,"228":1,"464":3,"465":1,"466":1}}],["42",{"2":{"437":4}}],["42161",{"2":{"66":1,"72":1,"444":1,"448":1}}],["401",{"2":{"80":2}}],["400",{"2":{"80":6}}],["4",{"0":{"85":1,"222":1,"328":1,"460":1},"2":{"50":1,"74":1,"75":1,"340":1,"384":1,"414":1}}],["486",{"2":{"4":8}}],["🌄",{"2":{"26":1}}],["\tmessage",{"2":{"414":1}}],["\tdomain",{"2":{"414":1}}],["\tprimarytype",{"2":{"414":1}}],["\ttypes",{"2":{"414":1}}],["\ttry",{"2":{"85":1}}],["\ttokenbalances",{"2":{"23":1,"32":1}}],["\treturn",{"2":{"85":1}}],["\tconst",{"2":{"85":12}}],["\tcontractaddress",{"2":{"24":1,"39":1,"41":1}}],["\t\twallet",{"2":{"414":1}}],["\t\tverifyingcontract",{"2":{"414":1}}],["\t\tversion",{"2":{"414":1}}],["\t\tcount",{"2":{"414":1}}],["\t\tcontractaddress",{"2":{"39":1,"41":1}}],["\t\tchainid",{"2":{"414":1}}],["\t\tname",{"2":{"414":2}}],["\t\tnetworks",{"2":{"85":1}}],["\t\tperson",{"2":{"414":1}}],["\t\tposition",{"2":{"105":1}}],["\t\tprojectaccesskey",{"2":{"85":1}}],["\t\tdefaulttheme",{"2":{"105":1}}],["\t\tthrow",{"2":{"85":1}}],["\t\treturn",{"2":{"85":1}}],["\t\tsigner",{"2":{"85":1}}],["\t\tsettings",{"2":{"85":1}}],["\t\t",{"2":{"85":3,"105":1,"414":1}}],["\t\t\t\t",{"2":{"85":1}}],["\t\t\t\t\turl",{"2":{"85":1}}],["\t\t\t\tprovider",{"2":{"85":1}}],["\t\t\t\turl",{"2":{"85":1}}],["\t\t\trelayer",{"2":{"85":1}}],["\t\t\trpcurl",{"2":{"85":1}}],["\t\t\tprovider",{"2":{"85":1}}],["\t\t\t",{"2":{"85":2,"414":3}}],["\t\taccountaddress",{"2":{"37":1}}],["\t\tlog",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1}}],["\tfilter",{"2":{"37":2,"39":2,"41":1}}],["\tfmt",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1}}],["\tverifiedonly",{"2":{"28":1}}],["\tnftbalances",{"2":{"24":1}}],["\tif",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1}}],["\tincludemetadata",{"2":{"23":2,"24":2,"32":1,"37":2,"39":1,"41":2}}],["\tseqindexer",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1}}],["\t",{"2":{"23":6,"24":6,"28":1,"32":7,"37":9,"39":9,"41":8,"43":1,"47":1,"56":1,"57":2,"85":11,"105":1,"414":3}}],["\taccountaddress",{"2":{"23":1,"24":1,"32":1,"37":1}}],["+=",{"2":{"141":1,"142":2,"153":1,"154":2}}],["+1",{"2":{"62":2}}],["+",{"2":{"8":1,"24":1,"129":1,"131":1,"167":1,"179":1,"187":1,"208":1,"241":2,"250":2,"251":3,"260":2,"261":2,"267":1,"277":1,"279":1,"316":1,"333":1,"378":1,"385":4,"413":2,"433":2,"439":1}}],["==",{"2":{"430":1}}],["===",{"2":{"66":1,"80":10,"224":1,"462":1}}],["=0",{"2":{"250":1}}],["=",{"0":{"248":1,"259":1},"2":{"7":3,"23":7,"24":8,"27":2,"28":5,"32":7,"37":8,"39":9,"41":8,"43":4,"46":1,"47":2,"56":4,"57":8,"66":20,"72":9,"73":6,"77":8,"80":14,"81":4,"82":1,"85":17,"92":1,"100":8,"101":10,"102":6,"103":5,"105":1,"117":2,"118":6,"119":1,"120":2,"123":4,"124":3,"145":2,"147":2,"149":2,"152":1,"154":2,"167":7,"172":2,"175":2,"188":11,"189":1,"212":2,"213":2,"214":6,"219":3,"220":3,"221":2,"222":3,"223":2,"224":1,"225":3,"226":12,"227":13,"228":13,"229":13,"242":1,"243":2,"248":1,"253":1,"259":1,"263":3,"271":2,"272":5,"282":3,"283":3,"287":2,"288":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":2,"296":1,"298":2,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":2,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":2,"316":1,"317":10,"319":6,"320":2,"321":7,"360":1,"379":2,"385":3,"387":3,"389":6,"394":4,"402":1,"407":1,"408":1,"413":3,"414":4,"415":1,"418":1,"431":2,"434":3,"435":6,"436":14,"437":2,"438":2,"442":1,"443":2,"444":2,"445":1,"446":2,"448":2,"449":2,"451":2,"452":2,"453":6,"457":3,"458":3,"459":2,"460":3,"461":2,"462":1,"463":3,"464":12,"465":13,"466":13,"467":13}}],["yet",{"2":{"159":1,"407":1,"410":1}}],["yes",{"2":{"130":1}}],["y",{"2":{"126":1,"160":1}}],["yarn",{"2":{"7":1,"27":1,"99":1,"117":1,"235":1,"242":1,"248":1,"252":1,"259":1,"262":1,"364":1}}],["you",{"2":{"1":1,"3":4,"4":5,"6":2,"23":2,"24":1,"25":1,"26":3,"27":3,"28":2,"32":1,"33":1,"34":1,"35":1,"37":1,"39":3,"41":2,"46":1,"49":1,"50":6,"53":1,"62":1,"63":2,"65":2,"66":5,"67":4,"73":4,"74":3,"75":3,"76":1,"77":4,"78":1,"82":2,"83":3,"84":3,"85":2,"90":1,"91":2,"92":2,"94":1,"97":1,"98":1,"99":1,"102":1,"104":1,"105":1,"122":2,"123":3,"124":2,"127":1,"129":5,"130":6,"131":8,"132":4,"133":2,"136":1,"137":1,"139":4,"141":5,"142":6,"143":3,"144":3,"145":5,"146":3,"147":5,"148":3,"149":5,"150":13,"151":3,"152":1,"153":4,"154":8,"155":4,"157":1,"158":5,"159":4,"163":4,"164":2,"165":7,"167":5,"168":3,"169":5,"172":4,"174":7,"175":2,"177":1,"178":1,"179":2,"181":4,"182":2,"184":2,"185":2,"187":2,"188":9,"210":1,"213":4,"214":4,"224":1,"225":1,"226":2,"227":1,"228":1,"229":1,"233":1,"234":4,"235":3,"237":6,"240":1,"242":1,"248":1,"259":1,"284":2,"288":2,"289":1,"293":3,"294":3,"295":2,"296":4,"298":2,"315":1,"316":4,"317":7,"318":2,"319":3,"320":2,"321":4,"322":2,"324":1,"325":4,"328":1,"331":1,"332":4,"333":4,"334":1,"335":1,"336":5,"341":2,"349":1,"351":3,"352":2,"358":1,"359":2,"360":2,"364":2,"368":1,"373":2,"433":3,"435":1,"436":2,"441":1,"446":1,"452":4,"453":4,"462":1,"463":1,"464":2,"465":1,"466":1,"467":1,"471":1,"472":4}}],["yourself",{"2":{"351":1,"433":1}}],["yoursite",{"2":{"188":2,"200":1}}],["yours",{"2":{"181":1}}],["yourcallshowauthfailurescreen",{"2":{"167":1}}],["yourcallreadytoreceivecode",{"2":{"167":1}}],["your",{"0":{"125":1,"188":1,"208":1,"238":1,"325":1,"327":1,"330":1,"366":1},"1":{"239":1,"367":1},"2":{"0":1,"3":2,"4":3,"5":1,"6":2,"7":2,"8":2,"11":1,"22":1,"23":1,"25":2,"26":2,"28":1,"30":4,"31":1,"32":1,"33":3,"35":1,"36":1,"38":1,"40":1,"42":1,"46":2,"47":1,"49":1,"50":1,"55":1,"59":2,"63":1,"65":2,"66":11,"67":3,"72":3,"73":2,"74":1,"75":5,"77":7,"78":2,"80":4,"81":2,"82":1,"83":4,"84":5,"95":2,"96":3,"97":1,"98":1,"100":3,"117":1,"123":2,"124":2,"125":2,"126":1,"129":3,"130":2,"131":3,"132":3,"133":2,"139":1,"141":1,"144":2,"145":1,"147":1,"149":1,"150":1,"151":1,"154":4,"155":2,"157":2,"158":3,"159":1,"165":5,"167":1,"168":4,"169":1,"172":4,"174":1,"176":1,"177":1,"179":2,"180":2,"181":7,"183":1,"184":1,"185":1,"186":1,"187":2,"188":8,"200":1,"210":1,"213":4,"214":5,"234":3,"235":4,"237":2,"238":2,"239":3,"240":1,"284":1,"296":3,"297":1,"315":1,"321":2,"322":1,"324":1,"325":2,"326":2,"327":2,"328":1,"329":3,"330":2,"331":1,"332":3,"334":2,"335":1,"336":1,"351":1,"352":1,"364":4,"366":2,"367":3,"368":1,"371":1,"413":1,"414":1,"433":1,"434":1,"441":1,"452":4,"453":5,"472":3}}],["range",{"2":{"302":1}}],["randomly",{"2":{"75":1,"76":1}}],["randomnoncespace2",{"2":{"73":2}}],["randomnoncespace1",{"2":{"73":2}}],["randombytes",{"2":{"73":2,"220":1,"458":1}}],["random",{"2":{"62":1,"73":1,"287":1,"401":1,"426":1}}],["rainbow",{"2":{"251":1,"253":1,"345":1}}],["rainbowkit",{"0":{"251":1},"1":{"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1},"2":{"237":1,"245":1,"251":3,"252":3,"253":3,"255":1,"258":1,"260":1}}],["ramps",{"0":{"341":1,"373":1}}],["ramp",{"2":{"188":2,"204":1,"341":5,"373":5}}],["ration",{"2":{"200":1}}],["ratio",{"2":{"188":2}}],["rather",{"2":{"142":1,"316":1}}],["raw",{"2":{"143":2}}],["rawtransactions",{"2":{"145":1,"147":1,"149":1}}],["rawtransaction",{"0":{"143":1},"2":{"143":1,"145":2,"147":2,"149":2,"151":2}}],["risks",{"2":{"378":1}}],["ripped",{"2":{"130":1}}],["right",{"2":{"108":3,"126":1,"158":1,"184":1,"431":1}}],["rotation",{"2":{"347":1}}],["rotate",{"2":{"172":1}}],["root",{"2":{"132":1,"436":1}}],["router=",{"2":{"436":1}}],["routerprovider",{"2":{"436":2}}],["router",{"2":{"249":6,"250":2,"258":6,"260":2,"436":7}}],["route",{"2":{"131":1,"316":1}}],["robust",{"2":{"95":1,"238":1,"366":1}}],["role",{"2":{"77":6}}],["runtime",{"2":{"390":1}}],["runs",{"2":{"188":2}}],["running",{"2":{"179":1,"189":1,"283":1}}],["run",{"2":{"75":1,"127":1,"179":4,"187":1}}],["rpcurl",{"2":{"7":2,"85":2,"214":3,"453":3}}],["rpc",{"0":{"53":1,"54":1},"2":{"6":2,"7":2,"23":2,"24":2,"26":2,"30":3,"32":2,"37":2,"39":2,"41":2,"43":2,"49":6,"51":3,"53":2,"54":1,"56":2,"57":4,"296":2,"340":1,"349":1,"379":2}}],["revertreason",{"2":{"448":2}}],["revert",{"2":{"404":1}}],["revertonerror",{"0":{"404":1},"2":{"402":2,"404":1,"407":1,"408":1}}],["reverted",{"2":{"66":1,"448":1}}],["rejected",{"2":{"393":1,"401":1}}],["region",{"2":{"341":1,"373":1}}],["registers",{"2":{"179":1}}],["registersession",{"2":{"172":1,"174":1}}],["registering",{"2":{"173":1}}],["registered",{"2":{"168":1,"174":1}}],["register",{"2":{"135":2,"172":2}}],["registry",{"2":{"33":1}}],["rewrite",{"2":{"321":2}}],["retrieving",{"0":{"409":1,"410":1},"1":{"410":1}}],["retrieve",{"2":{"188":1,"224":1,"225":1,"379":1,"462":1,"463":1}}],["returning",{"2":{"66":2,"446":1}}],["returns",{"2":{"42":1,"74":2,"145":1,"147":1,"149":1,"290":1,"396":1,"410":1,"415":1,"437":1,"442":1,"443":4,"444":2}}],["return",{"0":{"398":1},"2":{"4":1,"23":3,"24":1,"37":1,"41":1,"61":1,"62":1,"66":2,"72":1,"80":17,"83":1,"84":1,"85":2,"100":1,"101":2,"102":1,"103":1,"117":1,"118":1,"123":2,"124":1,"143":1,"194":1,"282":2,"283":2,"309":1,"314":1,"319":1,"409":1,"415":5,"431":4,"436":3,"446":1,"447":1,"448":1}}],["returned",{"2":{"4":2,"30":1,"57":1,"135":1,"174":1,"198":1,"213":1,"413":1,"414":1,"449":1,"452":1}}],["remaining",{"2":{"375":1}}],["remember",{"2":{"179":1,"434":1}}],["removed",{"2":{"378":1}}],["remove",{"2":{"378":1}}],["removing",{"2":{"150":1}}],["remoteconfigtracker",{"2":{"214":1,"453":1}}],["remotely",{"2":{"187":1}}],["remote",{"0":{"14":1},"2":{"214":1,"413":1,"414":1,"453":1}}],["relevant",{"2":{"448":1}}],["release",{"2":{"131":1}}],["reload",{"2":{"336":1}}],["rely",{"2":{"124":1}}],["relayed",{"2":{"72":1}}],["relayerurl",{"2":{"85":2}}],["relayer",{"0":{"8":1,"74":1},"1":{"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"8":6,"11":2,"66":2,"73":1,"74":2,"77":4,"85":1}}],["relaying",{"0":{"65":1},"1":{"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1},"2":{"67":1,"234":1,"472":1}}],["redirect",{"2":{"191":1}}],["reducing",{"2":{"172":1}}],["reduced",{"2":{"429":1}}],["reduce",{"2":{"23":1,"24":1,"37":1,"41":1,"217":1,"386":1,"455":1}}],["reddit",{"2":{"141":1,"142":1,"153":1,"154":1}}],["redeploy",{"2":{"83":1,"85":1}}],["recursive",{"2":{"431":1}}],["recent",{"2":{"249":1,"258":1,"301":1}}],["receipts",{"0":{"447":1},"1":{"448":1,"449":1},"2":{"294":1,"447":2,"448":1}}],["receipt",{"2":{"151":1,"292":1,"294":1,"314":1,"315":1,"317":5,"320":1,"321":2,"448":5,"449":1}}],["receives",{"2":{"443":1}}],["received",{"2":{"141":1,"174":1}}],["receive",{"2":{"77":1,"134":1,"151":1,"154":1,"168":1,"293":2,"294":2,"316":1,"318":1}}],["recovery",{"2":{"347":1,"353":1}}],["recoveredsessionaddress",{"2":{"224":2,"462":2}}],["recognize",{"2":{"131":1,"154":1}}],["recommendations",{"2":{"378":1}}],["recommended",{"0":{"129":1},"1":{"130":1},"2":{"142":1,"144":1,"145":1,"147":1,"149":1,"150":1,"153":1,"154":1,"253":1,"282":1,"283":1,"295":1,"298":1,"308":1,"315":1,"316":1,"321":1}}],["recommend",{"2":{"27":1,"30":1,"46":1,"49":1,"51":1,"63":1,"133":2,"150":1,"152":1,"154":1,"185":1}}],["recipient4address",{"2":{"229":1,"467":1}}],["recipient3address",{"2":{"229":1,"467":1}}],["recipient2address",{"2":{"226":1,"227":1,"228":1,"229":2,"464":1,"465":1,"466":1,"467":2}}],["recipient2",{"2":{"73":1}}],["recipient1address",{"2":{"226":1,"227":1,"228":1,"229":2,"464":1,"465":1,"466":1,"467":2}}],["recipient1",{"2":{"73":1}}],["recipient",{"2":{"66":1,"226":1,"227":1,"228":1,"444":1,"464":1,"465":1,"466":1}}],["recipientaddress",{"2":{"66":1,"72":1,"225":1,"226":1,"227":1,"228":1,"315":1,"463":1,"464":1,"465":1,"466":1}}],["represent",{"2":{"427":1}}],["represents",{"2":{"407":1,"429":1,"430":1}}],["represented",{"2":{"64":1,"143":2,"428":1}}],["reports",{"2":{"419":1}}],["repo",{"2":{"208":1}}],["repository",{"2":{"75":1,"104":1,"436":1}}],["replay",{"2":{"195":1,"436":1}}],["replaced",{"2":{"155":1}}],["replace",{"0":{"215":1},"2":{"7":1,"83":1,"84":1,"130":1,"132":1,"139":1,"155":1,"375":1,"378":1,"432":1}}],["reflect",{"2":{"210":1}}],["referencing",{"2":{"393":1,"401":1,"406":1}}],["references",{"2":{"27":1,"28":1,"419":1}}],["reference",{"0":{"49":1},"1":{"50":1,"51":1,"52":1,"53":1,"54":1},"2":{"26":2,"53":2,"133":1,"145":1,"147":1,"149":1}}],["referred",{"2":{"148":1}}],["refer",{"2":{"90":1,"100":1,"123":1,"176":1,"177":1,"358":1}}],["refreshedat",{"2":{"437":2}}],["refreshes",{"2":{"158":1}}],["refreshjobstatus",{"2":{"57":3}}],["refreshjob",{"2":{"57":1}}],["refresh",{"0":{"196":1},"2":{"57":3,"58":2,"196":2,"336":3}}],["refreshing",{"0":{"57":1},"1":{"58":1}}],["rendered",{"2":{"199":1,"281":1,"282":1,"283":4,"401":1,"407":1}}],["rendering",{"2":{"37":1,"249":1,"258":1,"281":1,"282":2}}],["render",{"2":{"33":2,"41":1,"281":1,"404":1,"436":1}}],["reason",{"2":{"407":1,"448":1,"449":1}}],["reasons",{"2":{"401":1}}],["reaches",{"2":{"430":1}}],["reached",{"2":{"413":1,"414":1}}],["reach",{"2":{"159":1,"214":1,"237":1,"453":1}}],["reactdom",{"2":{"436":1}}],["react",{"0":{"104":1,"268":1},"1":{"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1},"2":{"99":3,"100":1,"101":1,"103":1,"237":1,"268":3,"269":1,"271":2,"272":1,"276":1,"436":8}}],["really",{"2":{"234":1,"298":1,"472":1}}],["realm",{"2":{"95":1,"151":1,"238":1,"366":1}}],["real",{"2":{"30":1,"33":1,"349":1}}],["reader",{"2":{"214":1,"453":1}}],["reading",{"0":{"394":1},"2":{"152":1}}],["readable",{"2":{"144":1,"150":1}}],["ready",{"2":{"97":1,"168":1,"240":1,"331":1,"336":1,"368":1}}],["read",{"0":{"152":1},"2":{"26":1,"45":1,"53":1,"61":1,"73":1,"131":2,"144":2,"188":1,"319":1,"336":1,"394":1}}],["re",{"2":{"27":1,"33":1,"46":1,"65":1,"74":1,"97":1,"126":1,"141":2,"142":1,"144":1,"150":3,"153":1,"154":1,"160":1,"169":1,"187":1,"196":1,"240":1,"368":1,"432":1}}],["resource",{"2":{"130":1}}],["resources",{"2":{"129":1,"132":6}}],["res",{"2":{"80":4,"139":2,"379":3,"434":2}}],["resulting",{"2":{"413":1,"414":1,"415":1}}],["result",{"2":{"50":1,"74":1,"76":1,"77":1,"142":2,"143":1,"154":3,"164":2,"172":1,"319":1,"392":1,"430":1,"443":2,"449":1}}],["results",{"2":{"30":3,"158":1}}],["restofonboardparams",{"2":{"263":1}}],["restwallets",{"2":{"263":1}}],["restarted",{"2":{"139":1}}],["rest",{"0":{"49":1,"52":1},"1":{"50":1,"51":1,"52":1,"53":1,"54":1},"2":{"45":1,"49":3,"51":2,"52":1,"282":1,"283":1,"288":1,"351":1,"395":1}}],["respect",{"2":{"415":1}}],["respectively",{"2":{"430":1,"446":1}}],["respective",{"2":{"29":1,"48":1,"237":1}}],["responsibility",{"2":{"401":1,"430":1}}],["responsible",{"2":{"165":1}}],["responsive",{"2":{"172":1,"296":1}}],["responses",{"2":{"50":1}}],["response",{"0":{"448":1,"449":1},"2":{"23":1,"24":1,"37":2,"41":1,"50":2,"61":1,"80":19,"175":2,"229":4,"316":1,"379":1,"448":2,"449":2,"467":4}}],["resilient",{"2":{"6":1,"33":1}}],["requiring",{"2":{"188":1,"216":1,"217":1,"321":1,"446":1,"454":1,"455":1}}],["requirefreshsigner",{"2":{"418":1}}],["requirements",{"0":{"127":1,"161":1},"2":{"135":1}}],["required",{"2":{"82":1,"126":1,"138":1,"167":1,"187":1,"305":1,"316":1,"350":1,"352":1,"424":1,"430":1,"444":1}}],["require",{"2":{"8":1,"175":1,"214":1,"217":1,"281":1,"283":1,"321":1,"377":1,"406":1,"432":1,"434":1,"440":1,"441":1,"453":1,"455":1}}],["requires",{"2":{"2":1,"3":1,"5":1,"23":1,"27":1,"43":1,"46":1,"56":1,"155":1,"172":1,"225":1,"235":1,"296":1,"364":1,"444":1,"463":1}}],["requests",{"2":{"11":1,"26":1,"53":1,"77":1,"210":1,"296":1}}],["request",{"2":{"3":1,"4":1,"5":1,"23":1,"24":1,"32":1,"37":1,"39":1,"41":1,"42":1,"43":1,"50":2,"55":1,"56":1,"57":3,"80":20,"83":1,"85":6,"125":1,"151":1,"210":1,"340":1,"379":1,"448":1,"449":1}}],["vulnerate",{"2":{"353":1}}],["v6",{"0":{"268":1},"1":{"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1},"2":{"268":2,"269":1,"271":1,"276":1}}],["vocs",{"0":{"215":1}}],["void",{"2":{"141":1,"142":3,"153":2,"154":3,"167":5,"175":2}}],["v3",{"2":{"214":1,"453":1}}],["v2",{"2":{"66":2,"214":2,"278":1,"424":1,"453":2}}],["v1",{"2":{"66":1}}],["v18",{"2":{"27":1,"46":1}}],["ve",{"2":{"59":1,"63":1,"130":1,"136":1,"137":1,"141":2,"145":1,"146":1,"147":1,"149":1,"150":1,"158":1,"167":2,"168":1,"172":2,"174":1,"187":2,"237":1,"284":1,"296":1,"321":1,"332":1,"335":1}}],["verifies",{"2":{"415":1}}],["verified",{"2":{"23":1,"24":1,"30":3,"37":1,"41":1,"142":1,"192":1,"353":1,"415":1}}],["verifiedonly",{"2":{"23":2,"24":2,"30":2,"37":2,"41":2}}],["verifiable",{"2":{"217":1,"455":1}}],["verification",{"0":{"415":1},"2":{"80":1,"412":1,"440":1,"441":1}}],["verifying",{"2":{"352":1}}],["verifymessage",{"2":{"224":1,"462":1}}],["verify",{"0":{"222":1,"224":1,"460":1,"462":1},"2":{"80":5,"213":2,"214":1,"222":1,"224":1,"234":1,"351":1,"452":2,"453":1,"460":1,"462":1,"472":1}}],["version=",{"2":{"139":2}}],["versioning",{"2":{"126":1,"160":1}}],["versions",{"0":{"248":1,"259":1,"282":1},"2":{"66":1,"139":3,"250":1,"268":1,"281":1}}],["version",{"0":{"283":1},"2":{"66":2,"126":3,"130":1,"131":1,"158":1,"160":3,"235":1,"242":2,"248":2,"250":2,"259":2,"281":1,"364":1}}],["versus",{"2":{"66":1}}],["versa",{"2":{"63":1}}],["very",{"2":{"30":1,"132":1,"143":1,"154":1,"175":1,"179":1,"187":1}}],["v",{"2":{"57":2}}],["vs",{"0":{"63":1},"2":{"49":1}}],["vision",{"2":{"435":1}}],["visibility",{"2":{"172":1}}],["visible",{"2":{"172":1,"341":1,"373":1}}],["virtual",{"2":{"346":1,"415":1}}],["viem",{"2":{"99":4,"248":1,"259":1}}],["viewable",{"2":{"142":1}}],["viewer",{"0":{"84":1},"2":{"84":1}}],["view",{"2":{"26":1,"76":1,"115":3,"139":2,"165":1,"172":2,"331":1,"396":1,"415":1,"448":1,"449":1}}],["vice",{"2":{"63":1}}],["via",{"0":{"210":1},"2":{"57":2,"58":1,"96":1,"122":1,"131":3,"132":1,"135":2,"154":2,"158":1,"181":1,"187":4,"210":3,"236":1,"239":1,"242":1,"252":1,"269":1,"291":1,"292":1,"293":1,"294":1,"321":1,"341":3,"352":1,"365":1,"367":1,"373":3,"375":1,"441":1}}],["video",{"2":{"4":2,"182":1,"237":1}}],["vary",{"2":{"235":1,"364":1}}],["vars",{"2":{"81":2}}],["varies",{"2":{"394":1}}],["variety",{"2":{"8":1,"26":1,"180":1,"182":1,"184":1}}],["variable",{"2":{"150":1}}],["variables",{"0":{"81":1},"2":{"80":1,"81":1,"150":1,"175":2}}],["variation",{"2":{"145":1,"147":1,"149":1}}],["various",{"2":{"99":1,"108":1,"250":1,"380":1}}],["validity",{"2":{"402":1}}],["valid`",{"2":{"214":1,"453":1}}],["validating",{"2":{"214":1,"430":1,"453":1}}],["validations",{"0":{"445":1}}],["validation",{"0":{"395":1,"439":1,"442":1,"443":1,"446":1},"1":{"396":1,"397":1,"398":1,"440":1,"441":1,"442":1,"443":2,"444":3,"445":2,"446":1},"2":{"80":1,"395":1,"432":1,"434":1,"441":1,"442":2,"443":1,"444":5,"445":3,"446":4}}],["validatesession",{"2":{"443":2}}],["validatesequencewalletproof",{"2":{"214":2,"453":2}}],["validates",{"2":{"396":1,"432":1}}],["validated",{"2":{"386":2,"397":1,"401":1,"443":1}}],["validate",{"2":{"214":1,"389":1,"395":1,"396":1,"415":2,"440":1,"443":1,"453":1}}],["validator",{"2":{"214":3,"453":3}}],["valid",{"0":{"385":1},"2":{"80":2,"167":1,"174":1,"188":1,"224":1,"334":1,"379":1,"382":1,"401":1,"407":1,"415":4,"424":1,"425":1,"429":1,"430":1,"437":1,"443":1,"462":1}}],["valueasstring",{"2":{"150":2,"151":1}}],["value=",{"2":{"139":2}}],["value",{"0":{"406":1},"2":{"61":8,"62":1,"84":1,"143":4,"144":1,"192":1,"225":1,"226":2,"228":2,"229":5,"275":1,"318":1,"394":1,"402":2,"406":1,"408":1,"415":3,"425":1,"426":1,"431":2,"444":1,"445":1,"446":1,"448":1,"449":2,"463":1,"464":2,"466":2,"467":5}}],["values",{"0":{"398":1},"2":{"4":1,"107":1,"108":1,"113":1,"114":1,"132":1,"143":1,"150":1,"158":1,"298":1,"299":1,"302":1,"304":1,"306":1,"308":1,"389":1}}],["joined",{"2":{"413":1,"414":1}}],["job",{"2":{"57":2}}],["jobid",{"2":{"57":1}}],["july",{"2":{"420":1}}],["jump",{"2":{"184":1}}],["just",{"2":{"30":1,"50":1,"64":1,"67":1,"84":1,"96":1,"130":1,"141":1,"150":2,"165":1,"167":1,"172":1,"187":3,"213":1,"234":1,"239":1,"335":1,"367":1,"452":1,"472":1}}],["java",{"2":{"234":1,"472":1}}],["javascript",{"2":{"26":1,"77":1,"214":1,"231":1,"453":1,"469":1}}],["jacket",{"2":{"61":1}}],["jpg",{"2":{"50":1}}],["js",{"0":{"27":1,"46":1,"208":2,"236":1,"281":1,"282":1,"283":1,"365":1},"2":{"23":1,"24":1,"26":1,"27":1,"32":1,"37":1,"39":1,"41":1,"43":1,"46":1,"53":1,"56":1,"57":2,"94":1,"187":2,"233":1,"234":1,"235":3,"236":3,"237":1,"281":2,"283":1,"364":1,"365":3,"379":1,"471":1,"472":1}}],["jsonrpcprovider",{"2":{"7":1,"77":1,"85":2,"214":1,"394":1,"453":1}}],["json",{"2":{"4":2,"23":3,"24":3,"32":3,"37":3,"39":3,"41":3,"43":3,"50":1,"56":3,"57":6,"61":1,"62":1,"75":1,"80":5,"83":1,"84":1,"131":2,"235":2,"325":3,"326":2,"327":1,"328":1,"332":1,"333":3,"334":1,"340":1,"364":2,"379":7}}],["jwt",{"2":{"3":1,"4":1,"134":1}}],["1699442705",{"2":{"449":1}}],["1699442705965",{"2":{"449":1}}],["1699443005",{"2":{"449":1}}],["160",{"2":{"428":1}}],["191",{"0":{"413":1},"2":{"413":1}}],["11",{"0":{"335":1},"2":{"437":4}}],["1155",{"0":{"41":1,"228":1,"466":1},"2":{"23":2,"35":1,"50":2,"61":2,"62":2,"228":2,"330":1,"332":1,"466":2}}],["18",{"2":{"143":2,"144":1}}],["102951017z",{"2":{"437":1}}],["102950917z",{"2":{"437":1}}],["109787921z",{"2":{"437":1}}],["109234880945084120673",{"2":{"437":4}}],["10",{"0":{"334":1},"2":{"437":2,"443":1}}],["10^decimals",{"2":{"143":1}}],["10^18",{"2":{"143":1}}],["100",{"2":{"121":1,"206":1}}],["1000000000000000000",{"2":{"143":1,"225":1,"229":3,"463":1,"467":3}}],["10000000000",{"2":{"120":1}}],["1447300",{"2":{"139":1}}],["14",{"2":{"129":1}}],["1271",{"2":{"383":1,"401":1,"412":1}}],["123",{"2":{"195":1,"333":2}}],["123456",{"2":{"435":1,"443":1}}],["1234",{"2":{"57":3}}],["1200x400",{"2":{"188":2,"200":1}}],["12",{"0":{"248":1,"259":1,"336":1},"2":{"62":2,"248":1,"250":1,"259":1,"389":1}}],["158456331411102687640546264635",{"2":{"61":1}}],["13+",{"2":{"281":1}}],["13",{"0":{"283":1},"2":{"281":1,"283":1}}],["131092",{"2":{"50":1}}],["137",{"2":{"43":1,"50":1,"56":1,"57":1,"66":3,"72":2,"73":2,"100":1,"101":1,"120":1,"124":1,"263":1,"271":1,"449":2}}],["1",{"0":{"70":1,"75":1,"134":1,"219":1,"287":1,"325":1,"351":1,"457":1},"1":{"76":1},"2":{"4":13,"43":1,"56":2,"57":3,"66":4,"72":2,"77":1,"85":1,"126":1,"136":1,"137":1,"139":3,"143":4,"150":1,"151":1,"160":1,"177":1,"188":2,"193":1,"200":1,"242":1,"247":1,"248":2,"257":1,"259":2,"293":1,"294":1,"315":1,"321":2,"325":1,"334":1,"336":1,"340":1,"352":1,"379":2,"384":1,"385":1,"387":2,"414":2,"430":2,"445":2,"446":2}}],["3rd",{"2":{"352":1}}],["32",{"2":{"220":1,"389":1,"437":3,"458":1}}],["36000",{"2":{"193":1}}],["30",{"2":{"74":1}}],["3",{"0":{"72":1,"80":1,"221":1,"327":1,"459":1},"1":{"81":1,"82":1,"83":1,"84":1},"2":{"4":1,"127":1,"139":2,"188":2,"200":1,"340":1,"375":1,"384":1,"385":2,"387":2,"424":1,"430":1,"437":1}}],["x19ethereum",{"2":{"413":1}}],["xattr",{"2":{"179":1}}],["xavier",{"2":{"62":1}}],["xavi",{"2":{"62":1}}],["xcodeproj",{"2":{"179":3}}],["xcode",{"0":{"179":1},"2":{"179":2}}],["xmlns",{"2":{"139":4}}],["xml",{"2":{"139":6}}],["xyz",{"2":{"27":1,"28":1,"80":1,"81":1,"152":1}}],["x",{"0":{"248":1,"259":1},"2":{"3":1,"23":2,"24":2,"27":1,"32":2,"37":2,"39":2,"41":2,"43":2,"46":1,"56":2,"57":4,"83":1,"84":1,"126":1,"160":1,"172":1,"248":1,"250":1,"259":1,"336":1,"352":2,"379":1}}],["x27",{"2":{"0":1,"4":1,"8":1,"23":16,"24":17,"26":2,"27":8,"28":1,"30":1,"32":13,"37":13,"39":13,"41":14,"43":24,"46":7,"49":1,"50":5,"53":1,"56":16,"57":22,"59":1,"61":1,"62":2,"63":1,"66":18,"73":1,"74":1,"75":2,"78":1,"80":2,"82":1,"83":2,"84":2,"85":8,"91":1,"92":6,"93":1,"97":1,"100":18,"101":22,"102":5,"103":2,"105":5,"107":4,"113":9,"114":9,"117":2,"118":2,"120":6,"121":6,"123":6,"124":17,"126":2,"127":1,"129":1,"130":2,"131":2,"132":1,"136":1,"137":1,"139":8,"141":6,"142":1,"144":1,"145":4,"146":1,"147":4,"149":4,"150":7,"153":1,"154":3,"155":1,"157":1,"158":3,"159":1,"160":1,"165":3,"167":3,"168":2,"169":2,"172":5,"173":1,"174":1,"175":1,"187":3,"188":5,"190":2,"192":1,"195":1,"210":2,"212":1,"213":5,"214":16,"217":2,"219":4,"220":2,"221":1,"222":4,"223":2,"224":4,"226":10,"227":10,"228":16,"229":17,"232":1,"234":3,"237":2,"240":1,"253":10,"263":4,"266":1,"271":4,"272":4,"282":4,"283":3,"284":1,"296":1,"298":1,"317":6,"319":3,"321":1,"325":1,"327":3,"334":1,"335":1,"340":4,"346":2,"351":3,"352":3,"353":2,"359":1,"360":2,"368":1,"376":1,"379":4,"386":1,"387":8,"388":1,"390":1,"392":1,"394":4,"395":2,"396":1,"401":1,"402":5,"403":1,"406":1,"407":2,"408":2,"409":1,"410":1,"413":2,"414":28,"415":1,"418":12,"429":2,"430":2,"431":24,"433":1,"434":1,"435":1,"436":8,"441":2,"443":1,"451":1,"452":5,"453":16,"455":2,"457":4,"458":2,"459":1,"460":4,"461":2,"462":4,"464":10,"465":10,"466":16,"467":17,"470":1,"472":3}}],["human",{"2":{"144":1,"150":1}}],["html",{"2":{"139":1}}],["http",{"2":{"23":1,"24":1,"26":2,"32":1,"37":1,"39":1,"41":1,"53":1,"100":2,"101":2,"139":4,"394":1}}],["https",{"2":{"4":8,"7":1,"23":3,"24":3,"26":2,"27":2,"28":2,"30":2,"32":3,"37":3,"39":3,"41":3,"43":2,"44":1,"46":1,"50":7,"52":6,"54":1,"56":2,"57":5,"61":6,"62":4,"66":1,"67":1,"72":1,"74":2,"76":1,"77":1,"80":2,"81":1,"83":1,"84":1,"93":1,"129":1,"139":2,"152":1,"187":1,"188":2,"200":1,"214":2,"232":1,"236":2,"241":1,"251":1,"261":1,"277":1,"279":1,"283":1,"333":1,"336":2,"340":1,"365":2,"370":1,"371":1,"379":2,"437":4,"453":2,"470":1}}],["hint",{"2":{"192":1}}],["hit",{"2":{"179":2}}],["hides",{"2":{"172":1}}],["hide",{"2":{"172":1}}],["hidden",{"2":{"133":1}}],["highly",{"2":{"281":1,"296":1,"298":1,"316":1}}],["high",{"2":{"33":1,"179":1}}],["higher",{"2":{"5":1}}],["history",{"0":{"36":1,"37":1,"38":1,"39":1},"1":{"37":1,"39":1},"2":{"33":1,"35":2,"37":6,"39":6,"155":1}}],["horizon",{"2":{"377":3}}],["horik",{"2":{"62":1}}],["home",{"2":{"184":1,"282":3}}],["hope",{"2":{"158":1,"159":1}}],["hooks",{"2":{"282":2}}],["hook",{"2":{"102":2,"103":1,"118":1,"282":1,"436":1,"445":1,"446":2}}],["hosting",{"2":{"324":1,"377":1}}],["hosted",{"2":{"74":1,"351":1,"352":1}}],["hosts",{"2":{"27":1,"28":1}}],["host",{"2":{"26":1,"192":1}}],["however",{"2":{"61":1,"122":1,"130":1,"131":1,"155":1,"321":1,"441":1}}],["how",{"0":{"156":1,"185":1,"282":1,"283":1,"323":1},"1":{"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1},"2":{"4":1,"25":1,"42":2,"45":1,"50":1,"55":2,"59":1,"73":1,"74":1,"105":1,"123":2,"131":1,"133":1,"141":1,"144":2,"146":1,"148":1,"150":1,"165":1,"172":1,"173":1,"175":1,"177":1,"187":1,"214":1,"285":1,"298":1,"318":1,"336":1,"341":1,"373":1,"378":1,"423":1,"428":1,"453":1}}],["h",{"2":{"23":2,"24":2,"32":2,"37":2,"39":2,"41":2,"43":2,"56":2,"57":4,"83":1,"84":1,"163":2,"167":2,"175":1,"177":1,"379":1}}],["he",{"2":{"443":1}}],["hence",{"2":{"432":1}}],["henrique",{"2":{"62":1}}],["hesitate",{"2":{"159":1}}],["heavily",{"2":{"284":1}}],["head",{"2":{"326":1,"335":1}}],["headless",{"2":{"184":1,"185":1}}],["header",{"2":{"179":1,"340":1}}],["headers",{"2":{"3":1,"80":5,"379":1}}],["heard",{"2":{"146":1}}],["hex",{"2":{"413":1,"414":1}}],["hexdataslice",{"2":{"389":1}}],["hexzeropad",{"2":{"389":1}}],["hexadecimal",{"2":{"143":1,"154":1,"295":2,"298":2,"299":1,"301":1,"302":1,"303":1,"304":2,"306":1,"308":1}}],["hexlify",{"2":{"73":2,"220":1,"458":1}}],["hello",{"2":{"75":1,"76":1,"413":1}}],["helps",{"2":{"175":1,"177":1}}],["helper",{"2":{"143":1}}],["helpful",{"2":{"30":1,"39":1,"41":1,"182":1,"285":1}}],["help",{"2":{"23":1,"24":1,"30":1,"37":1,"41":1,"59":1,"130":1,"133":1,"158":1,"159":1,"214":1,"217":1,"237":1,"324":1,"377":1,"453":1,"455":1}}],["here",{"2":{"26":1,"34":1,"35":1,"39":1,"41":1,"61":1,"62":1,"73":1,"85":1,"105":1,"123":1,"152":1,"154":1,"173":1,"188":1,"214":1,"246":1,"250":4,"256":1,"260":3,"267":1,"276":1,"279":1,"283":2,"436":1,"453":1}}],["had",{"2":{"378":1}}],["happen",{"2":{"352":1,"444":1}}],["happens",{"2":{"179":1}}],["hardware",{"2":{"351":1}}],["harmoniously",{"2":{"249":1,"258":1}}],["handling",{"2":{"432":1}}],["handlegooglelogin",{"2":{"436":3}}],["handlers",{"2":{"188":1}}],["handler",{"2":{"142":1,"153":1,"154":1,"436":3}}],["handlerequest",{"2":{"80":2}}],["handles",{"2":{"142":1,"433":1}}],["handle",{"2":{"7":2,"52":1,"80":8,"81":1,"85":6,"141":1,"150":1,"436":1}}],["hand",{"2":{"62":1,"179":1}}],["hat",{"2":{"61":2}}],["having",{"2":{"6":1,"65":1,"73":1,"74":1,"133":1,"188":1}}],["haven",{"2":{"129":1,"131":1}}],["have",{"2":{"1":1,"6":1,"30":1,"59":1,"61":1,"64":1,"66":1,"67":3,"77":1,"80":2,"84":1,"92":1,"129":1,"130":1,"139":1,"143":1,"145":1,"147":1,"149":1,"150":1,"159":2,"165":2,"172":2,"174":1,"175":1,"179":1,"187":1,"188":1,"213":1,"214":2,"229":1,"288":1,"297":1,"321":1,"322":1,"325":1,"334":1,"360":1,"386":1,"407":1,"425":1,"429":1,"430":1,"432":1,"452":1,"453":2,"467":1}}],["hasn",{"2":{"172":1,"351":1}}],["hashtree",{"2":{"431":7}}],["hasheddata",{"2":{"414":2}}],["hashed",{"2":{"386":1,"431":1}}],["hashes",{"2":{"37":1,"293":1,"401":1,"431":1}}],["hash",{"0":{"386":1,"387":1},"1":{"387":1,"389":1},"2":{"74":1,"80":2,"85":1,"293":1,"300":1,"309":1,"312":1,"313":1,"314":1,"389":2,"395":1,"396":1,"400":1,"401":1,"409":1,"415":6,"428":1,"429":1,"430":1,"436":3,"448":2}}],["has",{"2":{"0":1,"30":1,"94":1,"144":2,"172":1,"182":1,"186":1,"205":1,"210":1,"233":1,"322":1,"376":1,"381":1,"384":1,"393":1,"394":1,"401":1,"430":2,"435":2,"445":2,"446":1,"471":1}}],["kind",{"2":{"352":1}}],["kinds",{"2":{"27":1,"28":1,"237":1}}],["kitcheckoutprovider",{"2":{"117":4}}],["kitconfig",{"2":{"101":1,"105":2,"124":2}}],["kitwalletprovider",{"2":{"101":7}}],["kitprovider",{"2":{"100":4,"101":6,"105":3,"117":2,"124":2}}],["kit",{"0":{"98":1,"99":1,"100":1,"122":1,"238":1,"366":1},"1":{"99":1,"123":1,"239":1,"367":1},"2":{"95":1,"96":1,"97":2,"98":1,"99":8,"100":3,"101":4,"102":1,"103":1,"104":1,"105":2,"107":1,"117":6,"118":1,"122":3,"123":2,"124":3,"125":1,"237":1,"238":1,"239":1,"240":2,"366":1,"367":1,"368":2}}],["kitexavier",{"2":{"62":1}}],["keccak256",{"2":{"77":2,"387":5,"389":2,"415":2,"429":1,"430":1,"431":2}}],["keepwalletopened",{"0":{"197":1},"2":{"197":2}}],["keeps",{"2":{"30":1}}],["keep",{"2":{"3":1,"175":1,"197":1}}],["keyboard",{"2":{"129":1}}],["keypair",{"2":{"77":1}}],["keyword",{"2":{"75":1,"150":1}}],["keystore",{"2":{"177":1}}],["keys",{"0":{"217":1,"218":1,"376":1,"455":1,"456":1},"1":{"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1},"2":{"3":1,"91":1,"132":2,"139":1,"163":1,"187":1,"216":2,"217":3,"347":1,"353":1,"359":1,"374":3,"375":6,"376":1,"378":3,"454":2,"455":3}}],["key",{"0":{"96":1,"220":1,"223":1,"239":1,"367":1,"374":1,"377":1,"378":1,"458":1,"461":1},"1":{"375":1,"376":1,"377":1,"378":1},"2":{"3":4,"7":2,"11":1,"22":1,"23":3,"24":1,"25":1,"27":1,"31":1,"32":2,"33":1,"36":1,"37":2,"38":1,"39":1,"40":1,"41":1,"43":2,"46":2,"56":2,"57":3,"66":2,"72":1,"77":3,"80":5,"81":2,"85":2,"91":2,"92":2,"100":1,"101":1,"124":1,"132":1,"163":2,"164":3,"177":1,"179":2,"188":1,"214":1,"217":2,"220":1,"221":1,"222":2,"223":1,"224":2,"287":2,"296":1,"343":1,"347":1,"352":1,"359":2,"360":2,"374":3,"375":9,"376":1,"377":6,"378":6,"434":2,"435":3,"436":2,"437":2,"438":2,"448":2,"449":2,"453":1,"455":2,"458":1,"459":1,"460":2,"461":1,"462":2}}],["known",{"2":{"150":1,"317":2,"319":2,"389":1,"409":1,"410":1,"419":1}}],["knowledge",{"2":{"74":1}}],["know",{"2":{"0":1,"77":1,"235":1,"364":1}}],["pseudo",{"2":{"431":1}}],["python",{"2":{"234":1,"472":1}}],["philosophy",{"2":{"374":1}}],["phone",{"2":{"187":2,"352":1,"370":1,"371":1}}],["phase",{"2":{"179":2}}],["pc",{"0":{"138":1},"2":{"127":1,"161":1}}],["pkey",{"2":{"80":4,"81":1,"85":1}}],["person",{"2":{"414":1}}],["personalized",{"2":{"380":1}}],["perspective",{"2":{"210":1}}],["per",{"2":{"379":1}}],["perfectly",{"2":{"231":1,"469":1}}],["perfect",{"2":{"158":2}}],["performs",{"2":{"352":1}}],["performed",{"2":{"297":1,"446":1}}],["perform",{"2":{"75":1,"76":1,"80":1,"83":1,"158":1,"194":1,"223":1,"444":1,"461":1}}],["permission",{"2":{"3":1,"77":1}}],["png",{"2":{"50":2,"62":1,"188":2,"200":1}}],["pnpm",{"2":{"7":1,"27":1,"75":2,"80":1,"85":1,"90":1,"99":1,"117":1,"235":1,"358":1,"364":1}}],["pixel",{"2":{"437":1}}],["pinata",{"0":{"326":1},"2":{"324":1,"326":2,"327":1,"328":1,"333":1,"334":1}}],["piece",{"2":{"33":1}}],["pick",{"2":{"30":1,"127":1,"188":1,"203":1}}],["plugin",{"2":{"163":1,"165":1,"169":1,"173":1,"252":3,"253":1}}],["plugins",{"2":{"139":1,"165":3}}],["plain",{"2":{"213":1,"452":1}}],["places",{"2":{"155":1}}],["place",{"2":{"117":1,"132":1,"177":2,"352":1,"353":1}}],["placed",{"2":{"80":1,"283":1}}],["platforms",{"0":{"369":1},"1":{"370":1,"371":1,"372":1},"2":{"134":1,"135":1}}],["platformspecificsetup",{"2":{"127":1}}],["platform",{"2":{"75":1,"135":1,"167":1,"172":1,"351":1}}],["players",{"2":{"184":1,"185":1}}],["playercontroller",{"2":{"172":1}}],["player",{"2":{"136":2,"137":2,"139":3}}],["playground",{"2":{"107":1}}],["play",{"2":{"50":1,"129":1,"130":1,"131":1,"221":1,"459":1}}],["plan",{"2":{"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1,"150":1}}],["please",{"2":{"2":1,"5":1,"23":1,"25":1,"43":1,"45":1,"57":2,"90":1,"100":1,"131":1,"133":1,"139":3,"141":1,"143":1,"144":1,"150":1,"155":1,"158":1,"159":1,"174":2,"176":1,"179":1,"186":1,"208":1,"237":2,"268":1,"358":1,"379":1,"441":1}}],["pair",{"2":{"343":1}}],["paid",{"2":{"67":1,"72":1,"306":1}}],["packaging",{"0":{"176":1},"1":{"177":1,"178":1,"179":1},"2":{"176":1,"179":2}}],["packaged",{"2":{"179":1}}],["packages",{"0":{"99":1},"2":{"85":1,"99":1,"235":2,"364":2}}],["package",{"0":{"129":1},"1":{"130":1},"2":{"75":1,"99":2,"122":1,"129":5,"130":1,"131":6,"158":1,"179":1,"187":1,"231":1,"235":5,"242":2,"252":1,"261":1,"269":1,"364":4,"436":1,"469":1}}],["pawn",{"2":{"165":6,"172":2}}],["pattern",{"2":{"430":1}}],["patterns",{"2":{"182":1,"186":1}}],["path",{"2":{"139":1,"179":1,"188":3,"436":2}}],["path=",{"2":{"129":1}}],["patch",{"2":{"126":2,"160":2}}],["pasting",{"2":{"150":1}}],["pasted",{"2":{"210":1}}],["paste",{"2":{"129":1,"139":1,"154":1,"326":1,"333":1}}],["password",{"2":{"435":1}}],["passes",{"2":{"293":1,"294":1}}],["passed",{"2":{"30":1,"80":1,"113":2,"114":2,"167":1,"195":1,"245":1,"246":1,"255":1,"395":1}}],["passing",{"2":{"105":1,"107":1,"115":1}}],["pass",{"2":{"3":1,"4":3,"23":1,"30":1,"42":1,"55":1,"81":1,"118":1,"124":1,"151":1,"167":2,"188":3,"213":1,"293":1,"294":1,"434":1,"452":1}}],["palette",{"2":{"107":1}}],["pageprops",{"2":{"283":2}}],["pagesize",{"2":{"379":1}}],["pages",{"0":{"282":1},"2":{"249":3,"250":1,"258":3,"260":1,"281":2}}],["page",{"2":{"77":1,"84":1,"101":1,"113":1,"114":1,"117":1,"134":1,"182":2,"186":1,"205":1,"281":1,"282":2,"298":1,"379":4}}],["parent",{"2":{"430":1}}],["parentheses",{"2":{"150":1}}],["param",{"2":{"415":2}}],["parametersasobjectarray",{"2":{"150":2,"151":1}}],["parameters",{"0":{"244":1,"254":1,"264":1,"393":1,"397":1,"401":1},"1":{"245":1,"246":1,"247":1,"255":1,"256":1,"257":1,"265":1,"266":1},"2":{"150":5,"189":1,"423":1,"432":1}}],["parameter",{"2":{"108":1,"141":1,"143":1,"144":1,"150":1,"167":1,"168":1,"245":1,"255":1,"296":1,"298":1,"316":1}}],["parallelize",{"2":{"8":1}}],["parallel",{"0":{"73":1},"2":{"8":1,"73":1}}],["parse",{"2":{"59":1,"63":1,"80":1}}],["partner",{"2":{"353":3}}],["party",{"2":{"351":1,"352":1}}],["parts",{"2":{"173":2}}],["partial",{"2":{"85":2,"353":1,"404":1}}],["particularly",{"2":{"217":1,"281":1,"284":1,"455":1}}],["particular",{"0":{"41":1},"2":{"35":2,"39":1}}],["part",{"2":{"8":1,"94":1,"233":1,"471":1}}],["paytrie",{"2":{"341":1,"373":1}}],["paypal",{"2":{"187":1}}],["payload",{"2":{"179":1,"225":1,"463":1}}],["payable",{"2":{"150":3}}],["payments",{"2":{"116":1}}],["payment",{"2":{"74":1,"204":2,"205":2,"341":1,"373":1}}],["pay",{"2":{"8":1,"66":5,"347":1}}],["purchasing",{"2":{"207":1}}],["purchase",{"2":{"206":1,"207":2,"341":2,"373":2}}],["purpose",{"2":{"126":1,"142":1,"173":1}}],["purple",{"2":{"61":1}}],["pull",{"2":{"125":1}}],["publishing",{"2":{"139":1}}],["published",{"2":{"30":1}}],["publishcollection",{"2":{"4":1}}],["publicclient",{"2":{"243":1}}],["publically",{"2":{"142":1}}],["public",{"2":{"3":1,"4":1,"6":1,"141":1,"142":3,"153":2,"154":3,"415":1}}],["publicly",{"2":{"3":2,"351":1}}],["putting",{"2":{"150":1}}],["put",{"2":{"4":3,"80":1,"131":1}}],["portrait",{"2":{"172":2}}],["potentially",{"2":{"284":1,"297":1}}],["potential",{"2":{"96":1,"185":1,"239":1,"367":1}}],["power",{"2":{"96":1,"239":1,"367":1}}],["powered",{"2":{"50":1,"139":5}}],["points",{"2":{"155":1}}],["point",{"2":{"75":1,"123":1,"143":1,"172":1,"297":1,"298":1,"332":1}}],["popups",{"2":{"188":1}}],["popup",{"2":{"188":2}}],["popular",{"0":{"345":1},"2":{"30":2,"50":1,"59":1,"95":1,"96":1,"184":1,"238":1,"239":1,"284":1,"366":1,"367":1}}],["pop",{"2":{"184":1}}],["pops",{"2":{"3":1}}],["polygonindexer",{"2":{"152":1}}],["polygon",{"0":{"32":1},"2":{"23":5,"24":5,"26":2,"28":1,"32":5,"37":5,"39":6,"41":5,"43":5,"47":1,"50":6,"52":3,"56":4,"57":4,"61":1,"62":1,"66":2,"72":1,"83":1,"100":2,"101":2,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":2,"151":1,"152":1,"153":1,"154":1,"188":1,"214":1,"243":1,"253":1,"295":1,"296":1,"449":1,"453":1}}],["position",{"0":{"108":1},"2":{"108":1}}],["possibilities",{"2":{"95":1,"151":1,"238":1,"366":1}}],["possible",{"2":{"3":1,"107":1,"108":1,"172":1,"188":1,"210":1,"216":2,"319":1,"350":1,"353":1,"427":1,"430":1,"454":2}}],["post",{"2":{"23":2,"24":2,"32":2,"37":2,"39":2,"41":2,"43":2,"56":2,"57":5,"74":1,"80":5,"83":1,"84":1,"85":1,"129":1,"141":1,"142":1,"153":1,"154":1,"340":1,"379":3}}],["prudent",{"2":{"376":1}}],["pr",{"2":{"155":1,"159":1}}],["practices",{"2":{"59":1}}],["practice",{"2":{"59":1,"61":1,"63":2,"284":1}}],["primitive",{"2":{"343":1}}],["primary",{"2":{"217":2,"455":2}}],["primarily",{"2":{"184":1,"423":1}}],["pricepertoken",{"2":{"379":1}}],["price",{"2":{"310":1,"379":1}}],["pricesort",{"2":{"340":1}}],["prices",{"2":{"155":1}}],["pricing",{"0":{"5":1},"2":{"8":1}}],["privatekeystring",{"2":{"287":1}}],["privatekey",{"2":{"77":4}}],["private",{"2":{"77":2,"80":1,"81":1,"85":1,"160":1,"163":1,"164":1,"217":1,"220":1,"287":2,"374":3,"375":1,"378":1,"455":1,"458":1}}],["privately",{"2":{"4":1}}],["print",{"2":{"76":1,"77":1}}],["println",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1}}],["prism",{"2":{"62":1}}],["priority",{"2":{"311":1}}],["prioritizing",{"2":{"185":1}}],["prior",{"2":{"2":1,"4":1,"85":1,"139":2,"167":1,"172":1}}],["prepared",{"2":{"346":1}}],["prepare",{"0":{"325":1}}],["pre",{"2":{"321":1,"322":1}}],["prefixedmessage",{"2":{"413":2}}],["prefilling",{"2":{"206":1}}],["prefabs",{"2":{"133":1,"155":1}}],["prefab",{"2":{"133":2,"155":1}}],["preference",{"2":{"378":1}}],["preferred",{"2":{"184":1}}],["prefer",{"2":{"4":1,"296":1}}],["press",{"2":{"75":1,"84":1,"129":1}}],["preview",{"2":{"333":1}}],["previously",{"2":{"85":1,"210":1,"287":1}}],["previous",{"2":{"4":1,"66":1,"225":1,"463":1}}],["prevent",{"0":{"80":1},"1":{"81":1,"82":1,"83":1,"84":1},"2":{"74":1,"82":1,"207":1,"436":1}}],["proxy",{"2":{"389":2,"392":1}}],["pros",{"0":{"344":1,"347":1}}],["protect",{"2":{"378":1}}],["protected",{"2":{"351":1}}],["protects",{"2":{"350":1,"353":1}}],["protection",{"2":{"195":1,"353":1,"377":1,"441":1}}],["protocol",{"2":{"187":1,"191":1,"379":1}}],["protocols",{"2":{"1":1,"210":1}}],["proper",{"2":{"401":1}}],["properly",{"2":{"177":1}}],["properties",{"0":{"63":1,"424":1},"1":{"425":1,"426":1,"427":1,"428":1,"429":1,"430":1},"2":{"50":1,"61":4,"62":2,"63":6,"424":1}}],["progressively",{"2":{"187":1}}],["progress",{"2":{"155":1}}],["program",{"2":{"57":1,"390":1}}],["produce",{"0":{"281":1},"2":{"281":1}}],["produced",{"2":{"77":1}}],["products",{"2":{"183":1}}],["product",{"2":{"155":1}}],["prone",{"2":{"150":1}}],["proceed",{"2":{"134":1}}],["process",{"2":{"66":1,"80":1,"92":2,"96":1,"129":1,"150":3,"158":1,"175":2,"179":1,"182":1,"188":1,"217":1,"239":1,"334":1,"360":2,"367":1,"434":2,"435":2,"436":2,"437":2,"438":2,"448":2,"449":2,"455":1}}],["provisioning",{"2":{"178":1}}],["providing",{"2":{"77":1,"95":1,"145":1,"147":1,"149":1,"150":1,"238":1,"351":1,"366":1}}],["provided",{"2":{"66":1,"72":1,"75":1,"91":1,"115":3,"130":1,"143":1,"145":1,"147":1,"149":1,"199":1,"284":1,"295":1,"296":1,"298":3,"317":2,"321":1,"322":1,"359":1,"390":1,"396":1,"402":1,"415":4,"426":1,"429":1,"435":1}}],["provides",{"2":{"50":1,"55":1,"107":1,"122":1,"126":1,"134":1,"151":1,"160":1,"180":1,"284":1,"289":1,"351":1,"353":1}}],["provide",{"2":{"26":1,"30":1,"53":1,"90":1,"96":1,"123":1,"124":1,"133":1,"150":3,"155":3,"164":2,"182":1,"184":1,"185":1,"186":1,"217":1,"239":1,"284":1,"298":1,"314":1,"316":2,"317":1,"318":1,"321":1,"333":1,"342":1,"351":1,"358":1,"367":1,"430":4,"435":1,"441":1,"455":1}}],["providerurl",{"2":{"172":1,"174":2}}],["provider",{"2":{"7":4,"66":2,"72":1,"77":2,"85":5,"117":1,"174":1,"188":1,"201":2,"205":1,"214":2,"222":1,"283":1,"341":1,"373":1,"394":2,"434":1,"436":2,"441":2,"453":2,"460":1}}],["providers",{"2":{"6":1,"7":1,"77":1,"80":1,"85":3,"99":1,"184":1,"201":1,"204":2,"205":1,"214":1,"341":4,"373":4,"394":1,"434":1,"441":1,"453":1}}],["prove",{"2":{"84":1,"213":1,"452":1}}],["proofstring",{"2":{"80":1,"214":1,"453":1}}],["proof",{"2":{"74":1,"80":5,"83":5,"84":4,"188":2,"193":1,"194":1,"213":2,"214":6,"452":2,"453":6}}],["prompted",{"2":{"210":1,"333":1}}],["prompt",{"2":{"129":1,"131":1,"210":1,"213":1,"266":1,"445":1,"452":1}}],["prompts",{"2":{"11":1,"75":1}}],["promise",{"2":{"73":1,"80":4,"85":2}}],["probably",{"2":{"146":1}}],["probability",{"2":{"73":1}}],["problem",{"2":{"73":1}}],["problems",{"2":{"0":1,"175":1}}],["pro",{"2":{"23":1,"42":1,"49":1,"55":1,"179":1,"434":1,"435":1,"436":1,"437":2,"438":1}}],["projectfilesios",{"2":{"179":1}}],["projectname",{"0":{"111":1}}],["projectaccesskey",{"2":{"66":2,"72":1,"77":1,"92":1,"100":2,"101":2,"124":1,"163":1,"188":3,"360":1,"434":1,"435":1,"436":1,"437":1,"438":1,"448":1,"449":1}}],["projectid",{"2":{"4":2,"437":2}}],["project",{"0":{"91":1,"359":1},"2":{"3":1,"5":1,"7":1,"11":1,"30":1,"50":1,"63":2,"75":7,"76":1,"77":1,"80":5,"81":1,"85":1,"91":1,"92":1,"111":1,"130":5,"131":2,"132":1,"136":1,"137":1,"139":2,"165":2,"179":8,"186":1,"235":2,"237":1,"329":1,"352":1,"359":1,"360":1,"364":2,"434":1,"435":1,"436":1,"437":1,"438":1,"448":1,"449":1}}],["projects",{"2":{"0":1,"4":10,"8":1,"59":3,"63":1}}],["circle",{"2":{"436":1}}],["cid",{"2":{"326":1,"327":1}}],["certain",{"2":{"380":1,"446":1}}],["certainty",{"2":{"213":1,"452":1}}],["center",{"2":{"108":3}}],["c++",{"2":{"165":3,"167":1}}],["cpp",{"2":{"164":1,"167":2,"175":1}}],["cs",{"2":{"141":1}}],["ctx",{"2":{"80":3}}],["cdn",{"0":{"236":1,"365":1},"2":{"236":1,"365":1}}],["cd",{"2":{"75":1,"76":1}}],["c",{"0":{"70":1,"71":1,"72":1},"2":{"132":2,"154":1,"318":1,"430":1}}],["cross",{"2":{"379":1}}],["cr",{"2":{"179":1}}],["cryptography",{"2":{"378":1}}],["cryptographically",{"2":{"287":1,"351":1}}],["crypto",{"0":{"120":1},"2":{"351":1}}],["cryptocurrencies",{"2":{"341":1,"373":1}}],["cryptocurrency",{"2":{"116":1,"120":1}}],["cryptocheckout",{"0":{"120":1},"2":{"119":1,"120":2}}],["credential",{"2":{"436":1}}],["credentialresponse",{"2":{"436":2}}],["credentialsin",{"2":{"165":1,"167":3,"172":2,"174":2}}],["credentials",{"0":{"163":1},"2":{"91":1,"163":2,"165":3,"167":3,"168":2,"172":2,"173":1,"174":2,"359":1,"378":1}}],["credit",{"2":{"67":1,"341":1,"373":1}}],["creator",{"2":{"332":1}}],["creators",{"2":{"148":1}}],["creation",{"2":{"11":1,"349":1,"351":1,"386":1,"389":1,"395":1,"426":1,"433":1}}],["creating",{"0":{"4":1,"123":1},"2":{"122":1,"123":1,"125":1,"141":1,"142":1,"145":1,"147":1,"149":1,"152":1,"179":1,"184":1,"296":1,"316":2}}],["createroot",{"2":{"436":1}}],["createrandom",{"2":{"77":1}}],["createhashrouter",{"2":{"436":2}}],["create2",{"2":{"389":1,"432":1}}],["creates",{"2":{"375":1}}],["createtransaction",{"2":{"315":2}}],["createtoken",{"2":{"4":1}}],["createclient",{"2":{"283":1}}],["createconnector",{"2":{"123":2}}],["createconfig",{"2":{"100":2,"101":2,"124":1,"243":1}}],["createcollection",{"2":{"4":1}}],["createasset",{"2":{"4":1}}],["createdat",{"2":{"379":1,"437":2}}],["createdby",{"2":{"379":1}}],["created",{"2":{"4":2,"130":1,"132":1,"145":1,"147":1,"149":1,"158":1,"287":1,"288":1,"321":1,"328":1,"332":1,"349":2,"375":1,"379":2,"402":1,"413":1,"430":1,"434":1}}],["create",{"0":{"68":1},"2":{"3":1,"4":1,"7":2,"65":1,"66":5,"72":2,"73":1,"75":4,"77":2,"80":1,"85":5,"92":1,"123":3,"124":1,"130":1,"132":4,"139":1,"145":2,"147":2,"149":2,"151":1,"158":2,"165":2,"167":1,"172":1,"177":1,"186":1,"214":1,"220":1,"224":1,"283":1,"287":1,"296":2,"315":1,"317":5,"319":1,"321":2,"326":1,"329":1,"360":1,"374":2,"427":1,"430":1,"453":1,"458":1,"462":1}}],["craft",{"2":{"66":1,"72":1}}],["custodial",{"2":{"141":1,"183":1,"185":1,"349":1,"378":1}}],["customization",{"0":{"159":1},"2":{"181":1,"378":1}}],["customizable",{"2":{"157":1,"185":1}}],["customizability",{"0":{"157":1},"1":{"158":1,"159":1}}],["customize",{"2":{"105":1,"123":1,"159":1,"181":1,"188":1}}],["custom",{"0":{"122":1,"123":1,"124":1,"125":1,"167":1},"1":{"123":1},"2":{"122":2,"123":6,"124":5,"125":2,"127":1,"135":2,"139":1,"145":1,"147":1,"149":1,"151":1,"165":3,"172":1,"182":1,"191":1,"283":1,"284":1,"338":1,"380":1,"441":1,"442":1}}],["cut",{"2":{"62":1}}],["curious",{"2":{"141":1,"150":1}}],["currencies",{"2":{"143":1}}],["currencyaddress",{"2":{"379":1}}],["currencyaddresses",{"2":{"340":1,"379":3}}],["currency",{"2":{"66":1,"143":2,"205":2,"207":4,"298":1,"315":1,"379":2}}],["currently",{"2":{"91":1,"135":1,"286":1,"341":1,"353":1,"359":1,"373":1,"375":1}}],["current",{"0":{"394":1,"409":1},"1":{"410":1},"2":{"58":1,"398":1,"409":2,"437":1,"442":1}}],["curl",{"2":{"23":1,"24":1,"26":1,"32":1,"37":1,"39":1,"41":1,"43":1,"56":1,"57":2,"83":2,"84":1,"336":1,"340":1,"379":1}}],["c3bgcu3lkfr9bp9jfsslenpaaaaaaaaaa",{"2":{"23":3,"24":4,"27":1,"28":1,"32":3,"37":3,"39":4,"41":4,"43":4,"46":1,"47":1,"56":4,"57":4}}],["claim",{"2":{"195":1}}],["class",{"2":{"92":1,"145":1,"147":1,"149":1,"152":2,"165":2,"321":1,"360":1}}],["closing",{"2":{"173":1}}],["close",{"0":{"438":1},"2":{"102":1,"197":1}}],["closed",{"2":{"91":1,"359":1,"379":1,"438":2}}],["cloud",{"0":{"326":1},"2":{"75":1,"326":1,"333":1,"334":1}}],["cloudflare",{"0":{"19":1,"75":1,"81":1},"1":{"76":1},"2":{"11":2,"74":3,"75":3,"80":1}}],["clone",{"2":{"75":1}}],["clothes",{"2":{"61":1}}],["clipboard",{"2":{"84":1,"210":2}}],["cli",{"0":{"75":1},"1":{"76":1},"2":{"74":2,"75":1}}],["clientid=",{"2":{"436":1}}],["client=",{"2":{"100":1,"101":2,"117":1,"124":1,"283":1}}],["clients",{"0":{"296":1},"1":{"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1},"2":{"51":1}}],["client",{"0":{"53":1},"2":{"26":2,"51":3,"53":2,"83":1,"150":1,"164":2,"177":6,"214":1,"217":1,"222":1,"223":1,"224":1,"231":1,"234":2,"282":2,"283":9,"291":2,"292":2,"293":2,"294":2,"296":4,"297":1,"298":2,"299":1,"300":1,"301":1,"302":1,"303":2,"304":1,"305":1,"306":1,"307":2,"308":2,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":2,"317":7,"319":3,"320":1,"321":5,"436":1,"453":1,"455":1,"460":1,"461":1,"462":1,"469":1,"472":2}}],["clicks",{"2":{"96":1,"213":1,"239":1,"367":1,"452":1}}],["clicking",{"2":{"77":1}}],["click",{"2":{"3":3,"50":1,"129":3,"130":3,"131":1,"132":1,"158":2,"179":7,"283":1,"328":1,"329":1,"331":1,"333":1,"335":1}}],["cheap",{"2":{"344":1}}],["checkpoint",{"0":{"426":1},"2":{"424":1,"426":2,"431":1}}],["checks",{"2":{"402":1}}],["checked",{"2":{"386":1,"448":1}}],["checking",{"2":{"30":1,"120":1,"174":1}}],["check",{"2":{"26":1,"58":2,"66":2,"72":1,"80":2,"97":1,"141":1,"142":1,"153":1,"154":1,"167":1,"182":1,"186":1,"188":1,"240":1,"298":1,"338":1,"368":1,"442":1}}],["checkoutconfig",{"2":{"120":1}}],["checkoutsettings",{"2":{"118":2,"119":2}}],["checkout",{"0":{"20":1,"118":1,"119":1,"120":1},"1":{"120":1,"121":1},"2":{"97":1,"116":1,"117":6,"118":3,"119":1,"240":1,"368":1}}],["chrome",{"0":{"209":1},"2":{"187":2,"208":1,"209":1,"372":1,"434":1,"435":1,"436":1,"437":2,"438":1}}],["chiefly",{"2":{"183":1}}],["children",{"2":{"283":2}}],["child",{"2":{"165":1,"283":1}}],["choosing",{"2":{"332":1}}],["chooses",{"2":{"210":1}}],["choose",{"2":{"7":1,"155":1,"210":1,"341":1,"373":1,"378":1}}],["choice",{"2":{"181":1,"329":1,"434":1}}],["chose",{"2":{"131":1,"169":1,"210":1,"316":1}}],["chop",{"2":{"50":1}}],["chance",{"2":{"179":1}}],["changed",{"2":{"130":1,"395":1,"432":1}}],["changes",{"2":{"8":1,"58":1,"126":2,"131":2,"158":1,"160":2,"179":1,"187":1,"268":1,"436":1}}],["change",{"2":{"3":1,"50":2,"225":1,"388":1,"390":1,"395":1,"402":1,"463":1}}],["challenge",{"2":{"134":2}}],["challenging",{"2":{"131":1}}],["chainindexer",{"2":{"152":3}}],["chainid",{"0":{"274":1,"303":1},"2":{"43":3,"50":1,"56":3,"57":3,"66":1,"72":1,"80":4,"85":4,"115":1,"120":1,"222":2,"271":1,"295":2,"303":2,"414":2,"444":1,"445":1,"446":1,"448":1,"449":1,"460":2}}],["chainconfig",{"2":{"80":2}}],["chain",{"2":{"3":1,"7":1,"27":2,"28":2,"30":1,"33":4,"43":1,"52":2,"55":1,"56":1,"57":1,"73":1,"80":10,"81":3,"85":6,"100":5,"101":5,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":2,"151":1,"152":1,"153":1,"154":1,"207":1,"226":1,"227":1,"228":1,"274":1,"295":5,"296":2,"298":2,"303":2,"307":2,"330":1,"333":1,"336":1,"464":1,"465":1,"466":1}}],["chains",{"0":{"245":1,"255":1},"2":{"2":1,"33":3,"45":1,"49":2,"100":4,"101":4,"124":1,"235":1,"243":1,"245":1,"253":1,"255":1,"287":1}}],["calculated",{"2":{"428":1,"429":1,"430":1,"431":1}}],["caller",{"2":{"401":1}}],["called",{"2":{"44":1,"57":1,"61":1,"62":1,"185":1,"188":1,"235":1,"352":1,"364":1,"393":1,"396":1,"401":1,"402":1,"403":1,"405":2,"431":1,"436":1}}],["callfunction",{"2":{"317":7}}],["callable",{"2":{"165":2}}],["calldata",{"2":{"85":1,"228":2,"229":1,"415":1,"466":2,"467":1}}],["callcontractfunction",{"2":{"145":1,"147":1,"149":1,"317":4,"321":1}}],["callcontract",{"2":{"80":3,"85":2}}],["callbacks",{"2":{"175":2}}],["callback",{"0":{"444":1},"2":{"66":2,"175":2,"444":2}}],["callshowauthsuccessscreen",{"2":{"167":4}}],["calls",{"2":{"30":2,"61":1,"167":2,"172":1,"174":1,"284":2,"393":1,"401":1}}],["calling",{"0":{"317":1},"2":{"2":1,"30":1,"80":1,"142":1,"150":3,"153":1,"154":1,"165":1,"172":1,"316":1,"317":1,"392":1,"408":1,"409":1,"415":1,"432":1}}],["call",{"0":{"340":1},"2":{"2":1,"3":1,"4":1,"7":1,"26":1,"58":1,"73":1,"80":3,"142":1,"150":5,"153":1,"154":2,"167":5,"168":1,"172":1,"174":2,"183":1,"234":1,"317":1,"336":1,"402":1,"472":1}}],["capturables",{"2":{"175":1}}],["capturable",{"2":{"175":2}}],["capabilities",{"2":{"53":1,"234":1,"472":1}}],["cater",{"2":{"185":1}}],["category",{"2":{"139":12,"167":5}}],["catch",{"2":{"7":1,"66":1,"80":3,"85":1,"214":1,"284":2,"436":1,"445":1,"449":1,"453":1}}],["causes",{"2":{"283":1}}],["cause",{"2":{"126":3,"132":1,"160":3}}],["caution",{"2":{"66":1,"188":1,"401":1}}],["came",{"2":{"80":1}}],["carefully",{"2":{"187":1}}],["care",{"2":{"72":1}}],["cardtype",{"2":{"62":1}}],["cards",{"2":{"50":2,"62":2}}],["card",{"2":{"50":2,"62":1,"67":1,"341":2,"373":2}}],["cast",{"2":{"62":1}}],["case",{"2":{"25":1,"61":1,"73":1,"115":1,"151":1,"167":1,"317":2,"319":2,"377":1,"395":1,"403":1,"404":1,"410":2}}],["cases",{"2":{"8":1,"63":1,"131":1,"154":1,"173":1,"213":1,"234":1,"401":1,"452":1,"472":1}}],["cancel",{"2":{"446":1}}],["cancelled",{"2":{"379":1,"444":1}}],["candidate",{"2":{"410":1}}],["canvas",{"2":{"133":4}}],["cannot",{"2":{"66":1,"135":1,"268":1,"316":1,"353":1,"441":1}}],["can",{"0":{"185":1},"2":{"4":3,"6":1,"8":1,"27":1,"28":1,"30":1,"33":1,"34":1,"35":1,"39":1,"41":1,"50":3,"62":1,"63":1,"64":2,"65":2,"66":4,"67":2,"73":5,"74":1,"75":2,"76":1,"77":4,"78":1,"80":1,"83":2,"84":1,"85":1,"90":1,"92":1,"94":1,"102":1,"104":1,"105":2,"107":1,"115":1,"122":1,"123":3,"124":1,"125":1,"126":1,"130":3,"131":1,"133":1,"141":1,"142":3,"143":2,"144":3,"145":1,"146":2,"147":1,"148":3,"149":1,"150":2,"153":2,"154":4,"155":2,"158":2,"160":1,"163":3,"164":1,"165":1,"167":1,"169":3,"174":1,"175":2,"179":2,"181":4,"184":3,"185":1,"187":1,"188":6,"189":1,"192":1,"204":1,"207":1,"210":3,"213":2,"214":1,"217":3,"224":1,"226":2,"227":1,"228":1,"229":1,"233":1,"234":2,"235":2,"236":1,"237":1,"242":1,"247":1,"251":1,"257":1,"261":1,"272":1,"277":1,"278":1,"281":1,"282":2,"283":6,"284":2,"285":1,"295":1,"296":2,"297":2,"317":2,"319":1,"320":1,"321":1,"324":1,"325":2,"332":1,"336":2,"341":3,"346":2,"349":2,"350":1,"351":3,"352":4,"358":1,"360":1,"364":1,"365":1,"373":3,"374":2,"375":2,"377":1,"378":2,"380":1,"388":1,"390":1,"391":2,"393":1,"395":1,"401":1,"408":1,"409":2,"410":1,"414":1,"415":1,"423":1,"425":1,"426":1,"427":2,"428":1,"430":6,"435":2,"436":2,"438":2,"441":1,"443":1,"444":1,"446":1,"449":1,"452":2,"453":1,"455":3,"462":1,"464":2,"465":1,"466":1,"467":1,"471":1,"472":2}}],["cost",{"2":{"386":1}}],["coding",{"2":{"181":1}}],["codehash",{"2":{"389":2}}],["codeat",{"0":{"304":1},"2":{"304":1}}],["codein",{"2":{"167":1,"168":1}}],["code",{"0":{"215":1,"440":1},"2":{"23":1,"26":1,"27":1,"43":1,"53":1,"56":1,"67":1,"72":1,"75":1,"77":1,"80":1,"85":1,"101":1,"134":1,"141":1,"144":1,"146":1,"148":1,"150":3,"154":2,"168":2,"179":2,"186":1,"188":1,"210":3,"241":1,"251":1,"261":1,"277":1,"282":1,"283":1,"304":1,"351":1,"352":1,"389":2,"392":1,"431":1,"432":3,"440":1,"441":1,"443":4,"448":1,"449":2}}],["co",{"2":{"148":1}}],["cognito",{"2":{"134":2,"440":1}}],["colorschememanager",{"2":{"158":4}}],["colors",{"2":{"107":2,"158":1,"181":1}}],["color",{"0":{"158":1},"2":{"107":1,"158":3}}],["colleted",{"2":{"169":1}}],["collect",{"2":{"168":1,"177":1}}],["collected",{"2":{"167":2,"168":1}}],["collectibleinterface",{"2":{"85":2}}],["collectibleinfo",{"2":{"56":1}}],["collectible",{"0":{"85":1,"228":1,"466":1},"2":{"74":2,"85":1,"228":2,"466":2}}],["collectibles",{"0":{"9":1,"13":1,"74":1},"1":{"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"96":1,"121":1,"239":1,"367":1}}],["collectionaddress",{"2":{"340":1,"379":3}}],["collectionid",{"2":{"4":4}}],["collection",{"2":{"4":5,"24":2,"330":1,"379":3}}],["collections",{"0":{"4":1,"24":1},"2":{"2":1,"4":10}}],["collision",{"2":{"73":1}}],["coinquantity",{"2":{"120":1}}],["coinbase",{"2":{"114":1}}],["coins",{"2":{"96":1,"239":1,"367":1}}],["coingecko",{"2":{"30":1}}],["copied",{"2":{"84":1}}],["copy",{"2":{"3":1,"84":1,"150":1,"165":2,"210":1,"326":1,"327":1,"328":1}}],["corrupt",{"2":{"392":1}}],["corruption",{"2":{"392":1}}],["corresponds",{"2":{"396":1,"398":1,"401":1}}],["correspond",{"2":{"113":1,"114":1,"401":1}}],["corresponding",{"2":{"2":1,"26":1,"39":1,"41":1,"113":1,"114":1,"186":1,"381":1,"382":1}}],["correctness",{"2":{"430":1}}],["correct",{"2":{"66":1,"249":1,"258":1,"401":1,"409":1,"415":1,"426":1,"430":1}}],["core",{"2":{"99":1,"100":1,"117":1,"214":1,"272":1,"392":1,"453":1}}],["cors",{"2":{"80":1}}],["count",{"2":{"414":1}}],["counterfactual",{"2":{"402":1,"432":1}}],["counter",{"2":{"389":1,"395":1,"410":1}}],["could",{"2":{"66":2,"318":1,"325":1,"353":1,"378":1}}],["course",{"2":{"33":1,"50":1,"187":1}}],["comes",{"2":{"374":1}}],["come",{"2":{"50":1}}],["combine",{"2":{"237":1}}],["combined",{"2":{"235":1,"364":1,"375":1,"382":1,"385":4,"401":1,"415":1}}],["combinations",{"0":{"385":1}}],["combination",{"2":{"50":1,"283":1,"385":1,"427":1}}],["combat",{"2":{"30":1}}],["communicating",{"2":{"352":1}}],["communication",{"2":{"11":1,"352":1,"371":1}}],["communicate",{"2":{"187":1}}],["commons",{"2":{"214":2,"453":2}}],["common",{"2":{"59":1,"182":1,"184":1,"186":1,"213":1,"235":1,"452":1}}],["command",{"2":{"57":1,"75":1,"76":1,"179":1,"242":1,"248":1,"259":1,"283":1}}],["commands",{"2":{"26":1,"127":2}}],["comma",{"2":{"50":1}}],["com",{"2":{"23":1,"24":1,"28":2,"30":1,"32":1,"37":1,"39":1,"41":1,"43":1,"47":2,"56":1,"57":2,"61":2,"62":2,"93":1,"129":1,"131":1,"139":8,"188":2,"200":1,"202":1,"232":1,"236":1,"241":1,"251":1,"261":1,"277":1,"279":1,"283":1,"365":1,"435":1,"437":4,"470":1}}],["coming",{"0":{"20":1,"159":1},"2":{"80":1,"140":1,"155":1,"217":1,"393":1,"401":1,"455":1}}],["computing",{"2":{"389":1,"432":1}}],["computed",{"2":{"388":1}}],["compute",{"0":{"387":1,"389":1},"2":{"389":1,"410":1}}],["computer",{"2":{"327":1,"370":1}}],["compared",{"2":{"374":1,"409":1,"410":1}}],["compat",{"2":{"82":1}}],["compatible",{"2":{"2":1,"8":2,"33":5,"45":1,"49":1,"61":1,"82":1,"187":1,"188":1,"237":1,"278":2,"349":2}}],["composed",{"2":{"235":1,"343":1,"364":1}}],["component",{"2":{"133":1,"165":1,"172":2,"283":12,"436":1}}],["components",{"0":{"285":1},"2":{"100":1,"101":1,"156":1,"282":1,"283":6,"285":1}}],["compromised",{"2":{"353":3,"374":1,"375":2,"377":1,"378":3}}],["comprised",{"2":{"156":1}}],["comprehensive",{"2":{"96":1,"239":1,"367":1}}],["compiled",{"2":{"154":1}}],["compile",{"2":{"154":1}}],["compliant",{"2":{"428":1}}],["complicated",{"2":{"150":2}}],["complexity",{"2":{"142":1,"181":1}}],["complex",{"0":{"145":1,"147":1,"149":1},"2":{"142":1,"150":1,"151":1,"427":1}}],["completeness",{"2":{"297":1}}],["completes",{"2":{"134":1}}],["completely",{"2":{"61":1,"63":1,"130":1,"183":1}}],["complete",{"2":{"30":1,"74":2,"75":1,"77":2,"85":1,"93":1,"101":1,"181":1,"184":1,"188":1,"232":1,"436":1,"442":1,"470":1}}],["completed",{"2":{"3":1,"85":1,"172":1,"389":1}}],["convention",{"2":{"213":1,"452":1}}],["convenient",{"2":{"185":1,"186":1,"217":1,"455":1}}],["convenience",{"2":{"49":1,"51":1,"145":1,"147":1,"149":1,"159":1,"185":1,"321":1,"322":2}}],["conversely",{"2":{"181":1,"184":1}}],["converted",{"2":{"318":1}}],["convert",{"2":{"144":1,"150":1}}],["congratulations",{"2":{"141":1,"335":1}}],["conflicts",{"2":{"123":1}}],["configs",{"2":{"415":1}}],["configjsonrpcprovider",{"2":{"214":1,"453":1}}],["config=",{"2":{"100":1,"101":3,"105":1,"117":1,"124":2}}],["config",{"2":{"92":1,"100":2,"101":3,"117":1,"124":1,"130":1,"132":2,"163":3,"177":2,"360":1,"430":1,"431":1,"434":1,"435":1,"436":1,"437":1,"438":1,"448":1,"449":1}}],["configuring",{"0":{"119":1},"1":{"120":1,"121":1},"2":{"130":1}}],["configure",{"2":{"100":1,"105":1,"109":1,"119":1,"341":1,"352":1,"373":1}}],["configured",{"2":{"80":4,"136":1,"137":1,"396":1}}],["configurations",{"2":{"100":1,"124":1,"409":1,"424":1,"430":2}}],["configuration",{"0":{"105":1,"109":1,"120":1,"121":1,"381":1,"382":1,"386":1,"388":1,"395":1,"402":1,"408":1,"409":1,"410":1,"411":1,"423":1,"430":1,"432":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"382":1,"383":2,"384":2,"385":2,"386":2,"387":3,"388":1,"389":3,"396":1,"397":1,"398":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":2,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1},"2":{"91":1,"97":1,"100":1,"105":1,"120":1,"121":1,"124":2,"136":1,"137":1,"240":1,"350":1,"359":1,"368":1,"381":1,"386":1,"387":2,"388":1,"395":2,"396":1,"397":1,"398":1,"399":1,"400":1,"401":3,"402":4,"404":1,"409":2,"423":1,"426":1,"430":5,"431":2,"432":3}}],["confirms",{"2":{"210":1}}],["confirmations",{"2":{"217":1,"455":1}}],["confirmation",{"0":{"216":1,"454":1},"2":{"74":1,"210":1,"216":1,"223":1,"454":1,"461":1}}],["confirm",{"2":{"3":1,"217":1,"455":1}}],["connectweb3react",{"2":{"272":1}}],["connectoptions",{"2":{"189":2}}],["connector",{"0":{"123":1,"282":1,"283":1},"2":{"113":2,"114":2,"123":12,"124":3,"185":1,"241":1,"242":5,"243":2,"248":3,"249":2,"251":1,"252":1,"253":1,"259":3,"268":2,"269":2,"271":2,"272":1}}],["connectorsforwallets",{"2":{"253":2}}],["connectors",{"0":{"122":1,"124":1,"125":1,"237":1},"1":{"123":1},"2":{"99":4,"100":3,"101":3,"113":2,"114":2,"122":4,"123":5,"124":5,"125":2,"237":4,"243":4,"253":2,"271":1,"272":2,"281":1,"283":3}}],["connectdetails",{"2":{"188":3,"189":1,"198":1,"213":2,"214":1,"452":2,"453":1}}],["connected",{"2":{"141":1,"188":1,"210":1,"213":1,"303":1,"307":1,"452":1}}],["connecttowaas",{"2":{"141":1}}],["connecting",{"0":{"141":1,"188":1,"208":1,"209":1,"210":1},"2":{"100":1,"141":1,"197":2,"198":1,"200":1,"210":1}}],["connections",{"2":{"96":1,"239":1,"367":1}}],["connection",{"2":{"7":1,"98":1,"102":1,"210":3,"246":2,"256":1,"272":1,"275":1,"297":1}}],["connect",{"0":{"102":1,"187":1,"189":1,"219":1,"246":1,"256":1,"457":1},"1":{"188":1,"189":1,"190":2,"191":2,"192":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"200":2,"201":2,"202":2,"203":2,"204":2,"205":2,"206":2,"207":2,"208":1,"209":1,"210":1},"2":{"75":1,"84":2,"96":1,"100":1,"101":1,"102":1,"114":1,"124":1,"187":3,"188":7,"189":2,"190":2,"193":1,"194":1,"195":1,"196":3,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"210":1,"213":5,"214":1,"219":1,"239":1,"241":1,"243":1,"246":1,"247":1,"251":1,"253":1,"256":2,"257":1,"261":1,"265":1,"266":1,"274":1,"277":1,"278":2,"341":1,"367":1,"373":1,"452":5,"453":1,"457":1}}],["consensys",{"0":{"421":1},"2":{"419":1}}],["consent",{"2":{"130":1,"349":1}}],["considered",{"2":{"382":1,"385":1,"424":1,"425":1,"430":1,"441":1}}],["consider",{"2":{"284":1}}],["considerations",{"2":{"249":1,"258":1,"407":1}}],["consulted",{"2":{"283":1}}],["consumption",{"2":{"37":1}}],["cons",{"2":{"120":1}}],["console",{"2":{"7":2,"23":1,"24":1,"32":1,"37":1,"39":1,"41":1,"43":1,"56":1,"57":2,"66":3,"72":2,"77":1,"80":1,"120":1,"188":2,"212":1,"214":2,"222":2,"224":2,"225":1,"226":2,"227":2,"228":2,"229":2,"379":1,"394":1,"434":1,"436":2,"437":1,"442":1,"445":1,"446":1,"448":1,"449":1,"451":1,"453":2,"460":2,"462":2,"463":1,"464":2,"465":2,"466":2,"467":2}}],["constants",{"0":{"406":1,"407":1},"2":{"402":4,"408":2}}],["constraints",{"2":{"352":1}}],["constructions",{"2":{"349":1}}],["constructor",{"2":{"321":1}}],["construct",{"2":{"315":1,"319":1,"413":1,"414":1}}],["const",{"2":{"7":3,"23":3,"24":4,"27":2,"32":3,"37":3,"39":4,"41":3,"43":2,"46":1,"56":2,"57":4,"66":14,"72":7,"73":6,"77":7,"80":11,"85":3,"92":1,"100":6,"101":7,"102":4,"103":3,"105":1,"117":1,"118":4,"119":1,"123":2,"124":3,"167":6,"168":1,"169":1,"175":4,"188":11,"189":1,"212":2,"213":2,"214":5,"219":3,"220":3,"221":2,"222":3,"223":2,"224":1,"225":3,"226":12,"227":13,"228":13,"229":13,"243":2,"253":1,"263":3,"271":2,"272":3,"282":2,"283":2,"360":1,"379":1,"387":2,"389":6,"394":4,"402":1,"408":1,"413":4,"414":6,"418":1,"431":1,"434":3,"435":6,"436":9,"437":2,"438":2,"442":1,"443":2,"444":1,"446":1,"448":2,"449":2,"451":2,"452":2,"453":5,"457":3,"458":3,"459":2,"460":3,"461":2,"462":1,"463":3,"464":12,"465":13,"466":13,"467":13}}],["continue",{"2":{"446":1}}],["contains",{"2":{"61":1,"62":1,"63":1,"104":1,"179":1,"352":1,"392":1,"396":1}}],["contain",{"2":{"61":1,"62":1,"139":1,"424":1,"427":1}}],["containing",{"2":{"56":1,"57":1,"283":1,"375":1}}],["contact",{"2":{"5":1,"23":1,"43":1,"56":1,"57":2,"91":1,"359":1,"379":1,"441":1}}],["contribution",{"2":{"430":1}}],["contributes",{"2":{"428":1}}],["contribute",{"2":{"125":1}}],["controlling",{"2":{"172":1,"378":1}}],["controlled",{"2":{"66":2,"72":1,"77":1,"374":1}}],["control",{"2":{"30":1,"80":3,"123":1,"131":1,"181":1,"213":1,"374":1,"376":1,"377":1,"378":1,"423":1,"452":1}}],["contractbytecodeasstring",{"2":{"320":1}}],["contractdeploymentresult",{"2":{"320":1}}],["contractdeploymentreturn",{"2":{"154":1}}],["contractdeployer",{"2":{"320":2}}],["contractcall",{"2":{"317":3,"321":1}}],["contractabi",{"2":{"317":2,"319":2}}],["contractabiasstring",{"2":{"150":2,"151":1}}],["contractaddresses",{"2":{"37":1,"43":3}}],["contractaddress",{"2":{"23":2,"24":6,"37":1,"39":4,"41":6,"50":1,"52":3,"56":3,"57":3,"61":1,"62":1,"66":1,"85":2,"115":1,"120":1,"121":1,"150":2,"151":1,"304":1,"316":1,"317":2,"319":2,"320":1,"321":1}}],["contracturi",{"2":{"44":1,"64":1}}],["contractinfo",{"2":{"43":1,"47":1}}],["contractmetadata",{"2":{"43":2}}],["contracts",{"0":{"316":1,"319":1,"320":1,"342":1},"1":{"317":1,"318":1,"319":1,"320":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1},"2":{"8":2,"23":1,"24":1,"30":2,"37":1,"41":1,"43":1,"54":1,"57":1,"61":2,"62":1,"77":2,"151":1,"154":1,"318":1,"329":1,"346":2,"351":1,"386":1,"419":1,"430":2}}],["contract",{"0":{"9":1,"10":1,"13":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":2,"44":1,"56":1,"77":1,"79":1,"154":1,"317":1,"330":1,"331":1,"332":1,"346":1,"419":1},"1":{"39":1,"41":1,"43":1,"44":1,"78":1,"79":1,"347":1,"420":1,"421":1,"422":1},"2":{"4":4,"8":1,"11":2,"23":2,"24":4,"30":1,"33":1,"35":3,"37":3,"39":8,"41":9,"42":5,"43":2,"44":1,"45":1,"49":3,"50":10,"52":1,"54":5,"55":3,"56":1,"57":1,"61":2,"62":2,"64":3,"65":1,"66":3,"67":4,"74":1,"77":4,"78":1,"79":2,"80":7,"81":2,"85":2,"120":2,"141":1,"144":2,"145":2,"146":1,"147":2,"148":2,"149":2,"150":4,"151":2,"154":5,"185":1,"227":1,"228":1,"304":1,"316":8,"317":8,"319":9,"320":1,"321":5,"322":1,"324":1,"329":1,"330":2,"331":1,"332":3,"333":1,"336":1,"342":2,"346":1,"350":1,"352":1,"379":4,"383":1,"386":2,"389":2,"390":2,"394":1,"395":1,"401":1,"402":1,"412":1,"428":1,"432":1,"465":1,"466":1}}],["contrast",{"2":{"3":1}}],["context",{"0":{"418":1},"2":{"23":2,"24":2,"28":1,"32":2,"37":2,"39":2,"41":2,"43":1,"47":1,"56":1,"57":2,"286":1,"296":1,"389":1,"402":1,"423":1}}],["content",{"2":{"23":2,"24":2,"32":2,"37":2,"39":2,"41":2,"43":2,"56":2,"57":4,"58":1,"80":1,"83":1,"84":1,"165":3,"282":1,"283":2,"326":1,"340":1,"379":3}}],["ubiquitous",{"2":{"321":1}}],["umd",{"2":{"236":3,"365":3}}],["ue",{"2":{"167":1}}],["ufunction",{"2":{"167":6,"175":1}}],["ufunctions",{"2":{"167":1}}],["uobject",{"2":{"167":3,"172":1,"174":1}}],["uauthenticator",{"2":{"167":5,"169":1,"174":2,"175":1}}],["utf",{"2":{"139":2}}],["utility",{"2":{"124":1,"222":1,"460":1}}],["utilizing",{"2":{"4":1}}],["utilized",{"2":{"181":1,"234":1,"472":1}}],["utilize",{"2":{"3":1,"63":1,"100":1,"102":1}}],["utils",{"2":{"66":1,"72":1,"73":4,"77":2,"85":1,"220":2,"222":1,"224":1,"226":2,"227":2,"228":2,"229":3,"387":3,"389":7,"394":2,"414":1,"431":4,"458":2,"460":1,"462":1,"464":2,"465":2,"466":2,"467":3}}],["ui",{"0":{"155":1,"157":1,"167":1},"1":{"156":1,"157":1,"158":2,"159":2},"2":{"131":1,"133":2,"155":6,"156":1,"157":2,"158":1,"159":1,"165":1,"167":1,"168":1,"172":6,"181":1,"185":1}}],["uint96",{"2":{"431":1}}],["uint32",{"2":{"426":1}}],["uint160",{"2":{"428":1}}],["uint16",{"2":{"425":1,"430":1}}],["uint80",{"2":{"383":1}}],["uint8",{"2":{"318":1,"387":4,"414":1,"428":1,"430":1}}],["uint256",{"2":{"61":1,"62":1,"66":1,"72":1,"85":2,"150":1,"226":2,"227":2,"228":4,"229":4,"316":1,"334":2,"387":2,"428":2,"431":2,"464":2,"465":2,"466":4,"467":4}}],["uint64",{"2":{"57":1,"379":1}}],["uint",{"2":{"57":1,"318":1}}],["ultimate",{"2":{"95":1,"238":1,"366":1}}],["ux",{"2":{"87":1,"355":1}}],["unauthenticated",{"2":{"430":1}}],["unauthorized",{"2":{"376":1}}],["unbalanced",{"2":{"427":1}}],["unbuffered",{"2":{"73":1}}],["unusable",{"2":{"401":1,"404":1,"407":1}}],["unpkg",{"2":{"236":1,"365":1}}],["unparalleled",{"2":{"148":1}}],["unfamiliar",{"2":{"141":1,"142":1,"153":1,"154":1}}],["unexpected",{"2":{"132":1}}],["unnoticed",{"2":{"131":1}}],["unlimited",{"2":{"382":1,"407":2}}],["unless",{"2":{"127":1,"150":1,"298":1}}],["unleash",{"2":{"96":1,"239":1,"367":1}}],["unlock",{"2":{"95":1,"238":1,"366":1,"375":2}}],["until",{"2":{"92":1,"172":1,"282":1,"360":1,"442":1}}],["unknown",{"2":{"80":1,"401":1}}],["unsanitized",{"2":{"401":1}}],["unsafe",{"2":{"284":1}}],["unsupported",{"2":{"80":1}}],["unstoppable",{"2":{"50":1}}],["underwent",{"2":{"419":1}}],["underlying",{"2":{"346":1,"390":1,"392":1}}],["understand",{"2":{"285":1,"318":1}}],["understands",{"2":{"159":1}}],["understanding",{"0":{"318":1},"2":{"150":1}}],["under",{"2":{"77":1,"130":1,"132":1,"133":3,"139":1,"144":1,"155":2,"163":2,"179":2,"333":1,"334":1,"385":1}}],["undefined",{"2":{"66":1,"72":1,"80":5,"115":1,"436":1}}],["unwanted",{"2":{"66":1}}],["uniswap",{"2":{"210":1}}],["universal",{"2":{"96":1,"183":1,"184":1,"185":1,"186":1,"239":1,"362":1,"367":1}}],["unit",{"2":{"50":1,"62":1}}],["unityactivity",{"2":{"139":2}}],["unitythemeselector",{"2":{"139":2}}],["unityplayer",{"2":{"139":2}}],["unityplayeractivity",{"2":{"139":2}}],["unitypackage",{"2":{"131":2}}],["unity3d",{"2":{"139":3}}],["unity",{"0":{"29":1,"48":1},"2":{"29":1,"48":1,"90":3,"126":3,"127":1,"129":2,"130":3,"131":3,"139":4,"141":1,"142":1,"152":2,"153":1,"154":3,"157":1,"158":2,"181":1,"184":1,"191":1,"284":3,"358":3}}],["unique",{"0":{"41":1},"2":{"35":1,"123":1,"132":1,"325":1,"394":1}}],["unverified",{"2":{"30":1}}],["unreal",{"0":{"29":1,"48":1,"173":1,"179":1},"2":{"29":1,"48":1,"160":3,"161":1,"169":1,"173":1,"179":5,"181":1,"184":1,"191":1}}],["u",{"2":{"28":1,"47":1}}],["uri",{"0":{"333":1},"2":{"61":2,"62":4}}],["uris",{"2":{"4":1}}],["url",{"0":{"328":1},"2":{"4":2,"7":2,"50":2,"57":1,"62":1,"76":2,"84":1,"85":2,"110":1,"127":1,"129":2,"132":1,"135":2,"136":2,"137":2,"139":3,"174":1,"200":1,"296":2,"328":1,"332":1,"333":2,"340":1}}],["upgradeability",{"2":{"347":1}}],["upgraded",{"2":{"346":1}}],["upi",{"2":{"341":1,"373":1}}],["upon",{"2":{"224":1,"246":1,"266":1,"462":1}}],["ups",{"2":{"184":1}}],["uproject",{"2":{"165":1}}],["updating",{"0":{"336":1},"2":{"81":1,"130":1,"131":1,"391":1,"395":1,"407":1}}],["updateimagehash",{"0":{"400":1},"1":{"401":1,"403":1,"404":1,"405":1,"406":1,"407":1},"2":{"400":1,"402":2,"407":1,"408":2}}],["updateimplementation",{"2":{"392":3,"402":1,"407":1}}],["updateconfiguration",{"0":{"392":1},"1":{"393":1}}],["updated",{"2":{"210":1,"386":1,"399":1,"402":1,"407":3,"408":2,"409":1,"410":2}}],["updates",{"0":{"408":1},"2":{"57":1,"155":1,"388":1,"400":1,"424":1,"426":1}}],["update",{"0":{"77":1,"78":1,"332":1,"390":1,"402":1},"1":{"78":1,"79":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":2,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2},"2":{"2":1,"3":1,"4":1,"74":1,"77":2,"78":1,"130":1,"165":1,"326":1,"336":1,"392":1,"402":3,"404":1,"436":1}}],["uptime",{"2":{"33":1}}],["uploaded",{"2":{"328":1,"334":1}}],["uploading",{"2":{"11":1}}],["upload",{"0":{"327":1},"2":{"4":6,"326":1,"327":2}}],["up",{"0":{"100":1,"101":1,"326":1,"329":1,"434":1,"435":1},"1":{"435":1,"436":1},"2":{"3":1,"22":1,"25":1,"30":1,"31":1,"33":1,"36":1,"38":1,"40":1,"127":1,"135":1,"139":1,"172":1,"173":1,"176":1,"179":1,"266":1,"329":1,"334":1,"434":1,"436":1}}],["usual",{"2":{"435":2}}],["usually",{"2":{"150":1,"334":1}}],["us",{"2":{"150":1,"159":1,"181":1,"214":1,"351":1,"453":1}}],["usable",{"2":{"8":1,"434":1}}],["usage",{"0":{"5":1,"49":1,"51":1,"243":1,"253":1,"263":1,"270":1,"278":1},"1":{"50":1,"51":1,"52":1,"53":1,"54":1,"271":1,"272":1},"2":{"45":1,"237":1,"349":1,"386":1}}],["usdc",{"2":{"8":1,"66":4,"205":1,"347":1}}],["using",{"0":{"18":1,"67":1,"74":1,"84":1,"124":1,"218":1,"241":1,"248":1,"249":1,"251":1,"258":1,"259":1,"261":1,"268":1,"277":1,"282":1,"283":1,"456":1},"1":{"68":1,"69":1,"70":1,"71":1,"72":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"278":1,"279":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1},"2":{"3":1,"6":1,"7":1,"23":1,"24":1,"27":2,"30":1,"32":1,"37":1,"39":1,"41":1,"42":1,"43":1,"46":3,"55":1,"56":1,"58":3,"66":1,"73":1,"77":2,"80":1,"83":2,"91":1,"92":1,"102":1,"103":1,"105":1,"119":1,"122":1,"124":1,"127":1,"130":1,"131":1,"133":1,"144":2,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"155":2,"168":1,"172":1,"174":2,"175":1,"187":2,"188":1,"210":2,"213":1,"214":1,"216":1,"222":1,"237":2,"241":1,"242":1,"247":1,"248":1,"249":3,"250":1,"251":1,"257":1,"258":3,"259":1,"261":1,"277":1,"281":2,"283":4,"287":1,"295":1,"296":3,"347":1,"349":1,"352":1,"359":1,"360":1,"363":1,"371":1,"374":1,"375":1,"378":1,"388":1,"393":1,"395":1,"401":1,"402":1,"432":1,"434":1,"435":2,"436":1,"438":1,"441":1,"446":1,"448":1,"452":1,"453":1,"454":1,"460":1}}],["useismounted",{"2":{"282":2}}],["useeffect",{"2":{"282":1,"436":3}}],["useweb3react",{"2":{"272":2}}],["usequencewallet",{"0":{"174":1},"2":{"172":6,"174":4}}],["usecheckoutmodal",{"2":{"118":3}}],["useopenwalletmodal",{"2":{"103":3}}],["useopenconnectmodal",{"2":{"102":3}}],["useaccount",{"2":{"102":3}}],["userid",{"2":{"437":2}}],["useraddress",{"2":{"219":1,"222":1,"379":3,"457":1,"460":1}}],["userwallet",{"2":{"172":1}}],["user",{"2":{"74":1,"92":1,"102":2,"134":3,"135":1,"141":1,"168":1,"181":2,"187":1,"188":5,"190":1,"198":1,"201":2,"202":3,"203":1,"210":9,"212":1,"213":6,"214":1,"217":4,"221":1,"223":1,"349":1,"351":3,"352":4,"353":2,"360":1,"374":2,"375":4,"377":2,"378":4,"379":3,"433":3,"435":6,"436":1,"437":1,"441":2,"443":2,"444":1,"451":1,"452":6,"453":1,"455":4,"459":1,"461":1}}],["users",{"0":{"211":1,"450":1},"1":{"212":1,"213":1,"214":1,"451":1,"452":1,"453":1},"2":{"8":2,"65":1,"95":1,"96":2,"131":1,"135":1,"155":1,"167":1,"181":1,"184":4,"185":3,"187":8,"188":3,"200":1,"204":2,"205":1,"207":3,"213":2,"216":1,"217":2,"238":1,"239":2,"278":1,"284":1,"297":1,"341":3,"353":1,"366":1,"367":2,"371":1,"373":3,"374":1,"376":1,"377":1,"378":3,"380":1,"439":1,"440":1,"441":1,"452":2,"454":1,"455":2}}],["usefulness",{"2":{"148":1}}],["useful",{"2":{"49":1,"107":1,"130":2,"143":1,"154":1,"207":1,"217":1,"455":1}}],["usestate",{"2":{"436":4}}],["usesessionhash",{"2":{"436":5}}],["uses",{"2":{"33":1,"61":1,"62":1,"132":1,"135":1,"181":1,"249":3,"258":3,"378":1,"390":1}}],["usedisconnect",{"2":{"102":1}}],["used",{"0":{"281":1},"2":{"3":1,"64":1,"66":1,"72":1,"75":1,"92":1,"107":1,"109":1,"130":1,"145":1,"147":1,"149":1,"164":1,"167":1,"193":1,"241":1,"268":1,"277":1,"282":1,"284":1,"288":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"307":1,"308":1,"310":1,"311":1,"312":1,"313":1,"360":1,"378":1,"386":1,"389":1,"403":1,"404":1,"423":1,"424":1,"426":1,"427":1,"430":1,"432":1,"435":2,"436":5}}],["use",{"0":{"80":1,"282":1,"283":1},"1":{"81":1,"82":1,"83":1,"84":1},"2":{"1":1,"4":4,"6":1,"26":1,"33":1,"39":2,"41":2,"45":1,"61":3,"63":3,"65":1,"66":3,"73":1,"74":1,"75":1,"77":1,"80":1,"104":1,"118":1,"123":2,"124":1,"131":1,"133":2,"139":1,"142":1,"143":1,"144":2,"145":1,"146":1,"147":1,"148":1,"149":1,"150":2,"151":1,"153":1,"154":3,"155":1,"158":1,"163":1,"164":1,"165":2,"169":2,"172":1,"173":1,"174":2,"175":1,"177":1,"188":2,"198":1,"206":1,"213":1,"223":1,"231":1,"234":1,"237":1,"248":1,"249":1,"258":1,"259":1,"278":1,"282":1,"283":4,"288":1,"295":1,"296":2,"297":1,"315":1,"317":5,"319":4,"320":1,"321":2,"322":1,"327":1,"334":1,"344":1,"375":1,"380":1,"403":1,"436":1,"442":1,"445":1,"452":1,"461":1,"469":1,"472":1}}],["effectively",{"2":{"376":1}}],["efforts",{"2":{"155":1}}],["effortlessly",{"2":{"95":1,"96":1,"238":1,"239":1,"366":1,"367":1}}],["ecdsa",{"2":{"343":1}}],["ecosystem",{"2":{"59":1,"125":1}}],["equal",{"2":{"293":1,"294":1,"425":1}}],["equally",{"2":{"229":1,"467":1}}],["equivalent",{"2":{"93":1,"232":1,"470":1}}],["ephemeral",{"2":{"216":1,"217":1,"220":1,"454":1,"455":1,"458":1}}],["eye",{"2":{"175":1}}],["eyes",{"2":{"61":1}}],["estimate",{"2":{"305":1}}],["estimategas",{"0":{"305":1},"2":{"305":1}}],["established",{"2":{"441":1}}],["establish",{"2":{"134":1}}],["establishing",{"2":{"133":1}}],["esocialsignintype",{"2":{"167":1}}],["essentially",{"2":{"152":1,"154":1,"333":1}}],["essentials",{"2":{"129":1,"131":1}}],["edit",{"2":{"131":1,"136":1,"137":1,"139":1,"158":1}}],["editor",{"2":{"129":1,"135":1}}],["emitted",{"2":{"448":1}}],["empower",{"2":{"131":1}}],["emailauth",{"2":{"168":1}}],["emailcode",{"2":{"167":1,"168":1}}],["emailin",{"2":{"167":1,"168":1}}],["emaillogin",{"2":{"167":1,"168":1}}],["emailed",{"2":{"134":1}}],["email",{"0":{"134":1,"168":1,"435":1,"440":1},"2":{"112":1,"134":1,"141":1,"167":1,"168":3,"198":1,"202":3,"203":1,"351":1,"352":1,"375":2,"378":2,"434":1,"435":13,"440":1,"441":1,"442":2,"443":1}}],["embedded",{"0":{"17":1,"101":1,"103":1,"349":1},"1":{"350":1,"351":1,"352":1,"353":1},"2":{"87":1,"88":1,"90":2,"91":3,"92":1,"96":2,"98":1,"99":1,"101":1,"103":1,"115":1,"126":2,"133":2,"239":2,"325":1,"349":2,"350":1,"355":1,"356":1,"358":2,"359":3,"360":1,"367":2,"433":1,"435":1,"439":1,"449":1}}],["elsewhere",{"2":{"281":1}}],["else",{"2":{"80":2,"167":1,"222":1,"224":1,"351":1,"449":1,"460":1,"462":1}}],["elements",{"2":{"133":1}}],["element",{"2":{"62":1,"136":1,"137":1,"436":2}}],["eoas",{"2":{"342":1,"343":1,"346":1}}],["eoawallet",{"2":{"287":2}}],["eoa",{"0":{"80":1},"1":{"81":1,"82":1,"83":1,"84":1},"2":{"66":7,"72":2,"74":1,"77":5,"80":1,"81":1,"85":1,"94":1,"233":1,"287":1,"288":1,"383":1,"428":1,"471":1}}],["eip1271",{"2":{"214":1,"234":1,"453":1,"472":1}}],["eip1155",{"2":{"59":1}}],["eip712",{"2":{"194":1,"213":4,"452":4}}],["eip721",{"2":{"59":1}}],["eips",{"2":{"61":4,"62":2}}],["eip",{"2":{"61":3,"62":2,"214":1,"383":1,"401":1,"453":1}}],["either",{"2":{"51":1,"58":1,"61":1,"63":2,"77":1,"84":1,"124":1,"141":1,"150":1,"151":1,"169":1,"172":1,"174":1,"229":1,"293":1,"294":1,"352":1,"374":1,"391":1,"428":1,"446":1,"447":1,"467":1}}],["evm",{"2":{"26":1,"33":1,"55":1,"143":1,"144":1,"150":2,"188":1,"284":2,"287":1,"318":1,"349":1}}],["ever",{"2":{"172":1,"316":1,"432":1}}],["everywhere",{"2":{"187":1}}],["every",{"2":{"33":2,"216":1,"381":1,"383":1,"386":1,"390":1,"394":1,"454":1}}],["everything",{"2":{"4":1,"30":1,"284":1}}],["event",{"2":{"141":1,"153":1,"164":1,"179":1,"188":1}}],["events",{"2":{"33":1,"141":1,"142":2,"153":1,"154":3,"445":1}}],["even",{"2":{"8":1,"23":1,"24":1,"33":1,"37":1,"41":1,"130":1,"181":1,"229":1,"318":1,"374":1,"378":1,"393":1,"401":1,"467":1}}],["ealiest",{"2":{"299":1,"302":1,"304":1,"306":1,"308":1}}],["earliest",{"2":{"298":2}}],["earlier",{"2":{"130":1,"333":1}}],["earring",{"2":{"61":1}}],["each",{"0":{"185":1},"2":{"23":1,"73":1,"151":2,"167":1,"173":1,"179":1,"217":1,"293":1,"294":1,"325":1,"326":3,"349":2,"350":1,"374":2,"427":1,"430":3,"455":1}}],["easier",{"2":{"159":1}}],["easily",{"2":{"8":1,"33":2,"50":1,"116":1,"131":1,"144":2,"146":1,"148":1,"213":1,"234":1,"277":1,"287":1,"288":1,"324":1,"452":1,"472":1}}],["easy",{"2":{"1":1,"33":2,"37":1,"59":1,"133":1,"151":1,"175":1,"184":1,"229":1,"344":1,"467":1}}],["ethtransaction",{"2":{"291":1,"292":1,"293":2,"294":2,"315":1,"317":4,"321":2}}],["ethwallet",{"2":{"287":4,"288":1,"293":2,"294":2}}],["ethauth",{"2":{"193":1,"194":1,"195":1,"213":1,"214":7,"452":1,"453":7}}],["ethauthproofstring",{"2":{"80":2}}],["ethauthproof",{"0":{"80":1,"84":1},"1":{"81":1,"82":1,"83":1,"84":1},"2":{"74":1,"84":1}}],["ethkit",{"0":{"94":1,"233":1,"471":1},"2":{"94":2,"233":2,"471":2}}],["eth",{"0":{"31":1,"32":1},"1":{"32":1},"2":{"143":3,"188":1,"315":1}}],["ether",{"2":{"414":1}}],["etherscan",{"2":{"150":1}}],["ethers",{"0":{"208":1,"406":1,"407":1},"2":{"7":7,"27":3,"66":4,"72":2,"73":6,"77":7,"80":2,"85":8,"94":1,"99":3,"187":1,"214":3,"219":2,"220":3,"224":1,"226":2,"227":2,"228":2,"229":3,"233":1,"235":5,"236":2,"242":2,"248":3,"252":2,"259":3,"262":2,"269":1,"364":4,"365":2,"387":3,"389":7,"394":4,"402":4,"408":2,"431":4,"453":3,"457":2,"458":3,"462":1,"464":2,"465":2,"466":2,"467":3,"471":1}}],["ethereum",{"0":{"32":1,"209":1,"413":1},"2":{"2":1,"8":2,"26":1,"33":4,"45":1,"49":2,"50":1,"61":2,"62":1,"66":1,"72":1,"94":1,"187":3,"188":1,"233":1,"234":1,"235":1,"237":1,"284":1,"297":1,"342":1,"343":1,"349":1,"371":1,"413":1,"471":1,"472":1}}],["etc",{"0":{"31":1,"32":1},"1":{"32":1},"2":{"8":1,"43":1,"56":1,"57":1,"246":1,"247":1,"257":1,"325":1,"351":1,"352":1,"434":1}}],["err",{"2":{"23":3,"24":3,"28":1,"32":3,"37":3,"39":3,"41":3,"43":1,"47":1,"56":1,"57":2,"80":7,"85":2,"214":2,"453":2}}],["errors",{"2":{"172":1,"281":1}}],["error",{"0":{"281":1},"2":{"7":1,"66":2,"77":1,"150":1,"167":1,"175":2,"179":1,"436":6,"449":3}}],["erc1271",{"2":{"415":1,"428":1}}],["erc1155data",{"2":{"229":2,"467":2}}],["erc1155contractaddress",{"2":{"228":2,"229":1,"466":2,"467":1}}],["erc1155interface",{"2":{"228":5,"229":2,"466":5,"467":2}}],["erc1155tokenaddress",{"2":{"148":1,"151":1,"228":1,"466":1}}],["erc1155s",{"2":{"130":1}}],["erc1155",{"0":{"23":1,"24":1,"39":1,"43":1,"56":1,"62":1,"77":1,"149":1},"1":{"78":1,"79":1},"2":{"4":1,"24":1,"30":1,"33":3,"35":1,"37":1,"39":1,"41":2,"42":2,"49":1,"50":1,"54":4,"55":3,"61":2,"62":2,"63":1,"74":1,"80":1,"81":1,"148":5,"149":9,"321":1,"322":1}}],["erc21",{"2":{"147":1}}],["erc20contract",{"2":{"317":6,"319":4}}],["erc20data",{"2":{"229":2,"467":2}}],["erc20tokenaddress",{"2":{"144":1,"151":2}}],["erc20interface",{"2":{"73":2,"226":5,"229":2,"464":5,"467":2}}],["erc20",{"0":{"23":1,"39":1,"41":1,"43":1,"64":1,"145":1},"2":{"30":1,"33":3,"35":2,"37":1,"39":1,"41":2,"42":2,"49":1,"54":2,"64":3,"144":5,"145":9,"150":1,"151":1,"316":1,"317":2,"319":2,"321":8,"322":1,"347":1}}],["erc",{"0":{"226":1,"227":1,"228":1,"413":1,"414":1,"464":1,"465":1,"466":1},"2":{"61":1,"62":1,"66":1,"226":3,"227":3,"228":3,"330":1,"332":1,"412":1,"413":1,"414":1,"464":3,"465":3,"466":3}}],["erc721data",{"2":{"229":2,"467":2}}],["erc721contractaddress",{"2":{"227":2,"229":1,"465":2,"467":1}}],["erc721tokenaddress",{"2":{"66":1,"72":1,"146":1,"151":1,"227":1,"465":1}}],["erc721interface",{"2":{"66":2,"72":2,"227":5,"229":2,"465":5,"467":2}}],["erc721",{"0":{"23":1,"24":1,"39":1,"43":1,"56":1,"61":1,"147":1},"2":{"4":1,"23":2,"24":1,"30":1,"33":3,"37":1,"39":1,"41":2,"42":2,"49":1,"54":4,"55":3,"61":1,"63":1,"80":1,"81":1,"146":3,"147":8,"321":1,"322":1}}],["e",{"2":{"4":1,"66":1,"72":1,"120":1,"139":1,"145":1,"147":1,"149":1,"155":1,"217":1,"247":1,"257":1,"316":1,"347":1,"351":1,"455":1}}],["enum",{"2":{"379":1}}],["ensuring",{"2":{"181":1,"430":1}}],["ensures",{"2":{"72":1}}],["ensure",{"2":{"4":1,"7":1,"8":1,"129":1,"174":2,"179":1,"213":1,"378":2,"401":1,"426":1,"452":1}}],["engines",{"2":{"181":1,"184":1}}],["enclave",{"2":{"351":1}}],["encrypted",{"2":{"351":1}}],["encrypt",{"2":{"164":1}}],["encryption",{"2":{"164":1}}],["encourage",{"2":{"157":1,"322":1}}],["encodepacked",{"2":{"429":1,"430":1}}],["encodetypeddatadigest",{"2":{"414":2}}],["encode",{"2":{"150":1,"226":2,"227":2,"228":2,"387":5,"394":1,"414":1,"415":1,"431":2,"464":2,"465":2,"466":2}}],["encoded",{"2":{"150":1,"413":2,"414":1,"415":1}}],["encodefunctiondata",{"2":{"66":1,"72":1,"73":2,"85":1,"226":3,"227":3,"228":3,"229":3,"402":2,"408":1,"464":3,"465":3,"466":3,"467":3}}],["encoding",{"0":{"412":1},"1":{"413":1,"414":1,"415":1},"2":{"150":2,"316":1}}],["encoding=",{"2":{"139":2}}],["enabling",{"2":{"96":1,"239":1,"283":1,"351":1,"367":1}}],["enable",{"2":{"135":1,"139":1,"165":1}}],["enabled",{"2":{"23":1,"24":1,"37":1,"41":1,"235":1}}],["enables",{"2":{"6":1,"116":1,"349":1}}],["enjoy",{"2":{"96":1,"125":1,"184":1,"239":1,"367":1}}],["env",{"2":{"80":20,"85":11,"92":2,"360":2,"434":2,"435":2,"436":2,"437":2,"438":2,"448":2,"449":2}}],["environment",{"0":{"75":1,"81":1},"1":{"76":1},"2":{"74":1,"75":1,"80":5,"81":1,"82":1}}],["entire",{"2":{"150":1,"283":1,"316":1,"327":1}}],["entirely",{"2":{"64":1,"157":1}}],["entered",{"2":{"134":1}}],["enter",{"2":{"75":1,"76":1,"129":1,"134":1,"136":1,"137":1,"334":1}}],["enforce",{"2":{"66":3,"352":1}}],["enqueuetokensforrefresh",{"2":{"57":6}}],["endingblocknumber",{"2":{"302":1}}],["endpoint",{"2":{"4":2,"6":1,"7":2,"26":2,"49":1,"50":1,"52":1,"54":1,"83":1,"336":2}}],["endpointssequence",{"2":{"49":1}}],["endpoints",{"0":{"34":1,"52":1},"2":{"2":3,"6":1,"8":1,"26":3,"49":3,"58":1}}],["end",{"2":{"4":2}}],["examine",{"2":{"150":1}}],["examples",{"0":{"250":1,"260":1,"345":1,"348":1},"2":{"26":1,"27":1,"28":1,"52":1,"188":1}}],["example",{"0":{"50":1,"104":1,"267":1,"276":1,"279":1,"380":1,"384":1},"2":{"1":1,"4":3,"23":1,"24":1,"26":1,"30":1,"32":1,"35":1,"37":1,"39":2,"41":2,"43":1,"50":2,"52":2,"56":1,"61":2,"62":1,"67":1,"72":2,"73":1,"85":1,"104":1,"120":1,"121":1,"123":2,"142":1,"143":2,"145":1,"147":1,"149":1,"150":1,"151":1,"153":1,"165":1,"181":1,"188":1,"190":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"210":1,"213":1,"214":1,"225":1,"234":1,"237":1,"241":1,"249":2,"250":1,"251":1,"258":2,"261":1,"267":1,"277":1,"279":1,"282":3,"283":4,"317":3,"318":1,"319":3,"321":3,"352":1,"375":1,"379":1,"384":1,"435":1,"452":1,"453":1,"463":1,"472":1}}],["exists",{"2":{"165":1}}],["exist",{"2":{"139":2,"429":1,"434":1}}],["existing",{"2":{"8":1,"77":1,"123":1,"135":1,"184":1,"185":1}}],["excellent",{"2":{"187":1}}],["exception",{"2":{"297":1,"318":1}}],["exceptions",{"2":{"284":3}}],["except",{"2":{"135":1,"435":1}}],["exclude",{"2":{"150":1}}],["excluding",{"2":{"127":1}}],["external",{"2":{"351":1,"392":1,"400":1,"430":2}}],["externally",{"0":{"343":1},"1":{"344":1,"345":1},"2":{"342":1,"343":1,"405":1}}],["extension",{"0":{"209":1,"372":1},"2":{"64":1,"187":2,"208":1,"209":1,"372":1}}],["extensions",{"2":{"50":1,"188":1}}],["extend",{"2":{"63":1,"131":1,"403":1}}],["extra",{"2":{"234":2,"284":1,"472":2}}],["extremely",{"2":{"133":1,"151":1}}],["executing",{"2":{"407":2,"447":1}}],["executioncontext",{"2":{"80":2}}],["executed",{"2":{"65":1,"73":2,"226":1,"227":1,"228":1,"448":1,"449":2,"464":1,"465":1,"466":1}}],["expires",{"2":{"449":1}}],["expiresat",{"2":{"437":2}}],["expiry",{"0":{"193":1},"2":{"193":2,"379":2}}],["express",{"2":{"430":1}}],["explicitly",{"2":{"283":1}}],["explanation",{"2":{"249":2,"258":2}}],["explain",{"2":{"177":1}}],["explorer",{"2":{"150":1}}],["explore",{"2":{"96":1,"239":1,"367":1}}],["expose",{"2":{"152":1}}],["exposes",{"2":{"142":1}}],["exposed",{"2":{"3":1}}],["exported=",{"2":{"139":1}}],["export",{"2":{"80":2,"123":1,"271":1,"282":1,"283":1,"418":1,"431":1,"436":3}}],["expanding",{"2":{"125":1}}],["expand",{"2":{"77":1,"136":1,"137":1,"179":1,"333":1,"334":1}}],["experimental",{"2":{"281":1,"283":1}}],["experiment",{"2":{"158":1}}],["experience",{"2":{"74":1,"95":1,"96":1,"105":1,"181":4,"184":2,"185":1,"187":1,"213":1,"217":1,"238":1,"239":1,"284":1,"366":1,"367":1,"378":1,"452":1,"455":1}}],["experiences",{"2":{"0":1,"184":2,"351":1,"380":1}}],["expects",{"2":{"318":1}}],["expect",{"2":{"154":1,"155":1}}],["expected",{"2":{"66":1,"295":1}}],["blueprintcallable",{"2":{"167":5}}],["blueprint",{"2":{"165":2}}],["blob",{"2":{"61":2,"62":1,"283":1}}],["blockcount",{"2":{"306":2}}],["blockchains",{"2":{"284":1}}],["blockchain",{"0":{"142":1,"152":1},"1":{"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1},"2":{"25":1,"30":1,"33":2,"35":1,"96":1,"142":3,"152":1,"181":1,"184":2,"188":1,"235":1,"239":1,"349":1,"367":1,"374":1}}],["blockrange",{"0":{"302":1},"2":{"302":2}}],["blockhash",{"2":{"300":1,"313":1}}],["blockbyhash",{"0":{"300":1},"2":{"300":1}}],["blockbynumber",{"0":{"299":1},"2":{"299":1}}],["blocknative",{"2":{"261":1}}],["blocknumbers",{"2":{"302":1}}],["blocknumber",{"0":{"301":1},"2":{"74":1,"298":5,"299":2,"301":2,"302":1,"304":3,"306":2,"308":3}}],["blocking",{"2":{"188":2}}],["blocks",{"2":{"30":1,"284":2,"302":1,"306":1}}],["block",{"2":{"7":4,"85":1,"150":1,"188":1,"298":3,"299":4,"300":4,"301":1,"302":2,"313":2,"448":1}}],["bp",{"2":{"165":1,"172":1}}],["bd",{"2":{"160":1}}],["biginteger",{"2":{"308":1,"318":1}}],["bigintegar",{"2":{"298":2,"305":1,"308":1,"310":1,"311":1,"313":1,"319":6,"321":1}}],["bignumber",{"2":{"73":2}}],["bit",{"2":{"179":1}}],["binaries",{"2":{"179":1}}],["binary",{"2":{"150":1,"427":1}}],["bindufunction",{"2":{"167":1}}],["bind",{"2":{"165":1,"167":3}}],["bin",{"2":{"75":1}}],["b",{"0":{"69":1},"2":{"129":1,"132":2,"139":1,"165":1,"430":2}}],["breaches",{"2":{"415":1}}],["breaking",{"2":{"126":3,"160":3,"268":1}}],["breaks",{"2":{"61":1}}],["brave",{"2":{"437":1}}],["branded",{"2":{"352":1}}],["branding",{"2":{"181":1}}],["brackets",{"2":{"316":1}}],["broken",{"2":{"173":1}}],["broadcast",{"2":{"167":1}}],["browsable",{"2":{"139":2}}],["browse",{"2":{"85":1,"139":1}}],["browsers",{"2":{"188":3,"370":1}}],["browser",{"0":{"372":1},"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1,"43":1,"51":1,"56":1,"57":2,"76":1,"169":1,"181":2,"187":3,"188":1,"231":1,"281":1,"283":4,"371":1,"376":1,"379":1,"469":1}}],["brown",{"2":{"61":1}}],["bring",{"2":{"159":1}}],["bsc",{"0":{"32":1}}],["bnb",{"0":{"32":1}}],["bob",{"2":{"414":1}}],["box",{"2":{"179":1}}],["bounded",{"2":{"382":1}}],["bounds",{"2":{"346":1}}],["bound",{"2":{"167":1}}],["bool",{"2":{"167":1,"318":2,"379":2,"396":1,"415":1}}],["boolean",{"2":{"23":2,"24":2,"37":2,"41":2,"80":1}}],["bonus",{"0":{"322":1},"2":{"155":1}}],["bow",{"2":{"62":1}}],["bored",{"2":{"61":2}}],["body",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1,"43":1,"56":1,"57":2,"80":3,"175":2,"379":2}}],["both",{"2":{"4":1,"23":1,"24":1,"26":1,"32":1,"37":1,"39":1,"41":1,"43":1,"49":1,"56":1,"57":2,"59":1,"61":1,"63":5,"183":1,"185":1,"350":1,"351":1,"375":1,"379":1,"407":2}}],["bottom",{"2":{"0":1,"108":3}}],["bundling",{"2":{"229":1,"467":1}}],["bundle",{"2":{"226":1,"227":1,"228":1,"404":1,"407":3,"464":1,"465":1,"466":1}}],["bunch",{"2":{"8":1,"187":1}}],["bug",{"2":{"139":1,"283":1}}],["bugfixes",{"2":{"126":1,"160":1}}],["built",{"2":{"26":1,"33":1,"93":1,"94":1,"95":1,"126":1,"157":1,"160":1,"165":1,"172":1,"179":1,"187":1,"232":1,"233":1,"238":1,"366":1,"470":1,"471":1}}],["builds",{"2":{"126":1,"127":1,"160":1}}],["building",{"0":{"65":1,"230":1,"468":1},"1":{"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"231":1,"232":1,"233":1,"234":1,"469":1,"470":1,"471":1,"472":1},"2":{"181":1,"182":1,"184":1,"234":1,"237":1,"472":1}}],["builder",{"0":{"18":1,"67":1,"77":1,"323":1,"329":1},"1":{"68":1,"69":1,"70":1,"71":1,"72":1,"78":1,"79":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1},"2":{"2":1,"3":1,"7":1,"11":1,"22":3,"23":1,"25":3,"27":1,"30":1,"31":3,"33":3,"36":3,"38":3,"40":3,"43":1,"46":1,"56":1,"57":1,"72":1,"74":2,"77":2,"107":1,"132":2,"144":3,"146":2,"148":2,"154":1,"163":1,"186":1,"296":1,"324":1,"329":1,"330":1}}],["build",{"2":{"1":1,"30":1,"50":1,"67":1,"74":1,"80":1,"81":2,"129":2,"131":1,"133":1,"139":1,"179":4,"181":2,"216":1,"237":1,"284":1,"325":1,"370":1,"371":1,"380":1,"454":1}}],["burn",{"0":{"16":1},"2":{"151":1}}],["bump",{"2":{"8":1}}],["button",{"2":{"77":1,"84":1,"102":2,"103":2,"118":2,"278":1}}],["but",{"2":{"5":1,"30":2,"33":1,"39":2,"41":2,"49":2,"51":1,"59":1,"61":1,"64":1,"72":2,"92":1,"93":1,"94":1,"131":1,"142":1,"150":1,"155":1,"158":1,"187":2,"214":1,"232":1,"233":1,"235":1,"237":1,"297":1,"322":1,"351":1,"352":1,"353":1,"360":1,"386":1,"399":1,"405":1,"430":2,"448":1,"453":1,"470":1,"471":1}}],["banner",{"2":{"188":2,"200":3}}],["bannerurl",{"0":{"200":1},"2":{"188":2,"200":1}}],["bar",{"2":{"132":1,"158":1}}],["basis",{"2":{"123":1}}],["basics",{"2":{"325":1}}],["basic",{"2":{"74":1,"100":1,"143":2,"145":1,"147":1,"149":1,"158":1}}],["bash",{"2":{"75":1}}],["based",{"0":{"168":1,"169":1,"170":1},"2":{"150":1,"168":2,"169":2,"172":1,"181":3,"248":1,"258":3,"259":1,"260":2,"281":1,"282":1,"284":1,"439":1}}],["baseuri",{"2":{"58":1}}],["baseuris",{"2":{"4":1}}],["basecardid",{"2":{"50":1,"62":1}}],["base",{"0":{"333":1},"2":{"4":1,"332":1,"333":1}}],["batching",{"0":{"416":1},"2":{"73":1,"151":1,"226":1,"227":1,"228":1,"464":1,"465":1,"466":1}}],["batch",{"0":{"151":1,"229":1,"467":1},"2":{"54":2,"73":3,"151":3}}],["batched",{"2":{"8":1,"50":1,"73":1,"151":1,"293":1,"294":1}}],["balancequery",{"2":{"319":3}}],["balanceof",{"2":{"319":2,"321":1}}],["balanceat",{"0":{"298":1},"2":{"297":1,"298":2}}],["balance",{"0":{"32":1},"2":{"32":3,"298":5,"319":3,"321":1}}],["balances",{"0":{"11":1,"24":1,"31":1},"1":{"32":1},"2":{"23":2,"24":1,"33":1}}],["back",{"2":{"50":1,"210":1,"375":1}}],["background",{"2":{"23":1,"24":1,"28":1,"32":1,"37":1,"39":1,"41":1,"43":1,"47":1,"56":1,"57":2,"61":1}}],["backends",{"0":{"230":1,"468":1},"1":{"231":1,"232":1,"233":1,"234":1,"469":1,"470":1,"471":1,"472":1},"2":{"8":1,"25":1,"93":1,"94":1,"231":1,"232":1,"233":1,"469":1,"470":1,"471":1}}],["backend",{"0":{"234":1,"472":1},"2":{"3":1,"26":1,"165":2,"167":1,"168":1,"181":1,"234":3,"281":1,"353":1,"472":3}}],["backup",{"2":{"0":1,"344":1}}],["byte",{"2":{"318":1,"415":1}}],["bytecode",{"2":{"154":5,"304":1}}],["bytes4",{"2":{"415":4}}],["bytes1",{"2":{"389":1}}],["bytesn",{"2":{"318":1}}],["bytes",{"2":{"85":1,"228":2,"229":1,"318":2,"334":1,"389":1,"415":3,"466":2,"467":1}}],["bytes32",{"2":{"77":1,"387":1,"389":3,"394":1,"396":1,"400":1,"410":1,"415":3,"428":1,"431":6}}],["by",{"2":{"4":1,"6":1,"8":1,"23":2,"30":2,"50":1,"57":1,"61":1,"64":3,"65":1,"66":4,"67":1,"72":3,"74":1,"75":1,"77":4,"78":1,"81":1,"82":1,"83":1,"96":1,"105":1,"107":1,"115":1,"124":1,"125":2,"130":2,"131":1,"132":1,"133":2,"139":6,"143":1,"145":2,"147":2,"148":1,"149":2,"150":1,"151":1,"152":1,"158":1,"163":1,"172":1,"174":1,"177":1,"182":1,"188":3,"199":1,"204":1,"205":1,"207":1,"210":2,"213":1,"217":1,"237":1,"239":1,"245":1,"255":1,"275":1,"278":1,"282":1,"283":2,"286":1,"296":1,"297":2,"298":1,"300":1,"302":1,"312":1,"313":1,"346":1,"351":3,"352":3,"353":1,"367":1,"374":1,"375":1,"377":1,"378":1,"379":2,"381":1,"382":1,"389":2,"391":2,"393":1,"394":1,"395":1,"401":1,"402":1,"403":1,"404":1,"408":1,"409":1,"415":1,"419":1,"426":1,"428":1,"432":3,"435":2,"436":1,"441":1,"446":1,"448":1,"449":1,"452":1,"455":1}}],["beyond",{"2":{"403":1}}],["beautifully",{"2":{"370":1,"371":1}}],["beautify",{"2":{"157":1}}],["beauty",{"2":{"187":1}}],["being",{"2":{"151":1,"164":2,"165":1,"281":1,"379":1,"405":1}}],["bespoke",{"2":{"151":1}}],["best",{"2":{"8":1,"84":1,"185":1,"188":2,"200":1,"234":1,"284":1,"472":1}}],["beneficial",{"2":{"151":1}}],["benefit",{"2":{"74":1,"125":1}}],["benefits",{"0":{"185":1},"2":{"6":1,"8":1,"187":1}}],["behalf",{"2":{"217":1,"455":1}}],["behavior",{"2":{"423":1}}],["behaviour",{"2":{"132":1,"392":1,"399":1}}],["behaves",{"2":{"210":1}}],["behind",{"2":{"33":1,"315":1}}],["becomes",{"2":{"374":1}}],["become",{"2":{"131":1}}],["because",{"2":{"130":1,"131":1,"346":1,"353":1,"390":1}}],["belong",{"2":{"428":1}}],["below",{"2":{"2":1,"4":2,"23":1,"25":1,"26":2,"27":1,"28":1,"42":1,"49":1,"50":1,"53":1,"55":1,"59":1,"61":1,"67":1,"83":1,"100":1,"101":1,"117":1,"173":1,"179":1,"189":1,"237":2,"250":1,"282":1,"283":1,"401":1,"436":1}}],["bells",{"2":{"284":1}}],["believers",{"2":{"148":1}}],["believe",{"2":{"130":1}}],["begin",{"2":{"436":1}}],["beginning",{"2":{"67":1}}],["began",{"2":{"130":1}}],["better",{"2":{"150":1,"159":2,"175":1}}],["beta",{"2":{"91":1,"160":1,"359":1}}],["between",{"0":{"181":1,"184":1},"2":{"73":1,"133":1,"188":1,"425":1}}],["before",{"2":{"67":2,"80":1,"151":1,"163":1,"174":1,"179":1,"282":2,"407":2,"448":1,"449":2}}],["been",{"2":{"30":1,"172":1,"351":1,"386":1,"435":1,"445":2,"446":1}}],["be",{"2":{"1":1,"3":4,"4":1,"8":1,"23":2,"24":2,"30":4,"37":2,"41":2,"49":1,"52":1,"57":1,"63":1,"65":2,"66":7,"72":1,"73":3,"74":2,"75":1,"77":1,"78":1,"82":1,"84":1,"91":1,"92":1,"107":1,"110":1,"111":1,"112":1,"113":3,"114":3,"115":3,"126":1,"130":3,"131":2,"132":1,"141":1,"142":1,"144":1,"145":1,"147":1,"149":1,"150":3,"155":2,"158":1,"160":1,"163":2,"164":2,"165":3,"167":3,"168":1,"172":2,"174":3,"175":1,"177":1,"179":1,"181":2,"188":1,"190":1,"192":2,"195":1,"198":1,"199":1,"201":1,"202":1,"203":1,"204":1,"205":1,"207":2,"210":2,"213":1,"217":1,"224":1,"229":2,"236":1,"242":1,"245":1,"246":1,"247":1,"251":1,"255":1,"257":1,"261":1,"268":1,"269":1,"271":1,"272":1,"275":1,"277":1,"281":1,"282":2,"283":9,"284":1,"285":1,"288":1,"293":3,"294":3,"295":1,"297":2,"299":1,"302":1,"304":1,"306":1,"308":1,"318":1,"321":1,"333":2,"334":1,"341":3,"346":1,"349":2,"350":1,"352":2,"353":3,"359":1,"360":1,"365":1,"373":3,"374":2,"376":1,"377":1,"378":5,"382":1,"383":1,"388":1,"389":1,"391":2,"393":2,"395":1,"397":1,"399":1,"401":4,"404":1,"405":1,"407":5,"408":1,"409":2,"410":2,"413":1,"414":1,"415":1,"424":1,"426":1,"427":1,"430":2,"432":1,"434":1,"435":3,"438":2,"441":1,"444":1,"446":1,"448":1,"449":4,"452":1,"455":1,"462":1,"467":2}}],["gnosis",{"2":{"348":1}}],["guestmodule",{"0":{"417":1},"2":{"418":1}}],["guess",{"2":{"325":1}}],["guarantee",{"2":{"351":1,"441":1}}],["guarantees",{"2":{"349":1}}],["guard",{"0":{"352":1,"377":1},"2":{"62":1,"352":4,"353":2,"375":2,"377":2,"378":1,"448":1}}],["gui",{"2":{"168":2,"172":3}}],["guides",{"2":{"152":1,"182":1}}],["guide",{"2":{"74":1,"75":1,"77":1,"78":1,"79":1,"97":1,"98":1,"122":1,"123":1,"177":1,"182":1,"240":1,"324":1,"368":1}}],["g",{"2":{"66":1,"120":1,"145":1,"147":1,"149":1,"155":1,"217":1,"247":1,"257":1,"316":1,"347":1,"351":1,"455":1}}],["got",{"2":{"333":1}}],["goerli",{"2":{"247":1,"257":1}}],["goes",{"2":{"150":1}}],["good",{"2":{"123":1}}],["googlelogin",{"2":{"436":3}}],["googleoauthprovider",{"2":{"436":3}}],["googleclientid",{"2":{"177":1}}],["google",{"0":{"177":1,"436":1},"2":{"96":1,"113":1,"124":2,"135":1,"177":1,"188":1,"201":2,"203":1,"239":1,"352":1,"367":1,"378":1,"434":1,"436":8,"437":4,"441":1}}],["golang",{"2":{"93":1,"232":1,"470":1}}],["goldcardid",{"2":{"50":1}}],["go",{"0":{"28":1,"47":1,"93":1,"232":1,"470":1},"2":{"23":1,"24":1,"26":2,"28":3,"32":1,"37":1,"39":1,"41":2,"43":1,"47":3,"51":1,"53":1,"56":1,"57":2,"93":6,"94":2,"131":1,"165":1,"173":1,"214":3,"232":6,"233":2,"234":1,"316":1,"439":1,"453":3,"470":6,"471":2,"472":1}}],["git",{"2":{"75":1,"129":3}}],["github",{"2":{"23":1,"24":1,"28":2,"30":1,"32":1,"37":1,"39":1,"41":1,"43":1,"47":2,"56":1,"57":2,"61":2,"62":1,"93":1,"104":1,"129":1,"232":1,"241":1,"251":1,"261":1,"277":1,"279":1,"282":1,"283":2,"470":1}}],["gives",{"2":{"165":1}}],["give",{"0":{"7":1},"2":{"62":1,"158":2,"174":1,"181":1,"449":1}}],["given",{"2":{"3":1,"132":1,"163":1,"291":2,"292":2,"293":2,"294":2,"295":1,"298":2,"304":1,"305":1,"308":2,"309":1,"394":1,"398":1,"402":1,"404":1}}],["greater",{"2":{"425":1}}],["great",{"2":{"141":1,"142":1,"153":1,"154":1,"184":1}}],["grin",{"2":{"61":1}}],["grantrole",{"2":{"77":1}}],["grade",{"2":{"50":1}}],["grab",{"2":{"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1}}],["groupname",{"2":{"253":1}}],["groups",{"0":{"215":1}}],["group",{"2":{"8":1}}],["geared",{"2":{"184":1}}],["genericfailure",{"2":{"172":1}}],["generated",{"2":{"75":1,"76":1,"77":2,"84":1,"217":1,"287":1,"325":1,"375":2,"378":2,"435":2,"447":1,"455":1}}],["generate",{"0":{"220":1,"458":1},"2":{"73":2,"77":2,"84":2,"177":2,"287":1,"378":1,"426":1}}],["generating",{"2":{"11":1,"77":1}}],["general",{"2":{"52":1,"131":1,"142":1,"154":1,"179":1,"284":2}}],["getelementbyid",{"2":{"436":1}}],["getetherbalance",{"2":{"32":5}}],["getimagehash",{"2":{"409":1}}],["getfunction",{"2":{"402":2,"408":1}}],["getuseractivities",{"0":{"379":1},"1":{"380":1},"2":{"379":4,"380":1}}],["getchainid",{"2":{"222":1,"460":1}}],["getcomponentinchildren",{"2":{"133":1}}],["getcontractinfo",{"2":{"43":1,"47":1,"54":1}}],["getcontractinfobatch",{"2":{"43":5,"54":1}}],["getcollection",{"2":{"4":1}}],["getprovider",{"2":{"222":1,"460":1}}],["getaddress",{"0":{"290":1},"2":{"212":1,"219":1,"220":1,"227":1,"228":1,"290":1,"298":2,"308":2,"317":2,"321":1,"389":1,"451":1,"457":1,"458":1,"465":1,"466":1}}],["getwallet",{"2":{"188":5,"212":1,"213":1,"451":1,"452":1}}],["getvalid",{"2":{"174":1}}],["getloginurl",{"2":{"167":1}}],["getlatestblock",{"2":{"7":2}}],["getsessionhash",{"2":{"434":1,"435":1,"436":2}}],["getstorageat",{"2":{"394":1}}],["getstoredcredentials",{"2":{"174":2}}],["getstoredkey",{"2":{"164":1}}],["getsigner",{"2":{"66":2,"72":1,"73":2,"77":1,"85":1,"219":1,"225":1,"226":2,"227":2,"228":2,"229":2,"457":1,"463":1,"464":2,"465":2,"466":2,"467":2}}],["getkitconnectwallets",{"2":{"124":2}}],["getdefaultconnectors",{"2":{"100":2,"101":2,"124":1}}],["gettoporders",{"2":{"340":1}}],["gettokenrefreshstatus",{"2":{"57":5}}],["gettokenmetadatabatch",{"2":{"54":1}}],["gettokenmetadata",{"2":{"54":1,"56":6}}],["gettokensupplies",{"2":{"41":7}}],["gettokenbalances",{"2":{"23":9,"24":7,"27":1,"28":1,"32":2}}],["gettransactionhistory",{"2":{"37":7,"39":7}}],["getting",{"0":{"35":1,"89":1,"98":1,"182":1,"186":1,"357":1},"1":{"90":1,"91":1,"92":1,"99":1,"358":1,"359":1,"360":1},"2":{"97":1,"181":1,"240":1,"368":1}}],["getblocknumber",{"2":{"80":3,"85":3}}],["getblock",{"2":{"7":1}}],["get",{"0":{"328":1},"2":{"0":1,"4":1,"7":1,"22":1,"25":1,"28":1,"30":1,"31":1,"33":1,"36":1,"38":1,"40":1,"47":1,"52":3,"66":2,"72":2,"74":1,"80":4,"82":1,"85":2,"88":1,"99":1,"130":1,"150":1,"160":2,"169":1,"174":1,"179":1,"182":2,"186":2,"212":1,"295":1,"298":4,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"306":1,"307":1,"308":1,"310":1,"311":1,"312":1,"313":1,"336":1,"339":1,"356":1,"363":1,"370":1,"371":1,"434":2,"451":1}}],["gain",{"2":{"353":2}}],["gather",{"2":{"325":1,"327":1}}],["gate",{"2":{"158":1}}],["gateway",{"0":{"6":1},"1":{"7":1},"2":{"6":1,"296":1}}],["gaming",{"2":{"184":1}}],["gameobject",{"2":{"133":1,"158":1}}],["game",{"0":{"9":1,"15":1,"16":1},"2":{"26":2,"33":1,"35":1,"50":1,"74":1,"130":5,"160":2,"180":1,"181":6,"183":1,"184":4,"185":1,"186":1,"221":1,"235":1,"237":1,"330":1,"459":1}}],["games",{"2":{"0":1,"25":1,"33":1,"126":1,"148":1,"160":1,"184":2}}],["gasused",{"2":{"449":1}}],["gaslist",{"2":{"382":1}}],["gaslimit",{"0":{"407":1},"2":{"315":1,"317":1,"402":2,"407":2,"408":1,"449":1}}],["gaslimitestimator",{"2":{"315":1}}],["gasless",{"0":{"74":1},"1":{"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"185":1}}],["gastipcap",{"2":{"311":1}}],["gasprice",{"2":{"310":1,"315":1,"317":1}}],["gas",{"0":{"67":1,"70":1,"71":1},"1":{"68":1,"69":1,"70":1,"71":1,"72":1},"2":{"8":7,"11":1,"66":3,"72":2,"74":1,"143":3,"151":1,"298":1,"305":2,"306":1,"310":1,"311":1,"315":1,"386":1,"407":1}}],["gt",{"2":{"3":2,"7":2,"52":10,"63":2,"66":6,"72":2,"76":2,"77":2,"80":7,"83":2,"84":4,"85":5,"100":9,"101":21,"102":6,"103":4,"105":3,"117":10,"118":4,"120":1,"123":2,"124":8,"127":3,"129":2,"131":1,"132":4,"133":1,"136":2,"137":2,"139":42,"155":1,"158":3,"163":1,"167":10,"172":1,"174":1,"175":2,"179":3,"188":1,"214":2,"235":1,"236":4,"242":1,"272":2,"282":4,"283":6,"302":2,"318":6,"319":5,"327":1,"336":3,"364":1,"365":4,"379":1,"415":1,"430":1,"436":16,"444":1,"445":1,"446":1,"453":2}}],["due",{"2":{"158":1,"179":1,"268":1,"282":1,"441":1}}],["during",{"2":{"132":1,"163":1,"179":1,"386":1,"395":1,"426":2,"432":2}}],["dropsession",{"2":{"438":1}}],["dropdown",{"2":{"3":1}}],["drawer",{"2":{"165":1}}],["drag",{"2":{"131":1,"133":1,"179":1}}],["ddos",{"0":{"80":1},"1":{"81":1,"82":1,"83":1,"84":1},"2":{"74":1}}],["digest",{"2":{"429":1,"431":1}}],["digit",{"2":{"134":1}}],["diligence",{"0":{"421":1},"2":{"419":1}}],["dive",{"2":{"97":1,"240":1,"368":1}}],["difficult",{"2":{"284":1}}],["difficulty",{"2":{"74":1}}],["differs",{"2":{"249":1,"258":1,"390":1}}],["differing",{"2":{"173":1}}],["difference",{"2":{"227":1,"228":1,"465":1,"466":1}}],["differences",{"0":{"181":1,"184":1},"2":{"59":1}}],["different",{"2":{"173":1,"188":1,"226":1,"227":1,"228":1,"237":1,"342":1,"350":1,"352":1,"464":1,"465":1,"466":1}}],["dictionary",{"2":{"62":1,"63":1}}],["dice",{"2":{"62":1}}],["die",{"2":{"62":1}}],["discuss",{"2":{"441":1}}],["discouraged",{"2":{"281":1}}],["disconnectweb3react",{"2":{"272":1}}],["disconnect",{"2":{"196":1,"210":1}}],["discord",{"2":{"96":1,"135":1,"201":1,"214":1,"239":1,"367":1,"453":1}}],["disk",{"2":{"167":1,"173":1}}],["disabled",{"2":{"133":1}}],["displayedassets",{"0":{"115":1}}],["displayed",{"2":{"113":1,"114":1,"115":4,"172":1,"210":1,"275":1,"341":1,"373":1}}],["displaying",{"2":{"98":1}}],["dispatched",{"2":{"73":1}}],["dispatch",{"2":{"8":1,"65":1,"66":2,"73":1,"225":1,"463":1}}],["dispatching",{"2":{"8":1}}],["dist",{"2":{"236":1,"365":1}}],["distribution",{"0":{"236":1,"365":1},"2":{"236":1,"365":1,"430":1}}],["district",{"2":{"61":1}}],["distractions",{"2":{"184":1}}],["distinct",{"2":{"73":2,"439":1}}],["directive",{"2":{"283":4}}],["direct",{"2":{"189":1,"352":1,"402":1}}],["directory",{"0":{"282":1,"283":1},"2":{"30":2,"75":1,"80":1,"165":1,"281":2,"283":2}}],["directly",{"2":{"26":1,"29":1,"33":1,"42":2,"48":1,"49":1,"55":2,"142":1,"153":1,"154":1,"217":1,"235":1,"317":1,"341":1,"352":1,"364":1,"373":1,"386":2,"410":1,"435":1,"436":1,"455":1}}],["d",{"2":{"23":2,"24":2,"26":1,"27":1,"28":1,"32":2,"37":2,"39":2,"41":1,"43":1,"50":2,"53":1,"56":1,"57":2,"83":1,"84":1,"150":1,"214":1,"234":2,"237":1,"379":1,"449":1,"453":1,"472":2}}],["dangerous",{"2":{"392":1,"407":1}}],["dark",{"2":{"107":1,"188":1}}],["dashboard",{"2":{"75":1,"352":1}}],["damage",{"2":{"50":1,"353":1}}],["datatypes",{"2":{"318":2}}],["data2",{"2":{"226":2,"227":2,"228":2,"464":2,"465":2,"466":2}}],["data1",{"2":{"226":2,"227":2,"228":2,"464":2,"465":2,"466":2}}],["database",{"2":{"142":2}}],["data",{"0":{"318":1,"413":1,"414":1},"2":{"25":1,"30":2,"33":2,"57":1,"62":1,"63":3,"66":2,"72":2,"73":2,"85":3,"139":4,"143":1,"167":1,"226":4,"227":4,"228":6,"229":4,"317":1,"319":1,"334":1,"340":1,"351":1,"379":1,"402":2,"408":1,"413":1,"414":2,"415":1,"448":3,"449":2,"464":4,"465":4,"466":6,"467":4}}],["dapps",{"2":{"8":1,"189":1,"210":1,"237":1,"250":1,"371":1}}],["dapp",{"0":{"68":1,"69":1,"84":1,"188":1,"208":1,"209":1},"2":{"8":1,"26":1,"33":1,"35":1,"77":1,"83":1,"84":1,"187":3,"188":9,"190":1,"192":1,"194":1,"200":1,"208":2,"210":6,"213":2,"214":1,"234":1,"235":1,"237":3,"241":2,"251":2,"261":2,"277":2,"279":1,"283":1,"364":1,"371":1,"452":2,"453":1,"472":1}}],["daicontractaddress",{"2":{"226":3,"229":1,"464":3,"467":1}}],["dai",{"2":{"8":1,"66":1,"444":2}}],["debit",{"2":{"341":1,"373":1}}],["debugging",{"2":{"284":1}}],["deactivate",{"2":{"272":1}}],["deactivated",{"2":{"272":1}}],["deactivation",{"0":{"272":1}}],["deal",{"2":{"150":1}}],["derive",{"2":{"220":1,"458":1}}],["denoted",{"2":{"150":1}}],["deep",{"2":{"135":2,"139":3}}],["delightful",{"2":{"188":1}}],["delivering",{"2":{"184":1}}],["delivery",{"2":{"8":1}}],["del",{"2":{"167":3}}],["delegatecall",{"0":{"403":1},"2":{"402":2,"403":2,"408":1}}],["delegates",{"2":{"167":2}}],["delegate",{"2":{"165":1,"167":1,"319":1}}],["delete",{"2":{"80":1,"179":3}}],["delayed",{"2":{"150":1}}],["delayedencodedata",{"2":{"150":2,"151":1}}],["delayedencode",{"0":{"150":1},"2":{"150":4,"151":1}}],["departments",{"2":{"430":1}}],["department",{"2":{"430":2}}],["deprecated",{"2":{"373":1}}],["depth",{"2":{"246":1,"256":1}}],["depends",{"2":{"282":1}}],["depending",{"2":{"249":1,"258":1,"332":1}}],["depend",{"2":{"235":1,"281":1,"364":1}}],["dependent",{"2":{"167":1}}],["dependencies",{"2":{"99":1,"235":1,"364":1}}],["dependency",{"2":{"73":1,"235":1,"364":1}}],["dependant",{"2":{"158":1}}],["deploycontract",{"2":{"154":4}}],["deploymentresult",{"2":{"320":2}}],["deployment",{"0":{"154":1,"417":1},"2":{"75":1,"154":1,"391":1,"432":1}}],["deploying",{"0":{"320":1},"2":{"11":1,"57":1,"151":1,"154":2}}],["deployedwalletcontext",{"2":{"214":1,"453":1}}],["deployedcontractaddress",{"2":{"154":1}}],["deployed",{"2":{"8":1,"67":2,"80":2,"81":1,"316":1,"332":1,"410":2,"432":1}}],["deploy",{"0":{"9":1,"13":1,"14":1,"19":1,"75":1,"76":1,"77":1,"83":1,"330":1},"1":{"76":1,"78":1,"79":1},"2":{"4":2,"6":1,"11":1,"74":2,"75":1,"76":1,"77":1,"82":1,"83":1,"85":1,"144":1,"146":1,"148":1,"154":2,"320":2,"329":1,"330":1,"432":1}}],["defi",{"2":{"190":1}}],["defines",{"2":{"392":1,"400":1,"423":1}}],["define",{"2":{"352":1,"423":1,"435":1}}],["defined",{"2":{"63":2,"167":1,"247":1,"257":1,"286":1,"296":1,"321":1,"322":1,"381":1,"389":2,"394":1,"402":1,"403":1,"405":1}}],["definition",{"2":{"150":1}}],["defense",{"2":{"130":2,"352":1}}],["defaultabicoder",{"2":{"387":1,"394":2}}],["defaultpurchaseamount",{"0":{"206":1},"2":{"206":1}}],["defaultfundingcurrency",{"0":{"205":1},"2":{"188":2,"205":1,"207":2}}],["defaulting",{"2":{"143":1}}],["defaultnetwork",{"0":{"247":1,"257":1},"2":{"124":1,"188":1,"243":1,"253":1}}],["defaulttheme",{"0":{"107":1},"2":{"107":1}}],["defaultchainid",{"2":{"100":1,"101":1}}],["defaults",{"2":{"92":1,"158":1,"308":1,"360":1,"378":1,"434":1,"435":1,"436":1,"437":1,"438":1,"448":1,"449":1}}],["default",{"2":{"23":2,"24":1,"30":1,"37":1,"41":1,"65":1,"80":1,"133":1,"139":3,"155":1,"172":1,"193":1,"197":1,"204":1,"205":1,"206":2,"207":2,"247":2,"256":1,"257":2,"265":1,"274":1,"278":1,"282":1,"283":1,"298":2,"321":1,"378":1,"436":1}}],["demand",{"0":{"417":1},"2":{"187":2,"208":1,"349":1}}],["demos",{"2":{"182":1,"186":1}}],["demo",{"0":{"87":1,"338":1,"355":1,"362":1},"2":{"87":1,"96":1,"100":1,"101":1,"130":3,"158":2,"188":2,"208":1,"237":1,"239":1,"241":1,"243":1,"250":4,"251":1,"253":1,"260":3,"261":1,"267":1,"271":1,"276":1,"277":1,"279":2,"283":1,"338":1,"355":1,"362":1,"367":1,"436":2}}],["demonstrated",{"2":{"282":1}}],["demonstrates",{"2":{"214":1,"453":1}}],["demonstrate",{"2":{"49":1}}],["demonstrating",{"2":{"4":1}}],["demystify",{"2":{"59":1}}],["decoding",{"2":{"316":1}}],["decode",{"2":{"394":2}}],["decodeproof",{"2":{"214":1,"453":1}}],["decoded",{"2":{"37":1}}],["declare",{"2":{"283":1}}],["declared",{"2":{"283":1,"407":1}}],["declaration",{"2":{"283":1}}],["decline",{"2":{"75":1}}],["decentralized",{"2":{"217":1,"455":1}}],["decrypt",{"2":{"164":1}}],["decimalnormalizer",{"2":{"143":2,"144":1,"145":1,"150":2,"151":2,"315":1,"321":2}}],["decimals",{"2":{"50":1,"61":1,"62":1,"64":1,"143":3,"144":4}}],["desc",{"2":{"340":1}}],["described",{"2":{"64":1,"189":1,"282":1,"283":1}}],["describe",{"2":{"59":1}}],["description",{"2":{"50":3,"61":2,"62":1,"246":1,"256":1,"325":2,"326":2}}],["destinations",{"2":{"179":1}}],["desktop",{"0":{"169":1},"2":{"169":2,"172":1,"187":1}}],["desired",{"2":{"158":1}}],["design",{"2":{"151":1,"347":1}}],["designed",{"2":{"1":1,"30":1,"187":1}}],["determining",{"2":{"315":1}}],["determined",{"2":{"192":1}}],["determine",{"2":{"115":1,"317":1}}],["determines",{"2":{"107":1,"108":1,"112":1,"113":1,"114":1,"388":1,"424":1,"444":1}}],["detect",{"2":{"102":1}}],["detects",{"2":{"33":1}}],["detail",{"2":{"64":1}}],["details",{"0":{"10":1,"331":1},"2":{"37":1,"39":1,"41":3,"61":1,"62":1,"77":1,"123":1,"210":1,"246":1,"331":1,"334":1,"352":1}}],["devices",{"2":{"371":1,"376":1}}],["device",{"2":{"221":1,"374":1,"375":1,"438":1,"459":1}}],["deviate",{"2":{"59":1}}],["developing",{"2":{"284":1}}],["developer",{"2":{"341":1,"373":1}}],["developers",{"2":{"105":1,"116":1,"187":1,"380":1}}],["developed",{"2":{"187":1,"237":1}}],["development",{"2":{"75":1,"180":1,"181":1,"186":1,"235":1,"352":1}}],["dev",{"2":{"0":1,"75":2,"76":1,"83":1,"84":1,"94":1,"233":1,"340":1,"379":2,"415":1,"471":1}}],["dom",{"2":{"436":1}}],["doing",{"2":{"321":1}}],["doubt",{"2":{"150":1}}],["don",{"2":{"150":1,"158":1,"159":1,"210":1,"229":1,"317":1,"386":1,"388":1,"433":1,"441":1,"467":1}}],["done",{"2":{"3":1,"77":1,"78":1,"91":1,"141":2,"152":1,"154":1,"168":1,"169":1,"175":1,"210":1,"359":1,"375":1,"449":1}}],["download",{"2":{"131":1}}],["down",{"2":{"75":1,"113":1,"114":1,"136":1,"137":1,"316":1}}],["downside",{"2":{"30":1}}],["do",{"0":{"282":1,"283":1},"2":{"50":1,"61":1,"64":1,"73":1,"77":2,"84":1,"129":1,"131":2,"132":1,"141":1,"142":2,"153":1,"154":2,"159":1,"164":2,"172":1,"213":2,"214":3,"237":1,"282":1,"316":2,"326":1,"346":1,"452":2,"453":3}}],["documented",{"2":{"152":1}}],["document",{"2":{"150":1,"436":1}}],["documentation",{"2":{"1":1,"2":1,"8":1,"33":1,"90":1,"100":1,"130":2,"143":1,"144":1,"146":1,"148":1,"297":1,"298":1,"358":1}}],["docs",{"2":{"27":1,"28":1,"44":2,"61":2,"80":1,"81":1,"133":1,"139":1,"152":1,"177":1,"178":1,"237":1}}],["doesn",{"2":{"8":1,"127":1,"139":2,"172":1,"390":1,"401":1,"402":1,"406":1,"407":1,"434":1}}],["does",{"0":{"281":1},"2":{"0":1,"135":1,"143":1,"352":1,"432":1,"440":1}}],["lv7xncqh",{"2":{"62":1}}],["loss",{"2":{"392":1}}],["lost",{"2":{"375":3,"377":1}}],["longer",{"2":{"379":1}}],["long",{"2":{"188":1,"334":1,"435":1}}],["locking",{"2":{"207":1}}],["lockfundingcurrencytodefault",{"0":{"207":1},"2":{"188":2}}],["locate",{"2":{"132":1,"133":1,"158":1}}],["located",{"2":{"50":1,"132":1}}],["location",{"2":{"108":1}}],["localhost",{"2":{"394":1}}],["localstorage",{"2":{"220":1,"458":1}}],["locally",{"2":{"77":1}}],["local",{"2":{"75":4,"77":1,"84":1,"217":1,"220":1,"224":1,"413":1,"414":1,"455":1,"458":1,"462":1}}],["lots",{"2":{"175":2}}],["loading",{"2":{"224":1,"436":1,"462":1}}],["load",{"2":{"132":2}}],["love",{"2":{"125":1}}],["look",{"2":{"80":1,"97":1,"101":1,"150":1,"213":1,"235":1,"240":1,"317":1,"319":1,"325":1,"326":1,"333":2,"364":1,"368":1,"452":1}}],["looking",{"2":{"63":1}}],["lookup",{"2":{"50":1}}],["logs",{"2":{"436":1,"448":3}}],["logic",{"2":{"346":1}}],["logically",{"2":{"285":1}}],["loginpanel",{"2":{"133":5}}],["logins",{"2":{"96":1,"184":1,"239":1,"367":1,"375":1,"435":2,"442":2}}],["login",{"0":{"189":1,"375":1,"440":1,"441":1},"1":{"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"376":1,"377":1,"378":1},"2":{"75":3,"83":1,"135":1,"141":1,"165":1,"167":5,"184":1,"185":1,"351":3,"353":1,"374":1,"375":2,"378":1,"436":5,"439":1,"442":1}}],["logging",{"2":{"200":1,"440":1,"441":1}}],["logged",{"2":{"75":1}}],["logtemp",{"2":{"167":1}}],["logos",{"2":{"181":1}}],["logolight",{"2":{"123":2}}],["logodark",{"2":{"123":2}}],["logourl",{"0":{"110":1}}],["logouri",{"2":{"50":1}}],["logo",{"2":{"50":1,"110":1}}],["log",{"2":{"7":1,"23":2,"24":2,"32":2,"37":2,"39":2,"41":2,"43":1,"56":1,"57":2,"66":3,"72":2,"77":1,"80":1,"120":1,"167":1,"188":2,"212":1,"214":2,"222":2,"224":2,"225":1,"226":2,"227":2,"228":2,"229":2,"379":1,"394":1,"434":1,"435":1,"436":1,"437":1,"441":1,"442":1,"445":1,"446":1,"448":1,"449":1,"451":1,"453":2,"460":2,"462":2,"463":1,"464":2,"465":2,"466":2,"467":2}}],["len",{"2":{"413":1}}],["length",{"2":{"293":2,"294":2}}],["lemur",{"2":{"333":1}}],["left",{"2":{"105":1,"108":3,"179":2,"431":1}}],["leaf",{"2":{"427":2,"428":1,"429":1,"430":1,"431":1}}],["lead",{"2":{"392":1}}],["leading",{"2":{"96":1,"239":1,"367":1}}],["least",{"2":{"375":1}}],["leaked",{"2":{"353":1}}],["leave",{"2":{"181":1}}],["leaving",{"2":{"181":1}}],["learning",{"2":{"104":1}}],["learn",{"2":{"42":2,"45":1,"55":2,"144":1,"146":1,"148":1,"150":1,"341":1,"373":1}}],["leverage",{"0":{"185":1},"2":{"184":1,"185":1}}],["leveraged",{"2":{"181":1}}],["leverages",{"2":{"134":1}}],["leveraging",{"2":{"88":1,"182":1,"339":1,"356":1,"362":1}}],["levels",{"2":{"430":1}}],["level",{"0":{"44":1,"424":1},"1":{"425":1,"426":1,"427":1,"428":1,"429":1,"430":1},"2":{"4":4,"42":3,"44":1,"45":1,"50":3,"52":2,"66":1,"187":1}}],["let",{"2":{"50":2,"150":1,"387":1}}],["layout",{"0":{"382":1,"383":1},"1":{"383":1,"384":2,"385":2,"386":1,"387":1}}],["label",{"2":{"180":1,"181":3,"182":1}}],["landscape",{"2":{"172":1}}],["languages",{"0":{"234":1,"472":1}}],["language",{"2":{"26":1,"53":1,"214":1,"234":1,"453":1,"472":1}}],["launched",{"2":{"181":1}}],["launcher",{"2":{"139":2}}],["launching",{"2":{"181":1}}],["launch",{"2":{"165":1,"336":1}}],["later",{"2":{"127":1,"161":1,"268":1,"317":1,"319":1,"321":1}}],["latestblock",{"2":{"7":2}}],["latest",{"2":{"7":5,"28":1,"47":1,"131":1,"236":1,"242":2,"298":3,"299":1,"302":1,"304":1,"306":1,"308":3,"365":1}}],["lastest",{"2":{"250":1}}],["last",{"2":{"67":1,"75":1,"179":1}}],["lt",{"0":{"248":1,"259":1},"2":{"7":2,"52":10,"63":2,"66":2,"72":1,"76":2,"77":1,"80":4,"83":2,"84":4,"85":3,"100":8,"101":19,"102":4,"103":2,"105":3,"117":9,"118":2,"124":8,"139":38,"167":1,"175":2,"188":1,"213":4,"214":1,"235":1,"236":4,"248":1,"250":1,"259":1,"282":3,"283":5,"302":2,"319":5,"336":3,"364":1,"365":4,"428":2,"436":11,"452":4,"453":1}}],["little",{"2":{"324":1}}],["literally",{"2":{"181":1}}],["live",{"2":{"241":2,"251":2,"261":2,"277":2}}],["lives",{"2":{"130":1}}],["libs",{"2":{"418":1}}],["libraries",{"2":{"237":2,"250":1,"258":3,"260":2,"281":4,"282":1}}],["library",{"0":{"92":1,"282":1,"283":1,"360":1},"2":{"7":1,"92":1,"95":1,"126":1,"145":1,"147":1,"149":1,"234":1,"238":1,"282":1,"283":2,"284":3,"285":1,"288":1,"318":1,"360":1,"366":1,"413":1,"414":1,"472":1}}],["lib",{"2":{"236":1,"365":1}}],["limitation",{"2":{"282":2}}],["limited",{"2":{"217":1,"353":1,"430":1,"455":1}}],["limit",{"2":{"188":1,"203":1}}],["limits",{"2":{"5":2,"352":1}}],["lightweight",{"2":{"284":1}}],["light",{"2":{"105":1,"107":1,"188":1,"199":1,"426":1}}],["linux",{"2":{"137":2}}],["links",{"2":{"176":1}}],["linking",{"2":{"135":1,"139":3}}],["linked",{"2":{"77":1}}],["link",{"2":{"50":1,"67":1,"90":1,"135":1,"358":1,"449":1}}],["linear",{"2":{"430":1}}],["line",{"2":{"0":1,"57":1,"82":2,"352":1}}],["likewise",{"2":{"229":1,"467":1}}],["like",{"2":{"23":1,"24":1,"26":1,"27":1,"28":1,"30":1,"32":1,"37":1,"39":1,"50":3,"53":1,"59":1,"75":1,"80":1,"83":1,"94":1,"96":1,"101":1,"150":1,"167":5,"185":2,"187":2,"188":2,"213":1,"214":1,"233":1,"234":2,"235":1,"239":1,"258":1,"317":1,"319":1,"325":2,"326":1,"333":1,"349":1,"364":1,"367":1,"374":1,"430":1,"441":1,"445":1,"452":1,"453":1,"471":1,"472":2}}],["listsessions",{"2":{"437":1,"438":1}}],["listing",{"2":{"379":1}}],["listen",{"0":{"39":1,"445":1},"2":{"33":1}}],["list",{"0":{"23":1,"437":1},"2":{"23":1,"24":1,"26":1,"27":1,"28":1,"34":1,"37":5,"41":1,"113":1,"114":1,"115":2,"121":1,"124":1,"179":1,"204":1,"243":1,"253":1,"302":2,"381":1,"409":1,"437":1}}],["ll",{"2":{"0":1,"23":1,"26":1,"62":1,"74":1,"78":1,"82":1,"91":1,"92":1,"132":1,"141":1,"145":3,"147":3,"149":3,"154":2,"155":1,"165":2,"167":1,"168":1,"172":1,"173":1,"213":1,"298":1,"317":5,"319":3,"325":1,"359":1,"360":1,"452":1}}],["nitro",{"2":{"351":1,"435":1}}],["nil",{"2":{"23":3,"24":2,"28":3,"32":3,"37":2,"39":2,"41":2,"57":1}}],["npx",{"2":{"283":1}}],["npm",{"2":{"27":1,"46":2,"74":1,"99":1,"117":1,"187":1,"235":2,"242":2,"248":1,"252":2,"259":1,"262":2,"269":2,"364":2}}],["n",{"2":{"62":3,"136":1,"137":1,"318":1,"413":1,"429":1,"430":2,"431":2}}],["nuget",{"2":{"131":1}}],["null",{"2":{"50":1,"61":1,"62":1,"282":1,"448":1,"449":1}}],["numbers",{"2":{"143":2}}],["number",{"2":{"43":1,"49":1,"50":1,"56":1,"57":1,"80":3,"85":3,"115":1,"193":1,"195":1,"217":1,"247":1,"257":1,"274":1,"289":1,"297":1,"299":1,"301":1,"313":1,"317":1,"334":1,"352":1,"379":4,"430":1,"455":1}}],["navigating",{"2":{"158":1}}],["navigate",{"2":{"3":1,"77":1,"132":1,"139":1,"329":1,"332":1,"436":2}}],["nametypedescription",{"2":{"393":1,"397":1,"398":1,"401":1}}],["nametyperangedescription",{"2":{"383":1}}],["nametyperangedescriptionthresholduint161",{"2":{"382":1}}],["named",{"2":{"325":1}}],["namely",{"2":{"180":1}}],["name=",{"2":{"139":14}}],["names",{"2":{"75":1,"150":2,"335":1}}],["name",{"2":{"43":1,"50":3,"56":1,"57":1,"61":3,"62":3,"64":1,"80":1,"81":1,"111":1,"123":2,"131":1,"139":1,"150":1,"158":1,"179":1,"188":3,"190":1,"199":1,"213":1,"235":2,"246":1,"256":1,"266":1,"316":1,"325":2,"326":2,"328":1,"330":1,"336":1,"364":2,"414":4,"448":1,"449":1,"452":1}}],["nativereceipt",{"2":{"448":1}}],["native",{"0":{"31":1,"32":1,"236":1,"365":1},"1":{"32":1},"2":{"66":1,"152":1,"184":2,"185":1,"226":1,"227":1,"228":1,"229":1,"350":1,"464":1,"465":1,"466":1,"467":1}}],["nobody",{"2":{"159":1,"351":1}}],["none",{"2":{"224":1,"298":1,"462":1}}],["non",{"2":{"126":1,"141":1,"146":1,"150":1,"160":1,"168":1,"183":1,"185":1,"349":1,"378":1,"410":3,"430":1}}],["nonce=",{"2":{"436":1}}],["nonceat",{"0":{"308":1},"2":{"308":2}}],["nonce",{"2":{"73":4,"195":1,"308":4,"315":1,"317":1,"434":1}}],["noncespace",{"2":{"73":2}}],["nonces",{"2":{"8":1}}],["no",{"0":{"216":1,"454":1},"2":{"61":1,"73":1,"75":1,"115":1,"126":1,"133":1,"138":1,"150":1,"155":1,"164":1,"181":1,"184":1,"187":1,"298":1,"352":1,"379":1,"402":1,"403":1,"430":1}}],["nodeurl",{"2":{"85":4}}],["nodejs",{"0":{"66":1,"67":1,"231":1,"469":1},"1":{"68":1,"69":1,"70":1,"71":1,"72":1},"2":{"72":1,"231":1,"469":1}}],["nodes",{"2":{"7":1,"77":1,"85":2,"297":1}}],["node",{"0":{"6":1,"27":1,"46":1},"1":{"7":1},"2":{"6":1,"23":1,"24":1,"26":1,"27":2,"32":1,"33":1,"37":1,"39":1,"41":1,"43":1,"46":2,"51":1,"53":1,"56":1,"57":2,"75":1,"82":1,"296":1,"379":1,"431":13}}],["now",{"2":{"4":1,"22":1,"31":1,"33":1,"36":1,"38":1,"40":1,"67":1,"73":1,"80":1,"83":1,"179":1,"327":1,"332":1,"336":1}}],["normally",{"2":{"283":1}}],["normalizeasbiginteger",{"2":{"145":1,"151":1,"321":2}}],["normalize",{"2":{"143":2,"144":1,"150":2,"151":1,"315":1}}],["normal",{"2":{"3":1,"426":1}}],["notable",{"2":{"227":1,"228":1,"465":1,"466":1}}],["nothing",{"2":{"167":1,"210":1}}],["noted",{"2":{"82":1,"84":1}}],["notes",{"0":{"30":1}}],["note",{"2":{"27":1,"46":1,"61":1,"64":1,"92":1,"129":1,"130":1,"131":3,"133":1,"135":1,"139":2,"143":1,"144":1,"148":1,"158":1,"172":2,"188":1,"213":1,"224":1,"225":1,"268":1,"295":1,"297":1,"298":1,"299":1,"302":1,"304":1,"306":1,"308":1,"317":1,"360":1,"419":1,"434":1,"452":1,"462":1,"463":1}}],["notice",{"2":{"23":1,"155":1,"317":1,"415":1,"429":1}}],["not",{"2":{"0":1,"3":3,"6":1,"30":1,"62":1,"64":1,"66":4,"67":1,"72":1,"73":1,"74":1,"84":1,"132":1,"133":1,"135":1,"143":2,"144":2,"145":1,"147":1,"149":1,"150":1,"164":1,"167":1,"172":1,"206":1,"214":1,"222":1,"284":1,"295":1,"297":1,"316":1,"321":1,"346":1,"352":2,"401":2,"407":1,"410":1,"432":1,"440":1,"444":1,"449":1,"453":1,"460":1}}],["nfts",{"2":{"33":1,"35":1,"146":1}}],["nftbalances",{"2":{"24":4}}],["nft",{"0":{"20":1,"227":1,"465":1},"2":{"2":1,"4":2,"24":1,"25":1,"33":3,"45":1,"49":1,"227":2,"332":1,"352":1,"379":1,"465":2}}],["never",{"2":{"181":1,"386":2,"431":1,"449":1}}],["nesting",{"2":{"175":1,"430":1}}],["nested",{"0":{"416":1,"430":1},"2":{"175":1,"429":2,"430":3,"431":3}}],["necessary",{"2":{"99":1,"169":1}}],["neon",{"2":{"61":1}}],["nethereum",{"2":{"126":1,"284":1}}],["net",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1,"50":4,"62":1}}],["networkid",{"0":{"307":1},"2":{"307":2}}],["networks",{"0":{"34":1},"2":{"8":1,"26":2,"33":2,"34":1,"39":1,"41":1,"50":1,"52":1,"80":1,"85":1}}],["network",{"0":{"31":1,"32":1,"265":1},"1":{"32":1},"2":{"7":2,"8":1,"39":2,"41":2,"50":4,"52":4,"66":2,"72":2,"77":1,"80":3,"84":1,"92":1,"143":1,"150":2,"151":1,"225":1,"246":1,"247":2,"256":1,"257":2,"263":1,"265":1,"309":1,"315":1,"329":1,"360":1,"378":2,"434":1,"435":1,"436":1,"437":1,"438":1,"448":2,"449":5,"463":1}}],["nextjs",{"0":{"249":1,"258":1,"280":1,"282":1},"1":{"281":1,"282":1,"283":1},"2":{"249":2,"250":2,"258":2,"260":2,"281":3,"282":1,"283":6}}],["next",{"0":{"97":1,"240":1,"281":1,"282":1,"283":1,"368":1},"2":{"3":1,"66":1,"75":1,"78":1,"124":1,"130":1,"132":1,"134":1,"168":1,"281":2,"283":2,"298":1,"326":1}}],["needs",{"2":{"159":1,"181":1,"210":1,"402":1,"410":1}}],["needing",{"2":{"73":1}}],["needed",{"2":{"66":1,"123":1,"131":1,"141":1,"182":1,"186":1,"217":1,"235":1,"375":1,"423":1,"424":1,"455":1}}],["need",{"2":{"1":1,"3":1,"33":1,"66":1,"74":1,"78":1,"91":1,"92":1,"124":1,"130":1,"132":1,"145":1,"147":1,"149":1,"150":1,"154":1,"158":1,"163":1,"165":2,"167":1,"172":1,"177":1,"178":1,"210":1,"237":1,"284":1,"297":1,"316":1,"321":1,"325":1,"351":1,"359":1,"360":1,"374":1,"403":1,"405":1,"433":2,"435":1,"441":1}}],["newimagehash",{"2":{"402":1,"408":1}}],["newindexer",{"2":{"23":1,"24":1,"28":1,"32":1,"37":1,"39":1,"41":1}}],["newestblock",{"2":{"306":2}}],["newer",{"2":{"27":1,"46":1,"130":1}}],["newobject",{"2":{"167":1}}],["newlydeployedcontractaddress",{"2":{"154":1,"320":1}}],["newly",{"2":{"132":1,"158":1,"317":1}}],["newtonsoft",{"2":{"131":2}}],["newmetadata",{"2":{"43":1,"47":1,"56":1,"57":2}}],["new",{"0":{"69":1},"2":{"0":1,"3":1,"7":1,"23":1,"24":1,"27":1,"32":1,"37":1,"39":1,"41":1,"43":1,"46":1,"56":1,"57":3,"66":6,"72":2,"77":3,"80":12,"85":4,"92":2,"100":1,"101":1,"126":1,"136":1,"137":1,"139":2,"141":1,"143":2,"144":2,"145":4,"146":2,"147":4,"148":4,"149":4,"150":7,"151":12,"152":1,"158":1,"160":1,"179":2,"181":1,"185":1,"187":1,"214":4,"219":1,"220":2,"224":1,"226":2,"227":2,"228":2,"229":3,"243":1,"271":1,"283":1,"287":2,"288":1,"296":1,"306":1,"316":1,"317":4,"319":2,"321":2,"328":1,"329":1,"360":2,"378":1,"393":1,"394":1,"401":1,"430":1,"434":1,"435":1,"436":1,"437":1,"438":1,"448":1,"449":1,"453":4,"457":1,"458":2,"462":1,"464":2,"465":2,"466":2,"467":3}}],["myetherwallet",{"2":{"345":1}}],["mypinata",{"2":{"333":1}}],["mypage",{"2":{"100":3,"101":3}}],["myapp",{"2":{"283":1}}],["mytokenaddress",{"2":{"145":2,"147":2,"149":2}}],["mytoken",{"2":{"145":3,"147":3,"149":3}}],["my",{"0":{"281":1},"2":{"123":2,"124":3,"190":1,"235":1,"263":1,"364":1}}],["mycustomlogolight",{"2":{"123":1}}],["mycustomlogodark",{"2":{"123":1}}],["mycustomconnectoroptions",{"2":{"123":1}}],["mycustomconnector",{"2":{"123":2,"124":1}}],["mycomponent",{"2":{"103":1,"118":1}}],["myreactcomponent",{"2":{"102":1}}],["mkdir",{"2":{"75":1}}],["md",{"2":{"61":2,"62":1}}],["mimics",{"2":{"399":1}}],["mitm",{"2":{"353":1}}],["might",{"2":{"336":1,"434":1,"441":1}}],["migrated",{"2":{"66":1}}],["migration",{"0":{"411":1},"2":{"66":4}}],["mistakes",{"2":{"336":1}}],["miss",{"2":{"175":1}}],["missing",{"2":{"82":1}}],["missed",{"2":{"25":1}}],["millions",{"2":{"185":1}}],["mix",{"2":{"181":1,"229":1,"467":1}}],["mixed",{"2":{"61":1}}],["middle",{"2":{"108":2}}],["middleware",{"2":{"80":1}}],["minimum",{"2":{"325":1}}],["minimize",{"2":{"181":1}}],["min",{"2":{"236":2,"365":2}}],["minor",{"2":{"126":2,"160":2}}],["minutes",{"2":{"74":1,"181":1,"443":1}}],["minted",{"2":{"335":2}}],["minter",{"0":{"14":1,"19":1},"2":{"74":1,"77":4}}],["mints",{"2":{"74":1,"332":1}}],["mint",{"0":{"15":1,"18":1,"74":1,"85":1},"1":{"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"74":1,"77":1,"85":4,"144":1,"145":2,"146":1,"148":1,"149":2,"150":3,"321":1,"332":1,"333":1,"334":3,"336":1}}],["minting",{"0":{"334":1},"2":{"11":1,"120":1,"336":1}}],["mined",{"2":{"8":1,"30":1}}],["mind",{"2":{"3":1}}],["much",{"2":{"130":1,"428":1}}],["mutable",{"2":{"130":1}}],["mumbai",{"2":{"92":1,"336":1,"360":1,"434":1,"435":1,"436":1,"437":1,"438":1,"448":1,"449":1}}],["multisignature",{"2":{"374":1}}],["multisig",{"2":{"350":1}}],["multisigs",{"2":{"350":1}}],["multi",{"2":{"33":1,"80":1,"81":1,"148":1,"427":1}}],["multiple",{"2":{"0":1,"6":1,"66":1,"73":1,"148":2,"151":1,"158":1,"183":1,"187":1,"210":1,"226":2,"227":2,"228":2,"229":1,"347":1,"374":2,"430":1,"464":2,"465":2,"466":2,"467":1}}],["must",{"2":{"23":1,"52":1,"77":2,"113":1,"114":1,"132":1,"135":1,"142":1,"155":1,"164":2,"271":1,"281":1,"282":1,"283":1,"353":1,"389":1,"395":1,"415":1,"448":1}}],["move",{"0":{"331":1},"2":{"298":1}}],["mounted",{"2":{"282":2}}],["mouth",{"2":{"61":1}}],["moonpay",{"2":{"188":2,"204":1,"341":1,"373":1}}],["mobile",{"0":{"170":1,"371":1},"2":{"172":2,"187":2,"188":1,"237":1,"371":2}}],["moments",{"2":{"179":1}}],["moment",{"2":{"160":1}}],["mocks",{"2":{"155":1}}],["mocked",{"2":{"80":3,"84":1,"85":1}}],["monobehaviour",{"2":{"133":1,"158":1}}],["mono",{"2":{"127":2}}],["money",{"2":{"6":1}}],["more",{"0":{"159":1},"2":{"23":1,"50":2,"61":1,"64":1,"66":1,"72":1,"73":1,"90":1,"96":1,"123":1,"129":1,"131":1,"133":1,"139":2,"143":1,"159":1,"182":1,"184":1,"188":1,"210":1,"213":1,"239":1,"246":1,"249":1,"256":1,"258":1,"283":1,"341":1,"347":1,"358":1,"367":1,"373":1,"374":2,"379":2,"452":1}}],["most",{"2":{"23":1,"51":1,"131":1,"143":2,"188":1,"289":1,"297":1,"301":1,"343":1}}],["modifier",{"2":{"393":1,"401":1}}],["modification",{"2":{"225":1,"463":1}}],["modify",{"2":{"58":1,"131":1,"321":1,"332":1,"333":1}}],["moduleauth",{"2":{"395":1}}],["module",{"2":{"117":1,"262":1,"351":1,"390":1,"391":1,"395":2,"399":1,"403":1}}],["modules",{"0":{"390":1},"1":{"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1},"2":{"75":1,"82":1,"390":3,"391":1,"395":1,"403":1}}],["modular",{"2":{"33":3,"99":1,"235":1}}],["modern",{"2":{"187":1,"370":1}}],["moderately",{"2":{"374":1}}],["moderate",{"2":{"5":1}}],["modes",{"2":{"172":1}}],["mode",{"2":{"131":1,"133":1,"158":1,"172":2}}],["model",{"0":{"353":1},"2":{"8":1,"353":1}}],["modals",{"2":{"108":1,"184":1}}],["modal",{"0":{"102":1,"103":1,"109":1,"118":1,"119":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"120":1,"121":1},"2":{"3":1,"98":1,"102":2,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"119":1}}],["march",{"2":{"422":1}}],["marked",{"2":{"407":1}}],["marketplaces",{"0":{"180":1},"1":{"181":1,"182":1},"2":{"63":1}}],["marketplace",{"0":{"1":1,"17":1},"2":{"1":4,"120":1,"180":3,"181":8,"182":4,"338":1,"339":1,"340":2,"379":5}}],["mail",{"2":{"414":1}}],["mainmoduleinterface",{"2":{"402":2,"408":2}}],["mainmoduleupgradable",{"2":{"399":1,"402":3,"407":1,"408":1,"409":1,"410":1,"418":1}}],["mainmoduleupgradeable",{"0":{"399":1,"411":1},"1":{"400":1,"401":1},"2":{"432":1}}],["mainmodule",{"2":{"388":1,"389":2,"390":1,"395":2,"399":1,"402":3,"418":1,"432":4}}],["maintaining",{"2":{"187":1,"217":1,"455":1}}],["main",{"2":{"115":3,"139":3,"285":1,"436":3}}],["mainnet",{"2":{"26":2,"27":1,"43":1,"56":1,"57":1,"61":1,"66":2,"72":2,"77":1,"100":2,"101":2,"188":1,"214":1,"247":1,"257":1,"453":1}}],["malicious",{"2":{"374":1,"377":1,"378":1}}],["max",{"2":{"311":1}}],["making",{"2":{"151":1,"155":1,"167":1,"284":1,"378":1}}],["makes",{"2":{"33":2,"77":1,"351":1}}],["make",{"2":{"26":1,"27":1,"28":1,"35":1,"39":1,"41":1,"51":1,"66":2,"75":1,"80":4,"82":1,"123":1,"131":1,"133":1,"139":1,"142":1,"144":1,"157":1,"169":1,"172":3,"174":3,"175":1,"179":1,"210":1,"297":1,"316":1,"336":1}}],["match",{"2":{"181":1,"229":1,"467":1}}],["material",{"2":{"151":1}}],["matic",{"0":{"31":1,"32":1},"1":{"32":1},"2":{"32":2,"66":1,"143":3,"188":1}}],["magicvalue",{"2":{"415":1}}],["magic",{"2":{"151":1,"415":3}}],["macbook",{"2":{"434":1,"436":1,"437":2,"438":1}}],["machine",{"2":{"129":1,"346":1}}],["macos",{"0":{"137":1},"2":{"127":1,"129":1,"176":1,"179":1}}],["mac",{"2":{"127":1,"137":3,"161":1,"167":2,"179":1}}],["made",{"2":{"126":1,"130":1,"154":1,"160":1,"167":3,"284":1}}],["major",{"2":{"126":2,"160":2}}],["mapped",{"2":{"318":1}}],["mappings",{"0":{"318":1}}],["map",{"2":{"63":2}}],["master",{"2":{"61":2,"62":1,"283":1}}],["mandatory",{"2":{"184":1}}],["manifest",{"2":{"139":5}}],["manual",{"0":{"131":1},"2":{"139":1}}],["manually",{"0":{"18":1},"2":{"132":1,"443":1}}],["many",{"2":{"63":1,"144":1,"213":1,"234":1,"237":1,"423":1,"452":1,"472":1}}],["mana",{"2":{"62":1}}],["managing",{"0":{"4":1}}],["manages",{"2":{"167":1}}],["manager",{"0":{"129":1,"158":1},"1":{"130":1},"2":{"129":4,"130":1,"131":5,"158":1}}],["management",{"0":{"374":1,"433":1},"1":{"375":1,"376":1,"377":1,"378":1,"434":1,"435":1,"436":1,"437":1,"438":1},"2":{"11":1,"349":1,"351":1,"433":1}}],["managed",{"2":{"2":1,"4":1,"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1,"446":1}}],["manage",{"0":{"323":1},"1":{"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1},"2":{"2":1,"8":1,"96":1,"173":1,"239":1,"324":1,"367":1}}],["may",{"2":{"8":1,"26":1,"33":1,"39":1,"41":1,"66":1,"130":1,"150":1,"158":2,"188":1,"235":1,"237":2,"269":1,"281":1,"283":1,"284":1,"288":1,"293":1,"294":1,"321":2,"342":1,"364":1,"383":1,"392":1,"401":1,"421":1,"427":1,"445":1}}],["merkle",{"2":{"427":1,"431":1}}],["mechanism",{"2":{"424":1}}],["measures",{"2":{"187":1}}],["meaning",{"2":{"423":1}}],["meant",{"2":{"158":1,"352":1}}],["means",{"2":{"30":1,"84":1,"187":1,"352":1,"353":1,"371":1,"375":1,"393":1,"401":1,"402":1,"433":1}}],["memory",{"2":{"175":1}}],["members",{"2":{"0":1}}],["menu",{"2":{"136":1,"137":1,"210":1}}],["mentioned",{"2":{"52":1,"80":1}}],["message",{"0":{"211":1,"221":1,"223":1,"450":1,"459":1,"461":1},"1":{"212":1,"213":1,"214":1,"451":1,"452":1,"453":1},"2":{"130":1,"153":2,"213":4,"217":1,"221":1,"223":3,"224":1,"295":4,"396":1,"413":5,"414":1,"444":1,"449":2,"452":4,"455":1,"459":1,"461":3,"462":1}}],["messages",{"0":{"153":1},"2":{"66":1,"214":1,"216":1,"217":1,"412":1,"413":1,"453":1,"454":1,"455":1}}],["media",{"2":{"78":1}}],["me",{"2":{"62":1,"253":1}}],["metatxhash",{"2":{"448":1}}],["metatransactionids",{"2":{"37":1}}],["metamask",{"2":{"96":1,"114":1,"123":1,"124":1,"185":1,"187":2,"208":1,"237":1,"239":1,"241":1,"251":1,"261":1,"345":1,"367":1}}],["metal",{"2":{"62":1}}],["meta",{"2":{"8":3,"37":1,"139":2,"234":1,"235":1,"347":1,"352":1,"364":1,"472":1}}],["metadataclient",{"2":{"43":2,"56":2,"57":4}}],["metadatawhen",{"2":{"42":1,"55":1}}],["metadataoptions",{"2":{"23":1,"24":1,"28":3,"30":3,"37":1,"41":1}}],["metadatafield",{"2":{"4":1}}],["metadata",{"0":{"2":1,"4":1,"23":1,"24":1,"30":1,"42":1,"43":1,"44":1,"45":1,"49":1,"54":1,"55":1,"56":1,"57":1,"59":1,"60":1,"77":1,"78":1,"323":1,"325":1,"327":1,"333":1,"336":1},"1":{"3":1,"4":1,"5":1,"43":1,"44":1,"46":1,"47":1,"48":1,"50":1,"51":1,"52":1,"53":1,"54":1,"56":1,"57":1,"58":2,"59":1,"60":1,"61":2,"62":2,"63":2,"64":2,"78":1,"79":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1},"2":{"2":5,"3":1,"4":18,"5":1,"11":2,"23":2,"24":2,"30":3,"33":2,"35":1,"37":2,"41":3,"42":4,"43":8,"44":1,"45":5,"46":5,"47":2,"48":1,"49":9,"50":10,"51":1,"52":8,"53":4,"54":7,"55":6,"56":10,"57":21,"58":6,"59":3,"61":6,"62":4,"63":2,"64":1,"74":1,"78":1,"324":1,"325":1,"326":1,"327":1,"332":1,"333":1,"336":4}}],["methods",{"0":{"54":1,"175":1,"289":1,"297":1},"1":{"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1},"2":{"30":1,"54":1,"64":1,"80":1,"85":1,"133":1,"145":1,"147":1,"149":1,"284":1,"289":1,"297":2,"322":2,"332":1,"403":1,"405":1,"447":1}}],["method",{"2":{"4":1,"23":2,"24":1,"32":1,"37":1,"39":1,"41":1,"43":1,"56":1,"57":2,"61":2,"62":2,"77":1,"80":1,"133":1,"142":1,"144":1,"145":1,"147":1,"149":1,"150":4,"153":1,"154":1,"155":1,"188":1,"214":1,"281":1,"282":1,"283":1,"295":1,"316":1,"317":2,"319":1,"379":1,"393":2,"401":2,"402":1,"408":1,"409":2,"410":1,"415":1,"439":1,"440":1,"442":1,"443":4,"453":1}}],["otp",{"2":{"352":1,"435":4}}],["otherrainbowkitwallets",{"2":{"253":1}}],["otherconnectors",{"2":{"243":1}}],["others",{"2":{"125":1,"172":1}}],["otherwise",{"2":{"77":1,"298":1,"413":1,"414":1,"415":1,"443":2}}],["other",{"0":{"234":1,"472":1},"2":{"8":1,"99":1,"123":1,"124":1,"133":1,"136":1,"137":1,"174":1,"184":2,"207":1,"214":1,"234":1,"237":1,"243":1,"245":1,"253":1,"255":1,"271":1,"272":1,"334":1,"352":2,"390":1,"393":1,"401":1,"430":1,"453":1,"472":1}}],["oauth",{"2":{"352":1,"436":4}}],["omit",{"2":{"295":1}}],["omitted",{"2":{"30":2,"192":1}}],["older",{"0":{"248":1,"259":1},"2":{"248":1,"249":1,"250":2,"258":1,"259":1,"260":1}}],["oldsilver",{"2":{"50":1}}],["os",{"2":{"210":2}}],["oidc",{"2":{"133":1,"135":1}}],["o",{"2":{"66":2}}],["okay",{"2":{"61":1}}],["ogimage",{"2":{"50":1}}],["opcode",{"2":{"389":1}}],["operated",{"2":{"351":1}}],["operate",{"2":{"350":1}}],["operation",{"2":{"392":1,"404":1,"407":1,"426":1,"434":1}}],["operations",{"2":{"247":1,"257":1}}],["operational",{"2":{"92":1,"360":1}}],["openwithoptions",{"2":{"188":2}}],["openwalletintent",{"2":{"188":1}}],["openwallet",{"2":{"188":3}}],["opened",{"2":{"155":1,"434":1,"435":1}}],["openidauthentication",{"2":{"127":1}}],["opening",{"0":{"118":1},"2":{"130":1,"151":1,"192":1}}],["openning",{"2":{"66":2}}],["open",{"2":{"66":2,"72":1,"77":2,"94":1,"103":2,"118":1,"129":1,"133":2,"136":1,"137":1,"155":1,"179":2,"188":2,"197":1,"205":1,"233":1,"237":1,"328":1,"379":1,"435":2,"436":1,"471":1}}],["opensea",{"2":{"30":1,"44":2,"61":3,"64":1}}],["option",{"2":{"30":1,"49":1,"66":2,"84":1,"187":2,"189":1,"202":1,"207":1,"210":1,"283":1,"321":1}}],["optionality",{"2":{"185":1}}],["optionally",{"2":{"37":5,"143":1,"145":1,"147":1,"149":1,"188":1,"236":1,"365":1}}],["optional",{"0":{"246":1,"247":1,"256":1,"257":1,"265":1,"266":1,"275":1},"2":{"23":4,"24":4,"37":4,"41":4,"66":2,"72":1,"101":1,"144":1,"167":1,"195":1,"295":1}}],["options",{"0":{"105":1,"106":1,"181":1,"184":1,"189":1,"246":1,"247":1,"273":1},"1":{"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"274":1,"275":1},"2":{"7":1,"23":1,"24":1,"30":1,"37":1,"41":1,"66":2,"72":1,"80":1,"97":1,"105":2,"113":2,"114":2,"123":2,"180":1,"181":2,"183":1,"185":1,"188":2,"203":1,"240":1,"243":1,"246":1,"256":2,"271":2,"341":2,"368":1,"373":2,"374":1}}],["optimal",{"2":{"8":1}}],["obvious",{"2":{"150":1}}],["objectdark",{"2":{"107":1}}],["objects",{"2":{"63":1,"148":1}}],["object",{"0":{"82":1},"2":{"23":1,"24":1,"37":2,"39":1,"41":1,"62":2,"63":1,"67":1,"82":1,"85":1,"107":2,"109":1,"118":1,"119":1,"129":2,"131":1,"142":1,"145":1,"147":1,"149":1,"150":1,"153":1,"154":1,"158":3,"169":1,"189":1,"213":2,"295":1,"296":1,"316":2,"317":3,"448":2,"449":1,"452":2}}],["obtained",{"2":{"435":1,"436":1}}],["obtain",{"2":{"3":1,"133":1,"142":1,"153":1,"154":1,"435":2,"436":2}}],["obtaining",{"0":{"3":1},"2":{"2":1}}],["outlined",{"2":{"85":1}}],["out",{"2":{"80":1,"85":1,"87":1,"96":1,"97":1,"120":1,"130":2,"141":1,"142":1,"153":1,"154":1,"158":1,"159":1,"181":1,"182":1,"184":1,"186":1,"188":1,"214":1,"237":1,"239":1,"240":1,"338":1,"355":1,"362":1,"367":1,"368":1,"413":1,"414":1,"453":1}}],["outside",{"2":{"11":1,"145":1,"147":1,"149":1,"188":1}}],["ours",{"2":{"172":1}}],["our",{"2":{"2":1,"3":2,"4":1,"6":1,"7":1,"22":1,"23":1,"25":1,"30":1,"31":1,"33":1,"36":1,"38":1,"40":1,"43":1,"50":1,"56":1,"57":2,"64":1,"66":1,"87":2,"88":1,"94":1,"95":1,"96":1,"97":1,"126":1,"127":1,"130":3,"131":1,"133":2,"135":1,"144":2,"145":1,"146":2,"147":1,"148":2,"149":1,"151":1,"152":1,"158":2,"159":1,"180":2,"181":3,"182":2,"183":2,"184":2,"185":3,"186":2,"233":1,"237":3,"238":1,"239":1,"240":1,"283":1,"284":1,"296":1,"297":1,"316":1,"317":2,"319":2,"321":1,"338":1,"339":1,"355":2,"356":1,"362":1,"366":1,"367":1,"368":1,"379":1,"471":1}}],["ownable",{"0":{"322":1},"2":{"322":4}}],["ownership",{"2":{"66":1,"84":1}}],["owner",{"2":{"66":1,"349":1}}],["owned",{"0":{"343":1},"1":{"344":1,"345":1},"2":{"23":1,"115":1,"342":1,"343":1,"377":1}}],["own",{"2":{"6":1,"50":1,"96":1,"123":1,"126":1,"155":1,"157":1,"159":1,"165":1,"169":1,"181":2,"239":1,"284":1,"296":1,"321":1,"336":1,"367":1,"374":1,"430":2}}],["override",{"2":{"107":1,"392":1,"396":1,"400":1,"415":1}}],["overwritten",{"2":{"107":1,"131":1}}],["overview",{"0":{"116":1,"180":1,"183":1,"350":1},"1":{"181":1,"182":1,"184":1,"185":1,"186":1,"351":1,"352":1},"2":{"25":1}}],["over",{"2":{"6":1,"165":1,"175":1,"326":1,"335":1,"377":1,"378":1}}],["orchestration",{"2":{"181":1}}],["origin",{"0":{"192":1},"2":{"80":1,"192":1}}],["originaddress",{"2":{"50":1}}],["orgs",{"2":{"65":1,"74":1}}],["organizations",{"2":{"33":1}}],["or",{"0":{"29":1,"43":1,"48":1,"56":1,"208":1},"2":{"4":4,"7":1,"8":2,"23":1,"24":1,"26":2,"27":3,"30":1,"32":1,"33":1,"35":1,"37":1,"39":1,"41":2,"42":1,"43":4,"46":2,"49":1,"50":2,"51":1,"52":1,"53":1,"54":4,"55":2,"56":4,"57":7,"58":1,"61":1,"63":2,"66":4,"72":1,"74":2,"77":4,"78":1,"80":3,"81":1,"84":1,"97":1,"99":2,"107":1,"117":2,"120":1,"123":1,"124":1,"127":1,"129":3,"131":1,"133":1,"135":1,"139":2,"141":1,"142":1,"143":2,"150":3,"151":1,"153":1,"154":3,"159":1,"161":1,"164":1,"167":1,"169":1,"172":2,"174":1,"181":2,"184":3,"185":1,"187":1,"188":1,"200":1,"207":1,"214":2,"216":1,"217":1,"222":1,"224":1,"229":1,"231":1,"234":2,"235":2,"237":3,"240":1,"242":1,"248":1,"249":1,"252":1,"258":3,"259":1,"262":1,"293":2,"294":2,"299":1,"302":1,"304":1,"306":1,"308":1,"315":1,"316":1,"317":2,"318":1,"319":1,"321":1,"334":1,"342":1,"349":1,"351":1,"352":1,"353":2,"364":2,"368":1,"370":1,"371":1,"374":1,"375":3,"378":3,"379":2,"380":1,"383":1,"391":1,"395":1,"410":1,"425":2,"427":1,"428":1,"430":2,"441":1,"444":2,"446":2,"447":1,"448":1,"449":1,"453":2,"454":1,"455":1,"460":1,"462":1,"467":1,"469":1,"472":2}}],["ordering",{"2":{"424":1}}],["orderid",{"2":{"379":1}}],["orderbook",{"2":{"379":1}}],["orderbookorder",{"2":{"379":1}}],["orderbookcontractaddress",{"2":{"340":1,"379":4}}],["orderstatus",{"2":{"379":2}}],["orders",{"2":{"379":4}}],["ordersummaryitems",{"0":{"121":1},"2":{"119":1,"121":2}}],["order",{"0":{"121":1},"2":{"0":1,"2":1,"3":1,"4":1,"23":1,"66":1,"73":1,"74":1,"75":1,"77":1,"79":1,"80":1,"113":1,"114":1,"121":1,"130":1,"135":1,"150":1,"165":1,"173":1,"177":1,"314":1,"315":1,"317":1,"350":1,"379":8,"389":1,"426":1,"434":1}}],["onvalidationrequired",{"0":{"444":1},"2":{"444":2,"445":2,"446":3}}],["onmeta",{"2":{"341":1,"373":1}}],["onmigration",{"2":{"66":1}}],["onboard",{"0":{"261":1},"1":{"262":1,"263":1,"264":1,"265":1,"266":1,"267":1},"2":{"187":1,"237":1,"261":3,"262":2,"263":3,"267":1}}],["onboarding",{"2":{"95":1,"96":1,"132":1,"163":1,"187":1,"238":1,"239":1,"366":1,"367":1}}],["onfailuretest",{"2":{"175":1}}],["onresponse",{"2":{"175":1}}],["onramp",{"0":{"21":1}}],["ondeploycontractfailedhandler",{"2":{"154":2}}],["ondeploycontractfailed",{"2":{"154":2}}],["ondeploycontractcompletehandler",{"2":{"154":2}}],["ondeploycontractcomplete",{"2":{"154":2}}],["onsessionstatechanged",{"2":{"436":2}}],["onsendtransactionfailedhandler",{"2":{"142":2}}],["onsendtransactionfailed",{"2":{"142":2,"154":1}}],["onsendtransactioncompletehandler",{"2":{"142":2}}],["onsendtransactioncomplete",{"2":{"142":2,"154":1}}],["onsuccess=",{"2":{"436":1}}],["onsuccess",{"2":{"172":1}}],["onsignmessagecompletehandler",{"2":{"153":2}}],["onsignmessagecomplete",{"2":{"153":2}}],["onwaaswalletcreatedhander",{"2":{"142":1,"153":1,"154":1}}],["onwaaswalletcreatedhandler",{"2":{"141":3}}],["onwaaswalletcreated",{"2":{"141":2}}],["onlyself",{"2":{"392":1,"393":1,"400":1,"401":1}}],["only",{"0":{"283":1},"2":{"23":1,"24":1,"37":1,"41":1,"77":2,"91":1,"99":1,"115":1,"127":2,"131":2,"141":1,"151":1,"160":1,"167":1,"201":1,"207":1,"224":1,"225":2,"227":1,"228":1,"235":1,"281":1,"282":1,"293":1,"294":1,"316":1,"321":1,"341":1,"349":1,"352":3,"359":1,"364":1,"373":1,"374":2,"378":1,"391":1,"393":1,"395":1,"401":1,"425":1,"430":1,"437":1,"449":1,"462":1,"463":2,"465":1,"466":1}}],["onclick=",{"2":{"102":1,"103":1,"118":1}}],["onclick",{"2":{"102":2,"103":2,"118":2,"188":1}}],["onchainreader",{"2":{"214":1,"453":1}}],["onchain",{"2":{"11":1,"58":1}}],["once",{"2":{"3":1,"66":1,"75":1,"85":1,"91":1,"102":1,"134":1,"135":1,"141":1,"165":2,"172":1,"174":1,"179":1,"181":1,"188":1,"210":1,"282":1,"288":1,"293":1,"294":1,"331":1,"359":1,"375":1,"408":1,"435":1,"443":1}}],["on",{"0":{"19":1,"20":1,"21":1,"30":1,"32":4,"169":1,"170":1,"326":1,"329":1,"341":1,"373":1,"417":1},"2":{"3":2,"8":1,"23":2,"24":2,"25":1,"26":2,"30":2,"32":2,"33":2,"37":2,"39":4,"41":3,"43":1,"49":1,"50":2,"55":1,"61":3,"62":2,"64":1,"66":1,"73":1,"74":1,"75":1,"83":1,"84":1,"90":1,"95":1,"108":1,"123":2,"124":1,"127":1,"129":5,"130":2,"131":1,"132":1,"133":1,"134":2,"135":1,"143":1,"144":1,"150":5,"155":1,"157":1,"158":1,"160":1,"164":1,"167":2,"173":4,"175":1,"179":7,"181":1,"184":2,"185":1,"187":5,"188":3,"190":1,"207":1,"208":1,"214":4,"217":1,"222":1,"224":1,"226":1,"227":1,"228":1,"231":1,"234":1,"235":2,"237":1,"238":1,"248":1,"249":3,"258":3,"259":1,"281":4,"282":2,"283":1,"284":2,"298":3,"321":1,"322":1,"325":1,"327":1,"328":2,"329":2,"330":1,"331":1,"332":2,"333":1,"341":5,"343":1,"349":1,"351":1,"353":1,"358":1,"364":2,"366":1,"370":1,"371":2,"373":5,"374":2,"379":1,"386":1,"390":1,"394":1,"395":1,"403":1,"405":1,"407":1,"415":1,"430":1,"439":1,"449":2,"453":4,"455":1,"460":1,"462":1,"464":1,"465":1,"466":1,"469":1,"472":1}}],["ones",{"2":{"181":1}}],["one",{"0":{"440":1},"2":{"0":1,"4":1,"23":1,"30":1,"50":1,"52":1,"66":3,"72":1,"75":1,"77":3,"139":1,"143":1,"151":1,"154":1,"172":1,"175":1,"179":1,"199":1,"210":1,"226":1,"227":1,"228":1,"237":1,"282":1,"283":1,"293":1,"294":1,"332":1,"350":1,"374":1,"375":1,"391":1,"396":1,"409":1,"435":1,"440":1,"441":1,"464":1,"465":1,"466":1}}],["official",{"2":{"113":1,"114":1,"122":1,"123":1,"282":1}}],["off",{"2":{"62":1}}],["offered",{"2":{"152":1}}],["offer",{"2":{"51":1,"181":1,"187":1,"237":1,"351":1,"379":1}}],["offers",{"2":{"1":1,"2":1,"8":1,"26":1,"45":1,"49":1,"53":1,"183":1,"349":1}}],["often",{"2":{"59":1,"148":1}}],["of",{"0":{"11":1,"23":1,"24":1,"43":1,"185":1,"229":1,"248":1,"259":1,"282":1,"385":1,"467":1},"2":{"0":3,"4":3,"6":1,"8":7,"23":4,"24":5,"26":3,"27":2,"28":2,"29":1,"30":3,"32":1,"33":3,"34":1,"35":2,"37":7,"39":5,"41":5,"43":3,"48":1,"49":2,"50":4,"52":3,"53":2,"54":6,"56":3,"57":2,"61":4,"62":1,"63":3,"64":1,"66":3,"72":1,"73":2,"74":1,"75":1,"77":2,"80":2,"84":1,"87":1,"92":1,"93":2,"94":2,"95":2,"96":2,"108":1,"110":1,"111":1,"113":1,"114":1,"115":1,"121":1,"123":2,"124":2,"125":1,"130":4,"131":1,"132":1,"142":2,"143":4,"145":3,"146":1,"147":3,"148":1,"149":3,"150":4,"151":4,"152":3,"154":1,"155":2,"156":1,"158":1,"159":1,"165":1,"167":4,"169":1,"172":1,"173":3,"174":2,"175":4,"180":2,"181":1,"182":2,"184":2,"185":3,"187":7,"188":1,"190":1,"192":1,"199":2,"200":1,"204":1,"205":1,"208":1,"210":1,"213":1,"217":1,"226":1,"227":1,"228":1,"232":2,"233":2,"235":2,"237":3,"238":2,"239":2,"242":2,"243":1,"246":1,"248":3,"249":1,"250":3,"253":1,"256":2,"258":1,"259":3,"266":1,"267":2,"268":1,"275":1,"281":1,"282":3,"283":5,"285":1,"286":2,"288":1,"289":2,"293":2,"294":2,"295":1,"296":1,"297":3,"298":2,"305":1,"313":1,"316":1,"317":2,"319":1,"321":5,"326":1,"328":2,"329":1,"332":3,"334":1,"343":2,"346":2,"349":3,"350":4,"352":4,"353":3,"355":1,"360":1,"364":1,"366":2,"367":2,"374":3,"375":2,"376":1,"377":1,"378":2,"379":12,"380":1,"381":1,"382":2,"383":3,"384":1,"385":4,"386":2,"387":1,"388":2,"389":2,"390":3,"392":3,"393":2,"394":1,"395":5,"396":1,"397":1,"399":1,"401":5,"402":2,"406":1,"407":3,"409":1,"410":1,"412":1,"413":1,"414":1,"419":1,"423":4,"425":2,"427":1,"429":2,"430":4,"431":1,"432":8,"433":1,"434":1,"437":1,"438":1,"441":1,"442":1,"448":2,"452":1,"455":1,"464":1,"465":1,"466":1,"470":2,"471":2}}],["i32",{"2":{"379":2}}],["ignored",{"2":{"188":1,"201":1,"202":1,"203":1,"385":1}}],["iwallet",{"2":{"155":1,"286":2,"287":2,"288":2,"289":1}}],["iindexer",{"2":{"152":2}}],["icon",{"2":{"129":1,"131":1,"179":1}}],["icons",{"2":{"50":1}}],["ipfs",{"2":{"61":2,"324":1,"325":1,"326":3,"333":1}}],["ios",{"0":{"136":1,"178":1},"2":{"127":1,"129":1,"136":2,"161":1,"176":1,"178":1,"179":1}}],["io",{"2":{"44":1,"61":1,"214":1,"236":1,"365":1,"453":1}}],["identifier",{"2":{"326":1,"449":1}}],["identity",{"2":{"213":1,"214":1,"352":1,"353":1,"440":1,"441":1,"452":1,"453":1}}],["ideas",{"2":{"159":2}}],["ideal",{"2":{"131":1,"181":2}}],["idea",{"2":{"8":1}}],["idtokenin",{"2":{"167":1,"169":1}}],["idtoken",{"2":{"133":1,"134":1,"135":1,"141":1,"434":2,"435":6,"436":2,"437":1,"438":1,"448":1,"449":1}}],["id",{"2":{"43":1,"50":3,"52":1,"56":1,"57":3,"58":1,"61":1,"62":2,"64":1,"66":1,"72":1,"100":2,"101":2,"113":1,"114":1,"123":2,"124":1,"167":1,"169":2,"177":6,"228":2,"229":1,"246":1,"256":1,"274":1,"295":3,"303":1,"307":1,"325":1,"332":1,"333":2,"334":1,"336":1,"352":1,"379":1,"436":1,"437":2,"438":2,"448":1,"466":2,"467":1}}],["ids",{"0":{"24":1},"2":{"37":1,"50":2,"56":1,"57":1,"148":1,"379":2}}],["idsyou",{"2":{"23":1}}],["iethclient",{"2":{"296":2,"297":1}}],["ie",{"0":{"31":1},"1":{"32":1},"2":{"4":1,"8":1,"43":1,"56":1,"57":1,"196":1}}],["i",{"0":{"185":1,"282":1,"283":1},"2":{"4":1,"62":2,"72":1,"139":1}}],["immediately",{"2":{"73":1}}],["imperative",{"2":{"407":1}}],["improved",{"2":{"374":1}}],["improperly",{"2":{"284":1}}],["implicit",{"2":{"135":1}}],["implementing",{"2":{"322":1}}],["implemented",{"2":{"74":1,"145":1,"147":1,"149":1,"164":1,"167":1,"297":1,"342":1,"346":1,"395":1,"432":1}}],["implements",{"2":{"72":1,"165":1}}],["implementationaddressaddress",{"2":{"393":1}}],["implementations",{"2":{"286":1}}],["implementation",{"0":{"380":1,"391":1,"394":1},"1":{"392":1,"393":1,"394":1},"2":{"26":1,"53":1,"74":1,"85":1,"152":1,"164":1,"169":2,"390":1,"392":4,"393":1,"394":4,"402":1,"432":3}}],["implement",{"0":{"82":1},"2":{"26":1,"53":1,"85":1,"133":1,"344":1,"346":2,"395":1,"433":1}}],["important",{"0":{"285":1},"2":{"132":1,"133":1,"156":1,"289":1,"318":1}}],["importantly",{"2":{"3":1}}],["imported",{"2":{"132":2,"158":1,"243":1,"253":1,"283":1}}],["importing",{"2":{"130":1}}],["import",{"2":{"7":2,"23":2,"24":2,"27":1,"28":1,"32":2,"37":2,"39":2,"41":2,"43":2,"46":1,"47":1,"56":2,"57":4,"66":2,"72":1,"77":2,"80":2,"85":2,"92":1,"100":6,"101":8,"102":2,"103":1,"117":1,"118":1,"124":1,"129":4,"130":2,"131":3,"188":2,"213":1,"214":5,"219":2,"243":1,"253":2,"263":1,"271":1,"272":2,"282":2,"283":2,"360":1,"379":1,"394":1,"413":1,"414":2,"434":1,"435":1,"436":8,"437":1,"438":1,"448":1,"449":1,"452":1,"453":5,"457":2}}],["imagehashbytes32hash",{"2":{"397":1,"401":1}}],["imagehash",{"0":{"386":1,"431":1},"1":{"387":1,"389":1},"2":{"386":2,"387":1,"388":1,"389":1,"396":3,"398":1,"400":2,"401":3,"407":3,"410":4,"430":1,"431":3,"432":4}}],["images",{"0":{"325":1},"2":{"11":1,"50":1,"325":1,"326":1,"335":1}}],["image",{"0":{"387":1},"2":{"4":7,"50":1,"61":1,"62":1,"188":2,"200":3,"325":1,"326":1}}],["iterate",{"2":{"413":2,"414":2,"415":1}}],["item",{"0":{"323":1},"1":{"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1},"2":{"179":2,"325":1,"330":1}}],["items",{"2":{"24":1,"324":1}}],["itself",{"2":{"227":1,"228":1,"378":1,"393":1,"394":1,"401":1,"405":2,"435":1,"465":1,"466":1}}],["its",{"2":{"124":1,"148":1,"188":1,"213":1,"283":1,"430":2,"452":1}}],["it",{"0":{"7":1,"156":1},"2":{"3":3,"25":1,"30":2,"33":4,"49":1,"50":1,"61":2,"62":1,"66":3,"77":2,"80":2,"82":1,"83":1,"84":3,"92":1,"94":1,"124":1,"130":3,"131":3,"132":1,"133":3,"139":3,"141":1,"144":1,"150":5,"151":1,"155":1,"157":2,"158":2,"165":5,"167":1,"168":2,"172":2,"175":1,"179":2,"187":1,"188":1,"213":1,"216":1,"220":1,"233":1,"235":1,"237":1,"241":1,"247":1,"249":1,"251":1,"257":1,"258":1,"261":1,"277":1,"283":1,"285":1,"288":1,"291":1,"292":1,"298":1,"315":1,"316":3,"317":1,"318":1,"319":2,"321":1,"326":2,"331":1,"332":1,"333":3,"334":3,"336":1,"346":1,"351":2,"352":5,"353":3,"360":1,"370":1,"371":1,"379":2,"383":1,"390":3,"391":1,"393":1,"401":2,"404":1,"407":3,"408":1,"409":1,"425":1,"430":3,"432":1,"434":1,"443":2,"444":2,"448":1,"449":2,"452":1,"454":1,"458":1,"471":1}}],["isthis",{"2":{"437":2}}],["issenttransactionresponse",{"2":{"448":3,"449":2}}],["issessionvalid",{"2":{"442":2}}],["issignedin",{"2":{"436":1}}],["issignerleaf",{"2":{"431":1}}],["issubdigestleaf",{"2":{"431":1}}],["issued",{"2":{"449":1}}],["issuer",{"2":{"437":2}}],["issue",{"2":{"281":1}}],["islisting",{"2":{"340":1,"379":1}}],["ismounted",{"2":{"282":2}}],["isbound",{"2":{"167":1}}],["isnestedleaf",{"2":{"431":1}}],["isn",{"2":{"131":1,"158":1}}],["isconnected",{"2":{"102":2}}],["isvalidsignature",{"2":{"415":3}}],["isvalidbooltrue",{"2":{"398":1}}],["isvalidimage",{"0":{"396":1},"1":{"397":1,"398":1},"2":{"396":1}}],["isvalidmessagesignature",{"2":{"222":1,"460":1}}],["isvalidethauthproof",{"2":{"80":1}}],["isvalid",{"2":{"80":2,"222":2,"396":1,"415":2,"442":2,"460":2}}],["is",{"2":{"1":1,"2":1,"3":3,"4":4,"5":1,"8":1,"22":1,"23":1,"24":1,"25":2,"26":3,"29":1,"30":3,"31":1,"33":4,"35":2,"36":1,"37":1,"38":1,"39":1,"40":1,"41":2,"48":1,"49":2,"50":2,"51":1,"52":1,"61":5,"62":2,"63":5,"66":2,"72":2,"73":2,"74":1,"75":1,"77":2,"80":6,"84":2,"91":2,"92":1,"93":4,"94":1,"95":1,"99":1,"100":1,"109":1,"123":1,"130":4,"131":2,"132":2,"133":3,"135":1,"139":1,"141":2,"142":3,"143":4,"144":3,"146":1,"148":1,"150":2,"151":2,"152":3,"153":2,"154":4,"155":3,"156":1,"157":1,"158":1,"160":1,"165":1,"167":9,"168":2,"173":1,"174":2,"175":1,"179":2,"181":3,"184":3,"187":6,"188":2,"193":2,"195":1,"197":1,"201":1,"202":1,"203":1,"206":1,"210":6,"213":3,"214":3,"216":2,"226":1,"227":3,"228":3,"229":1,"231":1,"232":4,"233":1,"234":2,"235":2,"237":1,"238":1,"241":1,"242":1,"243":1,"245":1,"246":1,"248":1,"250":3,"251":1,"252":1,"253":1,"255":1,"256":1,"259":1,"260":3,"261":1,"262":1,"267":1,"268":1,"276":1,"277":1,"278":2,"279":1,"281":4,"282":5,"283":5,"284":2,"286":1,"287":2,"288":2,"293":5,"294":5,"295":1,"296":1,"298":4,"303":1,"307":1,"315":1,"316":3,"318":1,"321":2,"331":1,"332":1,"334":2,"336":1,"342":1,"351":3,"352":2,"353":4,"359":2,"360":1,"364":1,"366":1,"374":2,"375":3,"377":1,"378":3,"379":4,"385":1,"386":4,"390":1,"394":1,"395":2,"396":2,"399":1,"400":1,"401":4,"402":4,"403":2,"404":1,"405":1,"406":2,"407":4,"408":1,"409":1,"410":3,"413":2,"414":2,"415":5,"423":1,"425":2,"426":2,"427":1,"428":2,"429":4,"430":7,"431":6,"432":1,"434":1,"435":3,"436":7,"440":1,"442":1,"443":1,"444":4,"446":1,"448":1,"449":3,"452":3,"453":3,"454":2,"464":1,"465":3,"466":3,"467":1,"469":1,"470":4,"471":1,"472":2}}],["iframe",{"2":{"11":1}}],["if",{"2":{"0":1,"4":1,"5":1,"23":1,"24":1,"26":1,"27":1,"30":1,"37":1,"41":1,"46":1,"50":1,"53":1,"62":1,"63":1,"66":7,"67":1,"72":3,"73":2,"80":9,"82":1,"83":1,"85":1,"97":1,"115":1,"123":2,"129":2,"130":1,"131":4,"132":1,"139":2,"141":2,"142":2,"144":2,"145":1,"147":1,"149":1,"150":3,"153":2,"154":2,"165":2,"167":2,"174":1,"175":2,"179":1,"181":1,"185":1,"187":3,"188":4,"201":1,"202":1,"203":1,"206":1,"207":1,"210":2,"214":3,"217":1,"222":1,"224":2,"225":1,"234":3,"235":1,"237":2,"240":1,"242":1,"248":1,"259":1,"282":1,"293":4,"294":4,"295":2,"296":1,"298":1,"316":1,"317":2,"318":2,"319":2,"320":1,"333":1,"336":1,"346":1,"353":1,"364":1,"368":1,"374":1,"375":2,"377":2,"378":2,"379":3,"393":1,"396":1,"398":1,"401":1,"404":1,"407":1,"409":1,"410":1,"413":1,"414":1,"415":3,"425":1,"429":1,"430":1,"431":3,"432":1,"434":1,"436":1,"441":1,"443":2,"444":2,"448":2,"449":2,"453":3,"455":1,"460":1,"462":2,"463":1,"472":3}}],["inaccessible",{"2":{"430":1}}],["inactive",{"2":{"353":1}}],["inner",{"2":{"430":1}}],["individual",{"2":{"374":1}}],["indicating",{"2":{"283":1}}],["index",{"2":{"80":1,"448":1}}],["indexing",{"2":{"33":1}}],["indexeddb",{"2":{"376":2}}],["indexeable",{"2":{"57":1}}],["indexes",{"2":{"33":2}}],["indexer",{"0":{"25":1,"33":1},"1":{"26":1,"27":1,"28":1,"29":1,"34":1,"35":1},"2":{"22":1,"23":12,"24":12,"25":4,"26":9,"27":6,"28":5,"29":1,"30":3,"31":1,"32":12,"33":8,"36":1,"37":13,"38":1,"39":15,"40":1,"41":14,"42":2,"49":1,"55":2,"57":1,"126":1,"152":3,"160":1}}],["independently",{"2":{"351":1,"352":1,"353":1}}],["independent",{"2":{"8":1,"73":1,"374":2,"419":1,"426":1}}],["inherit",{"2":{"282":1,"322":1}}],["inherits",{"2":{"165":1}}],["incorrect",{"2":{"401":1}}],["increase",{"2":{"187":1}}],["increment",{"2":{"126":3,"160":3}}],["including",{"0":{"41":1},"2":{"35":2,"124":1,"148":1,"246":1,"256":1,"315":1,"379":1}}],["includes",{"2":{"37":1,"66":1,"187":1,"437":1,"448":1}}],["includecontracts",{"2":{"23":1,"24":1,"30":1,"37":1,"41":1}}],["includedpaymentproviders",{"0":{"204":1},"2":{"188":2,"204":1}}],["included",{"2":{"23":2,"24":2,"37":2,"41":2,"297":1,"448":1}}],["includemetadata",{"2":{"23":3,"24":3,"28":2,"32":1,"37":3,"39":2,"41":3,"42":1,"55":1}}],["include",{"2":{"4":1,"30":1,"50":1,"59":1,"67":1,"107":1,"108":1,"143":1,"144":1,"151":1,"317":1,"401":1}}],["input",{"2":{"112":1,"143":1,"172":1,"401":1}}],["inputted",{"2":{"77":1}}],["inline",{"2":{"112":1}}],["involve",{"2":{"447":1}}],["involves",{"2":{"154":1}}],["invoking",{"0":{"103":1}}],["invoke",{"2":{"102":1}}],["invalid",{"2":{"83":1,"224":1,"385":1,"392":1,"425":1,"462":1}}],["investigate",{"2":{"0":1}}],["initiateauth",{"2":{"435":1}}],["initiated",{"2":{"210":1}}],["initiating",{"2":{"275":1}}],["initialization",{"0":{"271":1},"2":{"432":2}}],["initializes",{"2":{"283":1}}],["initialized",{"2":{"123":1,"271":1,"272":1,"283":1}}],["initialize",{"0":{"219":1,"457":1},"2":{"66":1,"75":2,"402":1}}],["initial",{"0":{"388":1,"432":1},"1":{"389":1},"2":{"172":1,"181":1,"388":1,"390":1,"391":1,"426":1,"432":5}}],["initwallet",{"2":{"188":2}}],["init",{"2":{"75":3}}],["infinity",{"2":{"429":2}}],["infura",{"2":{"214":2,"453":2}}],["infer",{"2":{"64":1}}],["informed",{"2":{"378":1}}],["informs",{"2":{"283":1}}],["information",{"2":{"23":1,"26":1,"33":1,"50":1,"61":1,"64":1,"90":1,"164":3,"182":1,"283":1,"358":1,"377":1}}],["info",{"2":{"43":1,"61":1,"65":1,"67":1,"74":1,"75":1,"139":2,"188":1,"378":1,"395":1}}],["infrastructure",{"2":{"6":2,"33":1,"93":1,"184":1,"232":1,"470":1}}],["insecurely",{"2":{"164":1}}],["inspector",{"2":{"158":2}}],["instead",{"2":{"61":1,"124":1,"139":1,"213":1,"248":1,"259":1,"296":1,"317":1,"374":1,"386":2,"402":1,"431":1,"433":1,"452":1}}],["instructions",{"0":{"58":1},"2":{"25":1,"177":1}}],["instantiating",{"2":{"188":1}}],["instantiate",{"2":{"85":1}}],["instances",{"2":{"445":1}}],["instance",{"2":{"23":1,"92":1,"152":1,"188":2,"360":1,"435":2}}],["installing",{"0":{"99":1},"2":{"98":1,"131":1}}],["installed",{"2":{"75":1,"129":1,"187":1,"236":1,"242":2,"252":1,"269":1,"365":1}}],["installation",{"0":{"25":1,"26":1,"27":1,"28":1,"29":1,"46":1,"47":1,"48":1,"90":1,"128":1,"162":1,"242":1,"252":1,"262":1,"269":1,"358":1},"1":{"26":1,"27":2,"28":2,"29":2,"129":1,"130":1,"131":1,"163":1,"164":1},"2":{"46":1}}],["install",{"0":{"235":1,"364":1},"1":{"236":1,"365":1},"2":{"7":2,"27":2,"46":2,"75":1,"80":2,"85":2,"90":2,"99":5,"101":1,"117":3,"130":1,"187":1,"188":2,"209":1,"235":2,"242":1,"248":2,"252":1,"259":2,"262":1,"269":1,"358":2,"364":2,"372":1}}],["inside",{"2":{"8":1,"29":1,"48":1}}],["int256",{"2":{"318":1}}],["int",{"2":{"144":1,"306":1,"318":1}}],["introduction",{"0":{"126":1,"160":1,"284":1,"324":1},"1":{"127":1,"161":1,"285":1}}],["introduced",{"2":{"30":1}}],["introducing",{"2":{"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1}}],["into",{"0":{"238":1,"366":1},"1":{"239":1,"367":1},"2":{"6":1,"25":1,"75":1,"76":1,"80":1,"95":1,"97":2,"130":1,"131":1,"139":1,"150":1,"151":1,"154":1,"165":2,"172":1,"173":1,"183":1,"184":1,"200":1,"235":1,"238":1,"240":2,"249":1,"258":1,"283":1,"293":1,"294":1,"298":1,"318":1,"327":1,"364":1,"366":1,"368":2,"431":2}}],["intend",{"2":{"378":1}}],["intent",{"2":{"139":19,"188":3,"352":1}}],["integers",{"2":{"318":1}}],["integer",{"2":{"206":1,"307":1,"318":2}}],["integrity",{"2":{"192":1,"213":1,"452":1}}],["integration",{"0":{"117":1,"167":1,"171":1,"281":1},"1":{"118":1,"119":1,"120":1,"121":1,"172":1,"173":1,"174":1,"175":1},"2":{"96":1,"125":1,"126":1,"160":1,"182":1,"184":1,"186":1,"189":1,"239":1,"267":1,"367":1}}],["integrations",{"2":{"23":1,"43":1,"51":1,"56":1,"57":2,"185":1,"379":1}}],["integrating",{"2":{"8":1,"95":1,"188":1,"238":1,"341":1,"366":1,"373":1}}],["integrates",{"2":{"185":1}}],["integrated",{"2":{"29":1,"48":1,"49":1,"126":1,"204":1,"205":1}}],["integrate",{"0":{"12":1,"17":1,"20":1,"21":1,"238":1,"366":1},"1":{"239":1,"367":1},"2":{"0":1,"25":1,"26":1,"53":1,"96":1,"97":1,"117":1,"122":1,"183":1,"234":1,"239":1,"240":1,"349":1,"367":1,"368":1,"371":1,"472":1}}],["internally",{"2":{"396":1,"431":1}}],["internal",{"2":{"351":1,"396":1,"430":3}}],["interchangeably",{"2":{"288":1}}],["intercepted",{"2":{"172":1}}],["interpret",{"2":{"217":1,"455":1}}],["interoperability",{"2":{"187":1}}],["intermediate",{"2":{"179":1}}],["interfacing",{"2":{"99":1}}],["interfaces",{"2":{"380":1}}],["interface",{"2":{"8":1,"51":2,"53":1,"66":1,"72":1,"80":1,"85":2,"152":1,"210":1,"226":2,"227":2,"228":2,"229":3,"286":2,"288":1,"289":1,"296":1,"297":1,"322":1,"395":3,"464":2,"465":2,"466":2,"467":3}}],["interacting",{"2":{"120":1,"143":1,"150":1,"318":1,"321":1,"430":1}}],["interactions",{"0":{"145":1,"147":1,"149":1},"2":{"145":1,"147":1,"149":1,"217":1,"455":1}}],["interaction",{"2":{"74":1,"223":1,"461":1}}],["interact",{"2":{"1":1,"84":1,"92":1,"322":1,"351":1,"360":1,"433":1}}],["in",{"0":{"9":1,"15":1,"16":1,"23":1,"40":1,"41":1,"82":1,"109":1,"122":1,"134":1,"135":1,"323":1,"434":1,"435":1},"1":{"41":1,"110":1,"111":1,"112":1,"113":1,"114":1,"123":1,"136":1,"137":1,"138":1,"139":1,"140":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"435":1,"436":1},"2":{"0":3,"2":1,"3":5,"4":6,"8":3,"23":5,"24":3,"25":1,"26":1,"28":1,"30":2,"32":3,"33":4,"35":3,"37":4,"39":3,"41":5,"43":2,"46":1,"47":1,"49":1,"50":3,"52":1,"56":2,"57":6,"59":3,"61":3,"63":5,"64":2,"66":2,"67":1,"73":5,"74":2,"75":7,"76":1,"77":6,"79":1,"80":6,"81":2,"85":1,"93":3,"95":1,"98":2,"102":2,"107":1,"109":1,"110":2,"111":2,"112":2,"113":4,"114":3,"115":4,"117":1,"121":1,"123":1,"124":1,"126":1,"127":3,"129":4,"130":2,"131":6,"132":5,"133":1,"134":2,"135":5,"136":2,"137":2,"139":7,"141":3,"142":1,"143":2,"144":1,"146":1,"148":4,"150":6,"151":2,"153":1,"154":4,"155":3,"158":7,"160":4,"163":2,"164":3,"165":6,"167":6,"168":1,"172":2,"173":2,"175":1,"177":2,"179":5,"180":1,"181":5,"183":1,"184":1,"185":3,"186":1,"188":2,"193":2,"198":2,"201":2,"202":2,"203":2,"204":1,"205":1,"210":1,"213":3,"214":3,"216":1,"217":2,"220":1,"224":1,"226":1,"227":2,"228":2,"229":1,"231":1,"232":3,"234":2,"237":1,"238":1,"246":1,"256":1,"266":1,"278":1,"281":2,"282":4,"283":7,"284":7,"286":2,"293":1,"294":1,"295":1,"296":2,"297":2,"298":2,"299":1,"301":1,"302":2,"303":1,"304":2,"306":1,"307":1,"308":1,"313":1,"314":1,"315":1,"316":1,"317":3,"318":1,"324":1,"325":1,"326":1,"329":1,"334":1,"336":1,"338":1,"341":1,"344":1,"350":1,"351":1,"352":1,"353":4,"366":1,"373":1,"375":1,"376":2,"377":1,"378":1,"379":5,"380":1,"389":1,"392":1,"395":1,"396":1,"401":1,"403":1,"404":1,"410":2,"414":1,"419":1,"423":1,"426":1,"430":1,"434":3,"435":2,"436":1,"440":1,"441":2,"448":1,"452":3,"453":3,"454":1,"455":2,"458":1,"462":1,"464":1,"465":2,"466":2,"467":1,"469":1,"470":3,"472":2}}],["ffailurecallback",{"2":{"175":1}}],["fsequenceerror",{"2":{"175":2}}],["fstoredcredentials",{"2":{"174":1}}],["fstring",{"2":{"167":4,"168":1,"169":1,"174":1,"175":2}}],["fscriptdelegate",{"2":{"167":1}}],["fcredentials",{"2":{"165":1,"167":2,"174":2}}],["fly",{"2":{"325":1}}],["flexible",{"2":{"187":1,"347":1}}],["flexibility",{"2":{"131":1}}],["flagged",{"2":{"404":1}}],["flag",{"2":{"174":1,"196":1}}],["floating",{"2":{"143":1}}],["flows",{"2":{"439":1}}],["flow",{"2":{"135":1,"210":1}}],["fmt",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1}}],["feb",{"2":{"420":1}}],["feehistoryresult",{"2":{"306":2}}],["feehistory",{"0":{"306":1},"2":{"306":2}}],["fee",{"2":{"66":1,"67":1,"311":1}}],["feeoption",{"2":{"66":1,"72":1}}],["fees",{"2":{"66":3,"72":1,"306":1,"347":1}}],["feel",{"2":{"50":1,"125":1,"131":1,"133":1,"155":1,"184":1,"237":1}}],["few",{"2":{"35":1,"96":1,"130":1,"156":1,"158":1,"173":1,"179":1,"239":1,"367":1}}],["fetching",{"2":{"23":1,"55":1,"155":1}}],["fetches",{"0":{"23":1},"2":{"37":1,"41":1}}],["fetch",{"0":{"11":1,"24":1,"32":1,"37":1,"39":1,"41":1,"43":1,"56":1},"2":{"7":2,"23":1,"35":4,"42":1,"52":2,"54":4,"55":1,"56":1,"57":1,"58":2,"80":1,"379":3}}],["feature",{"2":{"6":1,"117":1,"281":1,"283":2,"327":1}}],["features",{"0":{"96":1,"239":1,"367":1},"2":{"1":1,"8":1,"33":1,"126":1,"130":1,"160":1,"234":2,"472":2}}],["fashion",{"2":{"414":1}}],["fast",{"2":{"1":1,"2":1,"8":1,"33":1,"45":1,"49":1}}],["fauthenticatorconfig",{"2":{"177":1}}],["familiar",{"2":{"97":1,"150":1,"187":1,"240":1,"349":1,"368":1}}],["facet",{"2":{"350":1}}],["facebook",{"2":{"96":1,"113":1,"124":1,"135":1,"201":1,"239":1,"367":1,"434":1,"441":1}}],["facilitate",{"2":{"116":1}}],["factual",{"2":{"389":1,"395":1,"410":1}}],["factory",{"2":{"388":1,"389":2,"390":1,"391":1,"395":1,"402":2,"418":1,"432":1}}],["fact",{"2":{"33":1,"61":1,"93":1,"232":1,"374":1,"470":1}}],["fall",{"2":{"62":1}}],["false",{"0":{"403":1},"2":{"23":1,"24":1,"37":1,"41":1,"188":2,"207":1,"379":1,"402":2,"408":1,"436":1,"437":1,"442":1,"443":2,"444":1,"446":1,"449":1}}],["fate",{"2":{"62":1}}],["fatal",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1}}],["failing",{"2":{"449":1}}],["fails",{"2":{"179":1,"293":1,"294":1,"404":1,"449":2}}],["failedtransactionresponse",{"2":{"449":1}}],["failedtransactionreturn",{"2":{"142":1}}],["failed",{"0":{"449":1},"2":{"447":2,"448":1}}],["failedcontractdeploymentreturn",{"2":{"154":1}}],["failure",{"2":{"132":1,"164":1,"316":1}}],["failures",{"2":{"33":1}}],["fail",{"2":{"6":1,"151":1,"179":1,"284":1,"293":1,"294":1}}],["friendlyname",{"2":{"437":2}}],["freshly",{"2":{"332":1}}],["frequent",{"2":{"217":1,"455":1}}],["free",{"2":{"5":1,"8":1,"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1,"50":2,"125":1,"133":1,"155":1,"237":1}}],["framework",{"2":{"160":1,"184":1}}],["from",{"0":{"152":1,"215":1},"2":{"0":1,"1":1,"3":1,"4":1,"6":1,"7":2,"11":1,"23":4,"24":1,"26":1,"27":3,"30":2,"32":1,"33":6,"35":1,"37":1,"39":1,"41":1,"43":2,"46":3,"54":2,"56":2,"57":4,"59":1,"61":1,"66":3,"72":2,"73":2,"74":1,"75":1,"77":5,"80":5,"81":1,"83":1,"84":2,"85":5,"92":1,"100":6,"101":8,"102":3,"103":1,"115":1,"117":1,"118":1,"124":1,"125":1,"129":3,"134":1,"139":1,"141":1,"142":2,"144":1,"148":1,"150":2,"152":1,"153":2,"154":3,"163":1,"165":1,"167":1,"168":4,"174":2,"179":1,"187":1,"188":2,"207":1,"210":4,"213":3,"214":5,"217":2,"219":2,"225":1,"227":2,"228":2,"229":2,"234":2,"243":1,"253":2,"263":1,"271":1,"272":3,"282":2,"283":1,"295":1,"296":1,"302":1,"317":1,"319":1,"322":1,"324":1,"325":1,"326":1,"333":1,"350":1,"351":1,"352":2,"353":1,"360":1,"370":1,"371":1,"374":1,"376":1,"377":1,"379":1,"390":1,"393":1,"394":1,"401":1,"413":1,"414":2,"434":1,"435":2,"436":10,"437":1,"438":2,"446":1,"448":1,"449":1,"452":3,"453":5,"455":2,"457":2,"463":1,"465":2,"466":2,"467":2,"472":2}}],["frontend",{"2":{"8":1,"353":2}}],["front",{"2":{"0":1}}],["fiat",{"0":{"341":1,"373":1}}],["fixedbyte",{"2":{"318":1}}],["fixed",{"2":{"318":1,"395":1}}],["fixing",{"2":{"281":1}}],["fit",{"2":{"131":2,"181":1,"285":1}}],["fields",{"2":{"63":2,"123":1,"448":1}}],["field",{"2":{"61":1,"63":2,"120":1,"121":1,"124":1,"136":1,"137":1,"177":1}}],["fill",{"2":{"132":1,"334":1}}],["filter",{"2":{"37":6,"39":5,"41":1,"139":9,"379":1}}],["files",{"0":{"327":1},"2":{"130":2,"325":1,"326":3,"327":1,"328":1,"332":1}}],["file",{"2":{"4":1,"82":1,"131":1,"139":2,"163":1,"177":1,"179":2,"325":1,"326":1,"334":1,"436":1}}],["firm",{"2":{"148":1}}],["fires",{"2":{"174":1}}],["fired",{"2":{"167":1}}],["fire",{"2":{"8":1,"168":2,"169":1}}],["first",{"0":{"402":1},"1":{"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1},"2":{"3":1,"50":1,"75":1,"77":2,"84":1,"124":1,"127":1,"139":1,"145":1,"147":1,"149":1,"154":1,"179":1,"188":1,"325":2,"375":1,"402":1,"407":2}}],["finishvalidatesession",{"2":{"443":2}}],["finishes",{"2":{"407":2}}],["finished",{"2":{"179":1,"210":1}}],["finalizeauth",{"2":{"435":1}}],["finalize",{"0":{"335":1}}],["finally",{"2":{"4":1,"63":1,"64":1,"76":1,"79":1,"84":1,"85":1,"168":1,"334":1}}],["fingerprints",{"2":{"177":1}}],["fine",{"2":{"63":1}}],["findobjectoftype",{"2":{"133":1}}],["finding",{"2":{"130":1}}],["findsupportednetwork",{"2":{"80":2,"85":4}}],["find",{"2":{"4":1,"26":1,"66":5,"72":1,"77":1,"165":1,"213":1,"409":1,"410":1,"452":1}}],["fom",{"2":{"379":1}}],["focused",{"2":{"184":1,"185":1}}],["focus",{"2":{"181":1,"184":1,"332":1}}],["fonts",{"2":{"181":1}}],["folder",{"0":{"328":1},"2":{"75":2,"76":1,"129":2,"130":2,"132":4,"165":7,"179":2,"281":3,"283":2,"327":4,"328":2,"333":1,"334":1}}],["follows",{"2":{"85":1,"126":1,"160":1,"210":1,"413":1,"428":1,"429":1,"430":1,"431":2}}],["following",{"2":{"4":1,"7":1,"66":1,"67":1,"72":1,"74":2,"77":2,"78":1,"82":1,"85":1,"139":1,"141":1,"158":1,"163":1,"172":1,"173":1,"176":1,"177":1,"178":1,"179":2,"214":1,"242":1,"248":1,"259":1,"324":1,"353":1,"407":1,"424":1,"430":1,"432":1,"433":1,"453":1}}],["follow",{"2":{"2":1,"26":1,"53":1,"67":1,"75":1,"77":1,"79":1,"83":1,"100":1,"117":1,"200":1,"380":1}}],["found",{"2":{"66":9,"130":1,"132":1,"155":2,"163":1,"165":1,"224":1,"282":1,"283":2,"297":1,"462":1}}],["force",{"2":{"196":1}}],["forward",{"2":{"165":2,"169":1}}],["forwarder",{"2":{"165":1}}],["formerly",{"2":{"419":1}}],["forms",{"2":{"342":1}}],["form",{"2":{"143":1,"155":1,"343":1}}],["formats",{"2":{"55":1,"59":1}}],["format",{"2":{"52":1,"59":1,"61":1,"63":2,"134":1,"143":1,"144":2,"150":4,"295":2,"298":2,"299":1,"301":1,"302":1,"303":1,"304":2,"306":1,"307":1,"308":1,"336":1}}],["forum",{"2":{"139":1}}],["foreach",{"2":{"100":1,"101":1}}],["forget",{"2":{"8":1,"158":1}}],["for",{"0":{"37":1,"39":1,"56":1,"77":1,"212":1,"234":1,"445":1,"451":1,"472":1},"1":{"78":1,"79":1},"2":{"0":1,"2":1,"3":1,"4":4,"5":1,"6":2,"8":4,"23":4,"24":2,"26":3,"27":3,"28":3,"30":1,"32":1,"33":2,"35":2,"37":4,"39":2,"41":3,"42":3,"43":2,"45":1,"49":4,"50":3,"51":3,"53":1,"55":5,"56":1,"57":3,"59":1,"61":5,"62":2,"63":1,"65":1,"66":7,"67":2,"72":3,"73":4,"74":1,"75":1,"77":1,"78":1,"80":1,"81":2,"85":1,"90":2,"93":1,"94":2,"95":1,"99":2,"100":3,"104":1,"107":2,"113":1,"114":1,"120":1,"123":3,"126":2,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"139":2,"141":1,"142":3,"143":2,"145":3,"147":3,"148":1,"149":3,"150":1,"151":2,"153":2,"154":2,"155":2,"160":1,"165":2,"167":2,"172":2,"176":1,"177":2,"178":1,"180":1,"181":4,"182":3,"184":5,"185":3,"186":1,"187":4,"188":1,"191":1,"192":1,"193":1,"195":1,"206":1,"208":1,"210":2,"213":1,"214":3,"217":3,"231":1,"232":1,"233":2,"234":2,"235":2,"237":4,"238":1,"247":2,"249":2,"250":4,"256":1,"257":2,"258":2,"260":5,"268":1,"276":1,"279":1,"281":4,"283":1,"284":2,"287":1,"289":1,"290":1,"292":1,"294":1,"296":1,"297":1,"298":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"311":1,"314":1,"315":2,"316":2,"317":1,"318":2,"321":2,"322":3,"324":2,"325":1,"326":2,"327":1,"332":2,"333":2,"334":1,"336":1,"346":1,"349":1,"352":1,"358":2,"366":1,"374":1,"375":3,"378":2,"379":5,"382":1,"387":1,"389":1,"395":1,"401":3,"407":2,"409":1,"410":1,"413":1,"414":1,"415":1,"424":3,"429":2,"431":1,"434":1,"435":1,"437":1,"440":1,"442":2,"445":2,"446":1,"448":1,"452":1,"453":3,"455":3,"469":1,"470":1,"471":2,"472":2}}],["future",{"2":{"66":1}}],["fungible",{"2":{"144":1,"146":1,"148":1}}],["funding",{"2":{"206":1,"207":1}}],["funds",{"2":{"188":1,"392":1,"406":1}}],["fund",{"2":{"67":1}}],["funded",{"2":{"66":1}}],["func",{"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1}}],["functionnameasstring",{"2":{"150":2,"151":1}}],["functions",{"0":{"317":1},"2":{"142":1,"145":1,"147":1,"149":1,"154":1,"172":1,"222":1,"235":1,"249":1,"258":1,"460":1}}],["function",{"2":{"7":3,"66":1,"72":1,"80":1,"85":1,"100":1,"101":1,"123":1,"124":1,"141":1,"143":1,"150":5,"153":1,"164":2,"165":2,"213":1,"226":2,"227":2,"228":2,"229":3,"234":1,"283":1,"316":3,"317":1,"392":1,"396":2,"400":1,"402":1,"415":1,"431":4,"432":1,"436":5,"437":1,"452":1,"464":2,"465":2,"466":2,"467":3,"472":1}}],["functionality",{"2":{"152":1,"173":1,"210":1,"226":1,"227":1,"228":1,"237":1,"342":1,"346":1,"403":1,"464":1,"465":1,"466":1}}],["functional",{"2":{"1":1,"349":1,"436":1}}],["fur",{"2":{"61":1}}],["further",{"2":{"0":1,"188":1}}],["full",{"2":{"26":1,"34":1,"50":1,"53":1,"62":1,"73":1,"85":1,"113":1,"114":1,"126":1,"160":1,"196":1,"208":1,"282":1,"283":1,"448":1,"449":1}}],["fully",{"2":{"1":1,"152":1,"278":1,"316":1,"349":1,"430":1}}],["wyre",{"2":{"373":1}}],["w3c",{"2":{"187":1}}],["won",{"2":{"351":1}}],["wooden",{"2":{"333":1}}],["wouldn",{"2":{"353":1}}],["would",{"2":{"80":1,"85":1,"150":1,"154":1,"188":1,"245":1,"255":1,"317":1,"319":1,"377":1,"378":1}}],["world",{"2":{"75":1,"76":1,"95":1,"238":1,"366":1,"413":1}}],["worried",{"2":{"65":1,"74":1}}],["workflow",{"2":{"213":1,"452":1}}],["working",{"2":{"77":1,"141":1,"142":1,"153":1,"154":1,"282":1,"284":1,"285":1,"295":1}}],["works",{"0":{"156":1},"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"41":1,"43":1,"56":1,"57":2,"133":2,"150":1,"187":1,"188":3,"200":1,"231":1,"370":1,"371":1,"379":1,"430":1,"469":1}}],["workers",{"0":{"19":1},"2":{"76":1,"83":1,"84":1}}],["worker",{"2":{"11":1,"74":1,"75":1,"80":1,"83":1,"84":1}}],["work",{"2":{"4":1,"30":1,"50":1,"125":1,"127":1,"131":1,"132":1,"135":1,"155":1,"187":4,"237":2,"298":1,"334":1,"435":1}}],["wrapping",{"2":{"174":1,"284":2}}],["wrappers",{"2":{"123":1,"131":1,"321":3}}],["wrapper",{"0":{"100":1,"101":1},"2":{"100":2,"101":1,"105":1,"145":1,"147":1,"149":1,"152":1,"154":1,"283":6,"321":1,"322":1}}],["wrap",{"2":{"100":1,"283":2}}],["wrangler=",{"2":{"75":1}}],["wrangler",{"0":{"75":1,"82":1},"1":{"76":1},"2":{"74":2,"75":8,"76":1,"81":1,"82":1,"83":1}}],["writing",{"2":{"175":1}}],["written",{"2":{"93":1,"185":1,"214":1,"231":1,"232":1,"234":1,"453":1,"469":1,"470":1,"472":1}}],["write",{"0":{"142":1},"1":{"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1},"2":{"3":2,"77":2,"131":1,"142":1,"332":1,"333":1,"335":1}}],["wrong",{"2":{"80":2,"207":2}}],["w",{"2":{"66":2}}],["wuelppex0pttvjabl8biuxpaaaaaaaaaa",{"2":{"57":2}}],["www",{"2":{"50":1,"62":1}}],["why",{"0":{"281":1,"342":1},"1":{"343":1,"344":1,"345":1,"346":1,"347":1,"348":1}}],["whose",{"2":{"379":1}}],["who",{"2":{"187":1,"353":1,"423":1,"441":1}}],["whole",{"2":{"143":1,"151":1,"293":1,"294":1,"404":1,"430":1,"431":1}}],["whistles",{"2":{"284":1}}],["white",{"2":{"180":1,"181":3,"182":1}}],["whitespace",{"2":{"150":1}}],["while",{"2":{"126":1,"154":1,"159":1,"160":1,"181":3,"187":1,"198":1,"210":1,"213":1,"217":1,"281":1,"284":1,"293":1,"294":1,"316":1,"349":1,"351":1,"371":1,"378":1,"402":1,"432":1,"452":1,"455":1}}],["which",{"2":{"4":1,"8":2,"23":1,"24":1,"30":3,"37":1,"41":1,"61":2,"62":2,"66":1,"73":1,"76":1,"77":1,"78":1,"94":1,"113":1,"114":1,"115":1,"142":1,"152":1,"153":1,"154":2,"158":2,"165":1,"169":1,"172":1,"183":1,"185":1,"187":1,"190":1,"208":1,"210":1,"213":2,"226":1,"227":1,"228":1,"231":1,"233":1,"235":1,"248":1,"249":2,"258":2,"259":1,"260":2,"266":1,"282":1,"283":4,"289":1,"293":1,"294":1,"315":1,"317":1,"322":1,"341":2,"342":1,"350":1,"371":1,"373":2,"393":1,"396":1,"401":1,"409":1,"429":1,"432":1,"452":2,"464":1,"465":1,"466":1,"469":1,"471":1}}],["whatever",{"2":{"169":1}}],["what",{"0":{"181":1,"184":1,"185":1},"2":{"35":2,"77":1,"283":1,"332":1,"346":1,"352":1,"403":1}}],["whether",{"2":{"112":1,"198":1,"207":1,"249":1,"258":1,"415":1,"441":1,"444":1}}],["where",{"2":{"52":1,"61":1,"77":1,"141":1,"143":1,"150":1,"154":1,"167":1,"172":1,"174":2,"175":2,"184":1,"200":1,"216":1,"234":1,"284":1,"318":1,"332":1,"427":1,"454":1,"472":1}}],["whereby",{"2":{"8":1}}],["whenever",{"2":{"322":1,"433":1}}],["when",{"0":{"281":1},"2":{"30":1,"57":1,"61":1,"62":1,"84":1,"124":1,"127":1,"130":2,"131":1,"132":1,"133":1,"142":1,"143":1,"145":1,"147":1,"149":1,"150":2,"151":1,"153":1,"154":1,"168":1,"174":1,"179":1,"188":2,"189":1,"200":1,"205":1,"213":1,"249":1,"258":1,"275":1,"282":1,"283":2,"284":4,"285":1,"298":1,"316":2,"317":1,"318":1,"321":1,"352":1,"375":1,"379":1,"402":1,"407":2,"415":1,"436":2,"441":1,"444":2,"446":1,"452":1}}],["warning",{"2":{"392":1,"407":1}}],["wagmiclient",{"2":{"283":2}}],["wagmiconfig",{"2":{"100":3,"101":4,"117":2,"124":3,"243":1,"283":2}}],["wagmiwrapper",{"2":{"283":6}}],["wagmiprovider",{"2":{"100":1,"101":1,"283":1}}],["wagmi",{"0":{"241":1,"248":1,"259":1},"1":{"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1},"2":{"95":1,"99":4,"100":5,"101":2,"102":2,"113":1,"114":1,"123":3,"124":1,"237":1,"238":1,"241":3,"242":5,"243":2,"248":4,"249":3,"250":5,"258":5,"259":4,"260":4,"281":2,"282":5,"283":4,"366":1}}],["waitfortransactionreceipt",{"0":{"314":1},"2":{"314":1}}],["waits",{"2":{"292":1,"294":1}}],["wait",{"2":{"73":1,"179":1,"282":2,"314":1,"317":1}}],["wants",{"2":{"377":1}}],["want",{"2":{"67":1,"73":1,"85":1,"130":1,"131":1,"141":1,"145":1,"147":1,"149":1,"150":3,"167":1,"179":1,"181":1,"185":1,"187":1,"198":1,"213":1,"225":1,"237":1,"298":2,"317":3,"320":1,"332":1,"336":1,"452":1,"463":1}}],["was",{"2":{"66":2,"72":1,"130":2,"378":1,"379":2,"415":1,"419":1,"448":2}}],["waasadapter",{"2":{"288":1}}],["waastowalletadapter",{"2":{"288":3,"293":2,"294":2}}],["waastenantkey",{"2":{"163":1}}],["waaswallet",{"2":{"141":4,"142":5,"143":1,"153":4,"154":9,"155":1,"288":3}}],["waaslogin",{"2":{"141":1}}],["waasconfigkey",{"2":{"92":1,"360":1,"434":1,"435":1,"436":1,"437":1,"438":1,"448":1,"449":1}}],["waas",{"0":{"12":1,"141":1},"2":{"90":1,"92":4,"130":1,"132":2,"133":1,"134":1,"141":2,"142":1,"143":1,"144":1,"145":3,"146":1,"147":3,"148":1,"149":3,"150":2,"151":1,"163":1,"358":1,"360":4,"433":1,"434":6,"435":6,"436":5,"437":5,"438":6,"442":1,"443":2,"444":1,"445":2,"446":1,"448":5,"449":5}}],["walletinterface",{"2":{"402":2}}],["walletcontext",{"2":{"418":1}}],["walletcontractbytecode",{"2":{"389":1}}],["walletconnectprojectid",{"2":{"100":1,"101":1}}],["walletconnect",{"0":{"210":1},"2":{"96":1,"187":1,"208":1,"210":4,"239":1,"367":1}}],["walletproxybytecode",{"2":{"389":1}}],["walletpanel",{"2":{"155":1}}],["walletauthoptions",{"0":{"114":1},"2":{"124":2}}],["walletaddress",{"2":{"80":2,"436":2}}],["wallets",{"0":{"183":1,"238":1,"286":1,"342":1,"346":1,"366":1,"375":1},"1":{"184":1,"185":1,"186":1,"239":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"343":1,"344":1,"345":1,"346":1,"347":2,"348":1,"367":1,"376":1,"377":1,"378":1},"2":{"66":3,"94":1,"95":1,"96":1,"100":1,"113":1,"114":1,"122":1,"185":1,"186":3,"187":1,"233":1,"237":1,"238":1,"239":1,"245":1,"253":2,"255":1,"263":1,"288":1,"342":2,"346":3,"349":3,"350":1,"351":1,"352":1,"353":5,"366":1,"367":1,"378":1,"386":1,"390":2,"391":1,"392":1,"395":1,"401":1,"402":1,"410":1,"412":1,"423":1,"426":1,"427":1,"430":2,"432":2,"471":1}}],["walleteoa",{"2":{"66":4,"72":2,"77":2,"85":2}}],["wallet",{"0":{"11":1,"23":1,"36":1,"37":1,"85":1,"101":1,"103":1,"155":1,"187":1,"189":1,"209":1,"212":1,"213":1,"214":1,"216":1,"219":1,"237":1,"281":1,"282":1,"283":1,"349":1,"370":1,"371":1,"372":1,"381":1,"388":1,"389":1,"390":1,"391":1,"395":1,"405":1,"410":1,"418":1,"423":1,"451":1,"452":1,"453":1,"454":1,"457":1},"1":{"37":1,"156":1,"157":1,"158":1,"159":1,"188":1,"189":1,"190":2,"191":2,"192":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"200":2,"201":2,"202":2,"203":2,"204":2,"205":2,"206":2,"207":2,"208":1,"209":1,"210":1,"350":1,"351":1,"352":1,"353":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":2,"391":1,"392":2,"393":2,"394":2,"395":1,"396":2,"397":2,"398":2,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1},"2":{"23":2,"24":1,"32":2,"33":2,"35":3,"37":4,"65":1,"66":17,"67":1,"72":3,"73":1,"74":1,"77":12,"80":3,"81":1,"83":2,"84":3,"85":2,"87":1,"88":1,"90":2,"91":3,"92":2,"96":3,"98":1,"99":3,"100":1,"101":4,"103":3,"114":3,"115":1,"126":2,"133":3,"141":2,"142":3,"143":2,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":2,"151":3,"153":3,"154":4,"155":2,"160":2,"183":3,"184":3,"185":4,"187":12,"188":19,"189":2,"190":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":3,"198":2,"199":2,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"210":2,"212":3,"213":6,"214":1,"216":1,"217":5,"219":6,"220":1,"221":1,"222":3,"223":1,"225":2,"226":3,"227":3,"228":3,"229":2,"234":1,"235":1,"237":2,"239":3,"241":2,"251":2,"256":1,"261":2,"265":1,"274":1,"275":1,"277":2,"278":3,"279":1,"281":3,"283":2,"286":1,"287":2,"290":2,"291":1,"292":1,"293":5,"294":5,"295":3,"298":3,"308":2,"315":2,"317":6,"320":1,"321":3,"334":1,"341":2,"342":1,"343":1,"349":5,"350":1,"351":2,"355":1,"356":1,"358":2,"359":3,"360":2,"362":1,"367":3,"371":2,"373":2,"374":8,"375":3,"378":1,"381":1,"383":1,"386":2,"388":4,"389":5,"390":1,"391":1,"392":3,"393":3,"394":5,"395":3,"396":3,"397":1,"398":1,"399":1,"400":2,"401":6,"402":6,"403":1,"404":2,"405":2,"407":3,"408":2,"409":3,"410":5,"413":6,"414":7,"415":2,"419":3,"423":3,"424":2,"426":2,"428":1,"430":2,"432":5,"433":1,"434":1,"435":1,"439":1,"449":3,"451":3,"452":6,"453":1,"454":1,"455":5,"457":6,"458":1,"459":1,"460":3,"461":1,"463":2,"464":3,"465":3,"466":3,"467":2,"472":1}}],["walk",{"2":{"4":1,"98":1,"122":1,"182":1}}],["ways",{"2":{"187":1,"352":1}}],["way",{"2":{"1":1,"66":3,"73":1,"125":1,"158":2,"217":1,"351":1,"395":1,"402":1,"430":2,"455":1}}],["width=",{"2":{"436":1}}],["width",{"2":{"172":1}}],["wip",{"2":{"167":2,"170":1}}],["wish",{"2":{"130":1,"142":1,"150":1,"153":1,"154":1,"165":2,"174":1,"319":1,"322":1,"441":1}}],["windows",{"2":{"137":2,"167":2,"176":1}}],["window",{"0":{"82":1},"2":{"82":1,"129":2,"131":2,"136":1,"137":1,"139":1,"188":1,"197":1}}],["will",{"2":{"3":3,"4":4,"8":2,"23":2,"30":4,"50":1,"61":1,"62":2,"63":1,"65":1,"66":9,"72":2,"74":1,"75":1,"77":2,"91":1,"96":1,"98":1,"101":1,"102":1,"112":1,"113":2,"114":2,"115":2,"122":1,"126":3,"129":3,"130":2,"131":5,"132":4,"133":2,"134":1,"141":1,"143":1,"150":1,"151":1,"152":1,"155":2,"160":3,"163":1,"164":2,"165":1,"168":2,"169":1,"172":4,"177":1,"179":1,"184":1,"186":1,"187":3,"188":2,"190":1,"192":1,"194":1,"196":1,"197":1,"198":2,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"207":1,"210":1,"213":3,"225":1,"237":1,"239":1,"246":1,"247":1,"256":1,"257":1,"265":1,"266":1,"274":1,"275":1,"281":1,"282":1,"283":2,"287":1,"293":4,"294":4,"296":1,"297":1,"298":2,"315":2,"316":3,"317":1,"318":1,"328":1,"330":1,"333":4,"334":2,"341":2,"352":3,"359":1,"367":1,"371":1,"373":2,"378":2,"392":1,"393":1,"401":2,"404":1,"407":1,"413":2,"414":2,"415":1,"429":1,"430":1,"432":1,"435":3,"443":1,"447":1,"448":1,"449":4,"452":3,"463":1}}],["without",{"2":{"33":1,"65":1,"67":1,"72":1,"73":2,"74":1,"130":1,"142":1,"151":1,"153":1,"154":1,"187":1,"188":2,"216":1,"217":1,"223":2,"284":1,"401":1,"408":1,"447":1,"454":1,"455":1,"461":2}}],["within",{"2":{"4":1,"96":1,"100":1,"130":2,"142":1,"153":1,"154":1,"165":1,"179":1,"184":1,"187":1,"239":1,"346":1,"352":1,"367":1,"429":1,"430":1,"443":1}}],["with",{"0":{"12":1,"67":1,"75":1,"77":1,"98":1,"141":1,"188":1,"208":1,"209":1,"211":1,"215":1,"218":1,"223":1,"230":1,"281":1,"282":1,"283":1,"450":1,"456":1,"461":1,"468":1},"1":{"68":1,"69":1,"70":1,"71":1,"72":1,"76":1,"78":1,"79":1,"99":1,"212":1,"213":1,"214":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"231":1,"232":1,"233":1,"234":1,"451":1,"452":1,"453":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"469":1,"470":1,"471":1,"472":1},"2":{"0":2,"1":1,"4":2,"5":1,"6":1,"7":2,"8":2,"11":1,"22":1,"23":1,"25":1,"26":4,"30":4,"31":1,"33":3,"36":1,"38":1,"40":1,"43":1,"49":1,"51":1,"53":1,"56":1,"57":3,"59":1,"65":1,"66":2,"67":2,"73":1,"74":4,"75":2,"77":3,"78":1,"80":1,"83":1,"84":5,"85":1,"88":1,"90":1,"91":1,"92":1,"93":1,"95":2,"96":3,"97":1,"99":1,"100":1,"107":1,"120":2,"122":1,"123":1,"125":1,"126":1,"129":3,"130":4,"131":2,"132":3,"133":4,"134":2,"135":1,"139":4,"141":5,"142":3,"143":2,"145":5,"147":5,"149":5,"150":4,"153":2,"154":3,"158":2,"159":1,"160":1,"167":2,"168":2,"169":3,"172":2,"175":1,"181":2,"182":1,"184":4,"185":2,"186":1,"187":4,"188":1,"189":1,"199":1,"201":2,"202":2,"213":2,"214":2,"217":1,"221":1,"226":1,"227":1,"228":1,"232":1,"234":2,"235":1,"237":4,"238":2,"239":3,"240":1,"241":2,"242":1,"249":4,"250":2,"251":1,"258":4,"260":2,"261":1,"268":1,"277":2,"278":2,"281":2,"282":2,"283":6,"284":2,"285":1,"288":2,"295":1,"297":1,"298":1,"299":1,"317":1,"318":1,"321":2,"322":2,"324":1,"326":1,"333":1,"335":1,"336":1,"339":1,"341":1,"349":2,"351":2,"352":3,"353":2,"356":1,"358":1,"359":1,"360":1,"363":1,"364":1,"366":2,"367":3,"368":1,"370":1,"371":1,"373":1,"374":1,"375":3,"376":1,"379":2,"380":1,"381":1,"382":1,"383":1,"385":1,"392":1,"413":1,"415":2,"419":1,"426":1,"430":1,"432":1,"433":1,"434":2,"435":3,"436":1,"438":1,"439":1,"440":1,"443":2,"452":2,"453":2,"455":1,"459":1,"464":1,"465":1,"466":1,"470":1,"472":2}}],["weight",{"2":{"382":2,"383":2,"384":4,"385":4,"387":4,"401":1,"424":1,"428":3,"429":3,"430":10,"431":2}}],["weights",{"2":{"381":1,"396":1,"400":1,"424":1,"425":1,"427":1}}],["weighted",{"2":{"62":1}}],["weeds",{"2":{"298":1}}],["week",{"2":{"193":1}}],["were",{"2":{"217":1,"318":1,"353":1,"455":1}}],["went",{"2":{"80":2}}],["weth",{"2":{"66":1}}],["websocketprovider",{"2":{"283":1}}],["websocketpublicclient",{"2":{"243":1}}],["web2",{"2":{"185":2,"187":1}}],["webgl",{"0":{"140":1},"2":{"127":1,"135":1}}],["web",{"0":{"20":1,"21":1,"27":1,"46":1,"370":1},"2":{"26":1,"51":1,"53":1,"169":1,"177":3,"181":2,"187":3,"351":1,"370":1,"371":1}}],["webapps",{"2":{"25":1}}],["webapp",{"2":{"11":1,"23":1,"24":1,"26":1,"32":1,"37":1,"39":1,"41":1,"43":1,"50":2,"56":1,"57":2,"62":1,"379":1}}],["web3modal",{"0":{"277":1},"1":{"278":1,"279":1},"2":{"188":1,"208":1,"237":1,"277":3,"278":1,"279":2}}],["web3",{"0":{"208":1,"238":1,"261":1,"268":1,"366":1},"1":{"239":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"367":1},"2":{"0":1,"33":2,"82":1,"95":2,"96":2,"100":1,"114":1,"184":1,"185":1,"187":6,"235":1,"237":3,"238":2,"239":2,"261":3,"262":2,"263":1,"267":1,"268":3,"269":1,"271":2,"272":1,"276":1,"330":1,"366":2,"367":2,"371":1}}],["we",{"2":{"0":1,"26":1,"27":1,"30":2,"39":2,"41":2,"46":1,"49":2,"51":2,"53":1,"59":2,"61":1,"63":2,"64":1,"67":1,"80":4,"85":1,"90":1,"98":1,"126":1,"130":3,"131":3,"132":1,"133":2,"135":2,"141":1,"145":1,"147":1,"148":1,"149":1,"150":2,"152":1,"154":2,"155":2,"157":1,"158":2,"159":2,"160":1,"167":1,"173":1,"175":3,"182":1,"183":1,"184":1,"185":1,"187":1,"213":1,"282":2,"283":3,"284":1,"297":1,"317":2,"319":2,"321":1,"322":2,"351":1,"358":1,"378":1,"441":3,"452":1}}],["well",{"2":{"0":1,"26":1,"49":1,"50":1,"53":1,"59":1,"80":1,"150":1,"177":1,"180":1,"181":1,"184":1,"225":1,"234":1,"317":2,"319":2,"322":1,"378":1,"413":1,"414":1,"463":1,"472":1}}],["turn",{"2":{"283":1}}],["turned",{"2":{"281":1}}],["tfunction",{"2":{"175":2}}],["tfunctions",{"2":{"175":2}}],["typically",{"2":{"142":1,"213":1,"217":1,"452":1,"455":1}}],["typical",{"2":{"142":1}}],["typeddata",{"2":{"414":2}}],["typed",{"2":{"414":1}}],["typedefault",{"2":{"115":1}}],["typedefaultbooleantrue",{"2":{"112":1}}],["typedefaultstringundefined",{"2":{"110":1,"111":1}}],["typedefaultstringcenter",{"2":{"108":1}}],["typedefaultstring",{"2":{"107":1,"113":1,"114":1}}],["typescript",{"2":{"26":2,"53":1,"75":1,"90":2,"184":2,"185":1,"214":1,"231":1,"358":2,"453":1,"469":1}}],["types",{"2":{"4":1,"142":1,"316":1,"427":1}}],["type",{"0":{"318":1},"2":{"4":1,"23":2,"24":2,"32":2,"37":2,"39":2,"41":2,"43":2,"50":2,"56":2,"57":4,"61":8,"62":2,"63":2,"80":2,"83":1,"84":1,"151":2,"167":1,"172":1,"174":1,"188":1,"319":1,"340":1,"379":3,"414":3,"448":1,"449":1}}],["tmp",{"2":{"129":1,"131":1,"387":4}}],["twitter",{"2":{"434":1}}],["twitch",{"2":{"113":1,"201":1}}],["two",{"2":{"91":1,"133":1,"226":1,"227":1,"228":1,"298":1,"332":1,"342":1,"352":1,"359":1,"375":2,"419":1,"439":1,"464":1,"465":1,"466":1}}],["tweaking",{"2":{"50":1}}],["tsx",{"2":{"283":1,"436":1}}],["tsuccesscallback",{"2":{"175":1}}],["ts",{"2":{"80":1,"436":1,"449":1}}],["txhash",{"2":{"448":2}}],["tx",{"2":{"444":1,"446":1,"448":3,"449":4}}],["txs",{"2":{"66":1,"72":1}}],["txns",{"2":{"73":1}}],["txn2",{"2":{"73":2}}],["txn1",{"2":{"73":2}}],["txnreceipt",{"2":{"66":4,"72":2}}],["txnresponse",{"2":{"66":2,"72":1,"225":2,"226":4,"227":4,"228":4,"463":2,"464":4,"465":4,"466":4}}],["txn",{"2":{"66":2,"72":2,"85":2}}],["tx5drvi",{"2":{"50":1}}],["tnqwlujz",{"2":{"50":1}}],["times",{"2":{"62":1,"75":1,"158":1}}],["time",{"0":{"334":1,"440":1},"2":{"30":2,"33":1,"50":1,"74":1,"85":1,"126":1,"158":1,"160":1,"181":1,"213":1,"216":1,"217":1,"317":1,"319":1,"334":1,"353":1,"375":1,"379":1,"386":1,"391":1,"407":1,"435":1,"440":1,"441":1,"452":1,"454":1,"455":1}}],["timezones",{"2":{"0":1}}],["tips",{"0":{"30":1},"2":{"378":1}}],["tip",{"2":{"23":1,"42":1,"49":1,"55":1,"188":1,"241":1,"251":1,"261":1,"277":1}}],["t",{"2":{"8":1,"92":1,"124":1,"127":1,"129":1,"131":2,"139":2,"150":1,"158":2,"159":1,"172":2,"210":1,"229":1,"317":1,"319":3,"351":2,"353":1,"360":1,"386":1,"388":1,"390":1,"395":1,"401":1,"402":1,"406":1,"407":1,"410":1,"433":1,"434":1,"441":1,"467":1}}],["tries",{"2":{"444":1}}],["triggered",{"2":{"120":1,"188":1,"444":3,"445":2,"446":1}}],["triggertransaction",{"2":{"120":1}}],["triggercheckout",{"2":{"118":2}}],["triggering",{"0":{"102":1},"2":{"98":1}}],["trigger",{"0":{"443":1},"1":{"444":1},"2":{"66":1,"443":1}}],["triggers",{"2":{"66":1}}],["trees",{"2":{"429":1}}],["tree",{"0":{"427":1},"1":{"428":1,"429":1,"430":1},"2":{"424":1,"427":3,"429":1,"430":3,"431":4}}],["trust",{"2":{"214":1,"345":1,"351":1,"453":1}}],["trusted",{"2":{"80":1,"440":1,"441":1,"442":1}}],["true",{"0":{"404":1},"2":{"23":3,"24":3,"28":2,"30":2,"32":1,"37":3,"39":2,"41":3,"42":1,"55":1,"82":1,"85":2,"102":1,"103":1,"139":3,"188":1,"194":1,"196":1,"197":1,"198":1,"207":1,"213":2,"243":1,"281":1,"283":1,"340":1,"379":1,"402":2,"407":1,"408":1,"437":1,"442":2,"443":4,"444":2,"446":2,"449":1,"452":2}}],["trades",{"2":{"379":1}}],["tradeoff",{"2":{"378":1}}],["traditional",{"2":{"184":1,"351":1,"374":1}}],["trading",{"2":{"50":1,"379":1}}],["tranfereth",{"2":{"315":1}}],["transports",{"2":{"100":3,"101":3,"124":1}}],["transferring",{"2":{"406":1}}],["transfereth",{"2":{"315":1}}],["transfertransaction",{"2":{"315":2}}],["transfers",{"0":{"315":1},"2":{"145":1,"147":1,"149":1,"226":2,"227":2,"228":2,"464":2,"465":2,"466":2}}],["transfer",{"2":{"66":1,"73":2,"226":7,"227":1,"228":1,"229":2,"315":1,"316":2,"317":4,"321":1,"464":7,"465":1,"466":1,"467":2}}],["transactionfailed",{"2":{"449":1}}],["transactioncreator",{"2":{"317":4,"321":2}}],["transactioncount",{"0":{"313":1},"2":{"313":2}}],["transactioncall",{"2":{"305":2}}],["transactionbyhash",{"0":{"312":1},"2":{"312":1}}],["transaction2",{"2":{"226":2,"227":2,"228":2,"229":2,"464":2,"465":2,"466":2,"467":2}}],["transaction1",{"2":{"226":2,"227":2,"228":2,"229":2,"464":2,"465":2,"466":2,"467":2}}],["transactionreceipt",{"2":{"292":2,"294":4,"314":2,"315":1,"317":4,"321":2,"448":1}}],["transactionreturn",{"2":{"142":1}}],["transactionresponse",{"2":{"80":1,"85":1}}],["transactionhash",{"2":{"291":1,"309":1,"312":1,"314":1}}],["transactionhashes",{"2":{"37":1,"293":1}}],["transactionhistoryfilter",{"2":{"37":1,"39":1,"41":1}}],["transactionhistory",{"2":{"37":2,"39":2}}],["transaction",{"0":{"36":1,"37":1,"39":1,"416":1,"447":1,"448":1,"449":1},"1":{"37":1,"448":1,"449":1},"2":{"8":3,"35":2,"37":7,"39":4,"65":1,"66":5,"67":2,"72":5,"74":2,"77":1,"85":2,"120":1,"142":3,"143":4,"144":2,"145":1,"146":2,"147":1,"148":4,"149":1,"150":4,"151":6,"154":1,"155":1,"184":1,"225":4,"226":4,"227":4,"228":4,"229":1,"234":1,"291":1,"292":1,"293":3,"294":2,"305":1,"309":3,"312":4,"314":1,"315":1,"317":4,"321":3,"331":1,"335":1,"393":1,"396":1,"401":1,"404":2,"406":3,"407":4,"408":1,"425":1,"444":1,"445":1,"447":3,"448":8,"449":4,"463":4,"464":4,"465":4,"466":4,"467":1,"472":1}}],["transactions",{"0":{"73":1,"151":1,"225":1,"229":1,"463":1,"467":1},"2":{"8":10,"33":2,"65":3,"66":2,"67":2,"73":8,"142":1,"151":5,"185":1,"226":1,"227":1,"228":1,"229":4,"293":3,"294":3,"313":1,"347":1,"352":2,"402":1,"407":2,"408":1,"412":1,"423":1,"434":1,"447":1,"448":1,"449":3,"464":1,"465":1,"466":1,"467":4}}],["trait",{"2":{"61":8}}],["tracking",{"2":{"380":1}}],["trackers",{"2":{"214":2,"453":2}}],["tracked",{"2":{"75":1}}],["track",{"2":{"30":1,"39":1}}],["trying",{"2":{"96":1,"184":1,"239":1,"367":1}}],["try",{"0":{"7":1,"87":1,"338":1,"340":1,"355":1,"362":1},"2":{"23":1,"24":1,"32":1,"37":1,"39":1,"50":1,"80":3,"82":1,"87":1,"179":1,"214":1,"241":2,"251":2,"261":2,"277":2,"284":2,"355":1,"362":1,"370":1,"371":1,"436":1,"449":2,"453":1}}],["troubles",{"2":{"0":1}}],["technique",{"2":{"249":1,"258":1}}],["technically",{"2":{"61":1}}],["technical",{"2":{"27":1,"28":1,"63":1}}],["text",{"2":{"167":1,"213":1,"452":1}}],["textmeshpro",{"2":{"129":1,"131":1}}],["templates",{"2":{"182":1,"186":1}}],["template",{"0":{"82":1,"88":1,"339":1,"356":1,"363":1},"2":{"88":1,"130":3,"182":1,"339":1,"356":1,"363":1}}],["tested",{"2":{"284":1}}],["test",{"0":{"75":1,"76":1},"1":{"76":1},"2":{"74":1,"83":1,"85":1,"92":1,"172":1,"360":1,"434":1,"435":1,"436":1,"437":1,"438":1,"448":1,"449":1}}],["testing",{"0":{"58":1,"83":1},"2":{"1":1,"33":1,"75":2,"104":1,"127":1}}],["terms",{"2":{"63":1,"378":1}}],["team",{"2":{"0":3,"5":1,"23":1,"43":1,"56":1,"57":2,"91":1,"94":1,"132":1,"160":1,"163":1,"233":1,"237":1,"351":1,"359":1,"379":1,"471":1}}],["tampered",{"2":{"351":1}}],["tailored",{"2":{"235":1}}],["taking",{"2":{"210":1}}],["takes",{"2":{"188":1,"432":1,"443":1}}],["taken",{"2":{"72":1,"407":1}}],["take",{"2":{"64":1,"97":1,"142":1,"153":1,"154":1,"158":1,"179":2,"184":1,"240":1,"249":1,"258":1,"316":1,"342":1,"352":1,"368":1,"374":1}}],["tag",{"2":{"205":1}}],["tanstack",{"2":{"99":3,"100":1,"101":1}}],["tank",{"0":{"70":1},"2":{"72":2}}],["tablet",{"2":{"370":1,"371":1}}],["tab",{"2":{"77":1,"179":3,"328":1}}],["tasks",{"2":{"284":1}}],["task",{"2":{"57":1,"142":2,"153":2,"154":2,"317":1}}],["taskid",{"2":{"57":3}}],["targets",{"2":{"133":1}}],["target",{"2":{"23":1,"26":1,"43":1,"50":1,"53":1,"56":1,"57":2,"379":1}}],["talking",{"2":{"0":1}}],["tackle",{"2":{"0":1}}],["those",{"2":{"165":1,"235":1,"364":1}}],["thought",{"2":{"142":1}}],["than",{"2":{"159":1,"214":1,"234":1,"453":1,"472":1}}],["that",{"2":{"0":1,"3":1,"4":3,"6":1,"8":1,"23":1,"26":1,"30":1,"33":2,"59":1,"61":2,"62":2,"63":2,"66":1,"72":2,"73":3,"75":2,"77":1,"80":4,"92":1,"104":1,"115":1,"126":1,"129":1,"130":3,"131":3,"132":1,"133":1,"142":1,"143":1,"144":1,"145":2,"147":2,"149":2,"150":2,"151":1,"154":1,"155":1,"158":1,"164":1,"165":1,"172":1,"174":1,"179":4,"184":1,"185":1,"187":2,"188":1,"193":1,"201":1,"210":2,"217":2,"225":1,"235":1,"246":1,"249":1,"258":1,"265":1,"268":1,"274":1,"283":3,"284":3,"288":2,"293":1,"294":1,"297":1,"316":1,"317":1,"318":1,"334":1,"336":1,"341":1,"346":2,"349":1,"351":1,"352":3,"353":1,"360":1,"364":1,"373":1,"374":3,"375":1,"377":1,"378":2,"382":1,"386":1,"392":1,"393":1,"394":1,"399":1,"400":1,"401":2,"402":1,"404":1,"407":1,"415":2,"423":1,"425":1,"426":1,"429":1,"430":1,"431":1,"435":2,"436":2,"437":1,"440":1,"443":1,"444":1,"447":1,"448":2,"455":2,"463":1}}],["threshold",{"0":{"425":1},"2":{"378":1,"381":1,"384":2,"385":2,"387":2,"395":1,"396":1,"400":1,"401":1,"413":1,"414":1,"415":1,"424":1,"425":2,"428":1,"430":5,"431":2}}],["three",{"2":{"375":3}}],["threat",{"0":{"353":1}}],["threats",{"2":{"350":1}}],["threads",{"2":{"139":1}}],["throwing",{"2":{"284":1}}],["throw",{"2":{"66":2,"284":2}}],["throughout",{"2":{"288":1}}],["throughput",{"2":{"65":1,"74":1}}],["through",{"2":{"2":1,"4":1,"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1,"74":1,"98":1,"122":1,"133":1,"150":1,"167":2,"172":1,"173":1,"182":1,"187":1,"217":1,"241":1,"251":1,"261":1,"262":1,"281":1,"283":1,"413":2,"414":2,"415":1,"439":1,"455":1}}],["third",{"2":{"130":1,"351":1}}],["think",{"2":{"94":1,"187":1,"233":1,"235":1,"471":1}}],["thing",{"2":{"84":1,"175":1}}],["things",{"2":{"30":1,"175":1,"298":1,"325":1,"430":2}}],["this",{"2":{"3":5,"4":2,"23":2,"27":1,"30":3,"39":2,"41":2,"43":1,"46":1,"56":1,"61":2,"63":1,"66":5,"67":1,"72":2,"73":1,"74":1,"75":2,"76":1,"77":5,"78":1,"79":1,"80":1,"82":3,"83":1,"84":3,"85":2,"91":1,"98":1,"101":1,"115":1,"122":1,"125":1,"126":1,"129":5,"130":4,"131":3,"132":3,"133":5,"135":1,"139":3,"141":3,"142":1,"143":3,"144":2,"145":1,"146":1,"147":1,"148":1,"149":1,"150":7,"152":1,"153":1,"154":2,"155":2,"158":2,"160":1,"163":3,"164":1,"165":4,"167":16,"168":3,"172":3,"177":1,"179":2,"186":1,"187":5,"188":1,"192":1,"213":7,"216":1,"221":2,"235":1,"237":1,"245":1,"247":1,"249":2,"255":1,"257":1,"258":2,"281":2,"282":3,"283":5,"286":1,"287":1,"296":2,"298":1,"315":1,"316":1,"322":1,"324":1,"325":2,"326":2,"327":1,"328":2,"332":3,"333":3,"334":3,"336":1,"346":1,"351":3,"352":3,"353":4,"359":1,"364":1,"371":1,"375":1,"377":3,"378":1,"384":1,"386":1,"389":1,"392":1,"393":2,"395":2,"396":1,"400":1,"401":3,"402":2,"403":1,"404":1,"407":1,"409":1,"410":2,"413":1,"414":1,"415":1,"429":2,"430":3,"431":1,"433":1,"435":2,"437":1,"440":1,"441":1,"442":1,"443":1,"444":1,"446":1,"448":1,"449":5,"452":7,"454":1,"459":2}}],["thus",{"2":{"8":1}}],["these",{"0":{"181":1,"184":1},"2":{"85":1,"100":1,"105":1,"117":1,"127":1,"130":2,"131":1,"132":1,"151":1,"155":1,"158":1,"163":1,"167":2,"175":1,"177":2,"178":1,"181":2,"183":1,"297":2,"321":2,"325":2,"346":1,"349":1,"352":1,"353":1,"378":1,"389":1,"393":1,"401":1,"419":1}}],["then",{"2":{"28":1,"30":1,"46":1,"47":1,"77":1,"80":1,"81":1,"84":2,"101":1,"136":2,"137":2,"163":1,"165":3,"173":1,"179":1,"181":1,"187":1,"196":1,"213":3,"214":1,"217":1,"234":1,"243":1,"253":1,"283":2,"292":1,"294":1,"327":1,"336":1,"402":1,"426":1,"434":1,"435":1,"452":3,"453":1,"455":1,"472":1}}],["theme=",{"2":{"139":2}}],["theme",{"0":{"199":1},"2":{"107":1,"188":2,"199":2}}],["themselves",{"2":{"64":1,"351":1,"378":1,"403":1}}],["them",{"0":{"185":1},"2":{"8":1,"62":1,"73":3,"96":1,"141":1,"146":1,"155":1,"165":1,"173":1,"184":1,"217":1,"239":1,"284":1,"293":1,"294":1,"297":1,"350":1,"367":1,"378":1,"455":1}}],["their",{"2":{"8":1,"61":1,"64":1,"96":1,"135":1,"150":1,"164":1,"187":3,"188":1,"210":2,"213":3,"216":1,"217":3,"239":1,"282":1,"283":1,"321":1,"335":1,"341":1,"352":1,"367":1,"373":1,"374":3,"375":5,"376":3,"377":1,"378":4,"381":1,"382":1,"424":1,"429":1,"440":1,"441":1,"452":3,"454":1,"455":3}}],["they",{"2":{"8":1,"30":1,"61":1,"63":1,"64":1,"73":1,"113":1,"114":1,"131":1,"150":1,"174":1,"181":1,"188":1,"198":2,"210":1,"213":1,"217":3,"284":1,"285":1,"317":1,"346":1,"375":1,"389":1,"430":2,"449":1,"452":1,"455":3}}],["therefore",{"2":{"154":1,"278":1,"281":1,"386":1}}],["there",{"2":{"4":1,"61":1,"73":1,"130":2,"131":1,"135":1,"154":1,"158":1,"179":1,"249":1,"258":1,"283":1,"286":1,"297":1,"298":1,"379":1,"402":1,"403":1}}],["the",{"0":{"37":1,"39":1,"83":1,"84":1,"100":1,"101":1,"102":1,"103":1,"118":1,"119":1,"181":1,"184":1,"185":1,"209":1,"212":1,"282":1,"283":1,"328":1,"333":1,"385":1,"409":1,"410":1,"451":1},"1":{"120":1,"121":1,"410":1},"2":{"0":6,"1":3,"2":4,"3":7,"4":13,"5":2,"6":1,"7":8,"8":9,"22":2,"23":7,"24":5,"25":4,"26":12,"27":2,"28":2,"29":2,"30":11,"31":2,"32":2,"33":12,"34":1,"35":5,"36":2,"37":4,"38":2,"39":6,"40":2,"41":8,"42":1,"43":1,"45":2,"48":2,"49":8,"50":14,"51":4,"52":5,"53":8,"55":1,"56":2,"57":6,"59":5,"61":7,"62":6,"63":8,"64":3,"66":20,"67":5,"72":8,"73":2,"74":5,"75":14,"76":4,"77":16,"78":1,"79":1,"80":10,"81":2,"82":3,"83":1,"84":9,"85":8,"90":4,"91":2,"92":2,"93":1,"94":1,"95":3,"96":2,"97":2,"98":2,"99":5,"100":4,"101":4,"102":6,"103":2,"104":1,"105":3,"107":5,"108":4,"109":2,"110":2,"111":2,"112":2,"113":7,"114":7,"115":5,"116":1,"117":4,"118":2,"119":2,"120":1,"121":3,"122":1,"123":3,"124":4,"125":2,"126":1,"129":3,"130":16,"131":11,"132":13,"133":7,"134":8,"135":4,"136":5,"137":5,"139":10,"141":4,"142":5,"143":6,"144":5,"145":4,"146":1,"147":4,"148":4,"149":4,"150":24,"151":5,"152":5,"153":4,"154":7,"155":5,"156":1,"157":1,"158":16,"159":1,"160":3,"163":3,"164":1,"165":15,"167":10,"168":4,"169":3,"172":14,"173":4,"174":11,"176":1,"177":4,"179":29,"181":8,"182":4,"184":3,"185":1,"186":2,"187":7,"188":11,"189":1,"190":1,"192":2,"194":2,"197":3,"198":1,"199":2,"200":1,"201":1,"202":1,"203":1,"205":5,"206":2,"207":6,"208":1,"210":25,"212":1,"213":12,"214":8,"217":4,"220":1,"221":2,"222":2,"223":1,"224":4,"225":6,"226":2,"227":4,"228":4,"229":2,"231":1,"232":1,"233":1,"234":5,"235":3,"237":5,"238":3,"239":2,"240":2,"241":2,"242":6,"243":3,"245":1,"246":1,"247":1,"248":3,"249":11,"250":3,"251":2,"252":2,"253":3,"255":1,"256":5,"257":1,"258":9,"259":3,"260":2,"261":2,"262":1,"265":2,"266":2,"268":2,"269":2,"271":1,"272":2,"274":2,"275":2,"277":1,"278":3,"279":1,"281":7,"282":13,"283":24,"284":4,"285":2,"286":3,"288":3,"289":2,"290":2,"291":2,"292":3,"293":8,"294":9,"295":8,"296":4,"297":2,"298":13,"299":1,"300":1,"301":1,"302":1,"303":3,"304":1,"305":2,"307":3,"308":1,"309":2,"311":1,"313":1,"314":1,"315":4,"316":4,"317":12,"318":2,"319":6,"320":1,"321":5,"322":2,"325":1,"326":3,"327":2,"328":2,"329":2,"331":2,"332":4,"333":5,"334":5,"335":2,"336":4,"341":5,"342":2,"343":1,"346":3,"349":5,"350":4,"351":1,"352":11,"353":11,"358":4,"359":2,"360":2,"362":1,"364":2,"366":3,"367":2,"368":2,"371":1,"373":5,"374":7,"375":9,"376":1,"377":3,"378":9,"379":29,"380":2,"383":2,"385":2,"386":11,"388":8,"389":11,"390":8,"391":2,"392":8,"393":4,"394":5,"395":11,"396":6,"398":2,"399":3,"400":3,"401":17,"402":16,"403":4,"404":3,"405":4,"406":3,"407":14,"408":3,"409":6,"410":8,"413":7,"414":8,"415":13,"423":6,"424":4,"425":6,"426":4,"427":3,"428":5,"429":5,"430":14,"431":8,"432":23,"433":2,"434":4,"435":16,"436":18,"437":1,"438":2,"439":1,"441":1,"442":3,"443":9,"444":5,"445":1,"446":3,"447":1,"448":13,"449":8,"451":1,"452":12,"453":8,"455":4,"458":1,"459":2,"460":2,"461":1,"462":4,"463":6,"464":2,"465":4,"466":4,"467":2,"469":1,"470":1,"471":1,"472":5}}],["torus",{"0":{"378":1},"2":{"375":3,"378":7}}],["towards",{"2":{"184":1}}],["tower",{"2":{"130":2}}],["touch",{"2":{"160":1}}],["toutf8bytes",{"2":{"77":1}}],["together",{"2":{"150":1,"151":2,"173":1,"285":1,"293":1,"294":1,"430":2}}],["toggle",{"2":{"23":1,"24":1,"37":1,"41":1}}],["toaddress",{"2":{"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":4,"317":4,"321":2}}],["toying",{"2":{"107":1}}],["topics",{"2":{"448":2}}],["top",{"0":{"424":1},"1":{"425":1,"426":1,"427":1,"428":1,"429":1,"430":1},"2":{"105":1,"108":3,"132":1,"158":1,"179":1}}],["toml",{"2":{"81":1,"82":1}}],["took",{"2":{"377":1}}],["toolkit",{"2":{"94":1,"95":1,"233":1,"238":1,"366":1,"471":1}}],["tools=",{"2":{"139":2}}],["tools",{"0":{"159":1},"2":{"94":1,"95":1,"139":2,"159":1,"233":1,"237":1,"238":1,"366":1,"471":1}}],["too",{"2":{"49":1,"187":2,"188":1,"237":1,"241":1,"251":1,"261":1,"277":1}}],["total",{"0":{"41":1},"2":{"35":3,"41":1,"382":1,"429":1,"430":2}}],["tokenresponse",{"2":{"436":2}}],["tokenbaseuri",{"2":{"333":2}}],["tokenbalances",{"2":{"23":4,"27":1,"28":1,"32":3}}],["token4id",{"2":{"229":1,"467":1}}],["token2id",{"2":{"228":1,"466":1}}],["token1id",{"2":{"228":1,"466":1}}],["tokencontract",{"2":{"73":2,"379":1}}],["tokenuri",{"2":{"61":2}}],["tokenmetadata",{"2":{"56":2,"57":1}}],["tokendetails",{"2":{"41":4}}],["tokenidasstring",{"2":{"146":1,"148":1,"151":2}}],["tokenids",{"2":{"56":3,"57":3,"340":1,"379":3}}],["tokenid",{"2":{"4":4,"50":1,"52":3,"61":1,"62":1,"66":1,"72":1,"80":3,"83":1,"84":1,"85":3,"121":1,"149":1,"227":4,"228":1,"229":1,"334":2,"379":2,"465":4,"466":1,"467":1}}],["tokens",{"0":{"4":1,"15":1,"16":1,"18":1,"22":1,"23":1,"40":1,"41":1,"226":1,"227":1,"228":1,"321":1,"464":1,"465":1,"466":1},"1":{"23":1,"24":1,"41":1},"2":{"4":8,"8":1,"23":2,"30":1,"32":1,"33":2,"35":3,"41":1,"42":1,"50":4,"52":6,"54":1,"55":1,"56":1,"61":2,"62":1,"64":3,"66":1,"144":1,"145":1,"146":1,"147":1,"148":2,"149":1,"207":1,"321":1,"322":1,"332":1,"334":1,"335":2,"336":4,"347":1,"379":2}}],["token",{"0":{"3":1,"11":1,"24":1,"38":1,"55":1,"56":1,"57":1,"59":1,"325":1},"1":{"39":1,"56":1,"57":1,"58":2,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1},"2":{"2":3,"3":4,"4":6,"23":5,"24":1,"25":1,"30":2,"33":7,"35":4,"37":4,"39":4,"41":8,"42":2,"45":2,"49":4,"50":7,"52":1,"54":3,"55":6,"56":2,"57":2,"58":7,"59":2,"61":3,"62":3,"63":1,"64":3,"66":1,"143":1,"144":4,"146":2,"148":4,"167":1,"169":2,"226":4,"227":3,"228":3,"229":2,"324":1,"325":5,"326":4,"333":2,"334":2,"335":1,"336":2,"341":1,"352":1,"373":1,"379":4,"444":1,"464":4,"465":3,"466":3,"467":2}}],["todotodoplease",{"2":{"56":1}}],["todo",{"0":{"215":1},"2":{"1":1,"90":1,"358":1,"449":1}}],["today",{"2":{"0":1,"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1}}],["to",{"0":{"39":1,"80":1,"85":1,"142":1,"209":1,"323":1,"331":1,"405":1},"1":{"81":1,"82":1,"83":1,"84":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1},"2":{"0":5,"1":5,"2":3,"3":8,"4":10,"6":2,"7":5,"8":4,"11":2,"22":1,"23":6,"24":3,"25":3,"26":3,"27":1,"28":1,"30":11,"31":1,"33":6,"35":1,"36":1,"37":4,"38":1,"39":2,"40":1,"41":6,"42":4,"43":1,"45":3,"49":4,"50":13,"53":2,"55":4,"56":2,"57":4,"59":4,"61":1,"62":2,"63":5,"65":2,"66":16,"67":3,"72":2,"73":8,"74":6,"75":11,"76":1,"77":6,"78":1,"79":2,"80":6,"82":4,"83":1,"84":3,"85":4,"90":1,"91":2,"92":3,"96":1,"97":1,"99":2,"100":3,"101":1,"102":1,"105":1,"109":1,"110":1,"111":1,"113":2,"114":2,"115":1,"116":1,"117":1,"118":1,"122":1,"123":6,"124":3,"125":1,"129":2,"130":10,"131":8,"132":6,"133":7,"134":3,"135":5,"136":2,"137":2,"139":6,"141":2,"142":5,"143":5,"144":5,"145":4,"146":1,"147":4,"148":2,"149":4,"150":16,"151":3,"152":1,"153":3,"154":6,"155":7,"157":2,"158":10,"159":4,"160":1,"163":2,"164":3,"165":14,"167":11,"168":3,"169":3,"172":5,"173":2,"174":4,"175":5,"176":2,"177":6,"178":1,"179":9,"180":1,"181":7,"182":3,"183":1,"184":1,"185":2,"186":4,"187":9,"188":10,"190":1,"194":1,"195":1,"197":1,"198":3,"201":1,"202":1,"203":1,"204":1,"205":2,"206":1,"207":5,"210":7,"212":1,"213":11,"214":4,"216":1,"217":3,"221":2,"223":1,"225":5,"226":7,"227":7,"228":7,"229":11,"234":2,"235":5,"237":6,"239":1,"240":1,"243":1,"245":1,"246":1,"247":3,"248":1,"249":2,"251":1,"253":1,"255":1,"256":1,"257":3,"258":2,"259":1,"265":2,"266":1,"268":1,"271":1,"272":1,"274":2,"278":1,"281":1,"282":3,"283":2,"284":2,"285":1,"288":1,"293":1,"294":1,"295":2,"296":1,"297":2,"298":5,"299":1,"300":1,"301":1,"302":1,"303":2,"304":1,"307":2,"308":2,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":2,"316":5,"317":7,"318":3,"319":4,"320":1,"321":4,"322":3,"326":2,"327":1,"329":1,"331":1,"332":5,"333":4,"334":6,"335":2,"336":3,"338":1,"341":5,"342":1,"344":3,"346":2,"349":1,"350":2,"351":6,"352":1,"353":5,"358":1,"359":2,"360":3,"364":3,"367":1,"368":1,"370":1,"371":2,"373":5,"374":4,"375":2,"376":1,"377":1,"378":7,"379":2,"380":1,"382":1,"386":1,"389":2,"390":1,"391":2,"392":2,"393":1,"394":1,"395":3,"396":2,"397":1,"398":1,"399":1,"401":4,"402":8,"403":2,"404":1,"405":2,"407":2,"408":2,"409":3,"410":3,"412":1,"413":1,"415":2,"423":1,"424":1,"425":1,"426":2,"427":1,"428":2,"429":2,"430":4,"433":2,"434":2,"435":9,"436":7,"440":1,"441":4,"442":1,"443":1,"444":2,"445":2,"446":1,"448":3,"449":7,"451":1,"452":11,"453":4,"454":1,"455":3,"459":2,"461":1,"463":5,"464":7,"465":7,"466":7,"467":11,"472":2}}],["azure",{"2":{"333":1}}],["awesome",{"2":{"187":1}}],["aware",{"2":{"175":1,"214":1,"453":1}}],["away",{"2":{"150":1}}],["await",{"2":{"7":1,"23":1,"24":1,"27":1,"32":1,"37":1,"39":1,"41":1,"43":1,"56":1,"57":2,"66":4,"72":2,"73":2,"77":1,"80":6,"85":3,"142":2,"153":2,"154":2,"188":2,"189":1,"190":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"213":1,"214":2,"219":1,"220":1,"221":1,"222":2,"223":1,"225":1,"226":2,"227":3,"228":3,"229":2,"291":1,"292":1,"293":1,"294":1,"295":2,"298":2,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":2,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":2,"317":6,"319":3,"320":1,"321":5,"379":2,"394":1,"413":1,"414":1,"434":2,"435":4,"436":3,"437":2,"438":3,"442":1,"443":2,"444":1,"445":1,"446":1,"448":2,"449":2,"452":1,"453":2,"457":1,"458":1,"459":1,"460":2,"461":1,"463":1,"464":2,"465":3,"466":3,"467":2}}],["ayourclass",{"2":{"167":2}}],["avoid",{"2":{"123":1,"175":1,"188":1}}],["availability",{"2":{"33":1}}],["available",{"0":{"106":1},"1":{"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1},"2":{"5":1,"49":2,"51":1,"66":1,"91":1,"93":1,"97":1,"123":1,"134":1,"135":1,"160":1,"187":1,"188":1,"199":1,"203":1,"231":1,"232":1,"240":1,"241":1,"246":1,"250":3,"251":1,"256":1,"260":1,"261":1,"262":1,"267":1,"268":1,"276":1,"277":1,"279":1,"281":2,"296":1,"341":1,"346":1,"351":1,"359":1,"368":1,"373":1,"436":1,"469":1,"470":1}}],["avalanche",{"0":{"32":1}}],["avax",{"0":{"32":1}}],["among",{"2":{"430":1}}],["amountasbiginteger",{"2":{"317":4}}],["amountasstring",{"2":{"144":1,"148":1,"151":2}}],["amount4",{"2":{"229":1,"467":1}}],["amount3",{"2":{"229":1,"467":1}}],["amountrequiredraw",{"2":{"120":1}}],["amount",{"2":{"85":1,"144":1,"145":1,"149":1,"150":1,"151":1,"206":2,"226":2,"228":1,"305":1,"334":1,"407":1,"464":2,"466":1}}],["amount2",{"2":{"73":1,"226":1,"227":1,"228":1,"229":1,"464":1,"465":1,"466":1,"467":1}}],["amount1",{"2":{"73":1,"226":1,"227":1,"228":1,"464":1,"465":1,"466":1}}],["amazon",{"2":{"134":2,"351":1,"440":1}}],["amp",{"0":{"3":1,"5":1,"30":1,"34":1,"49":1,"390":1,"411":1},"1":{"50":1,"51":1,"52":1,"53":1,"54":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1},"2":{"2":3,"3":1,"11":2,"23":2,"24":3,"28":3,"32":2,"35":1,"37":3,"39":3,"41":3,"45":3,"49":1,"67":1,"74":1,"102":2,"167":10,"168":1,"169":1,"175":2,"181":2,"385":3,"436":2}}],["admire",{"0":{"335":1}}],["adapter",{"2":{"288":1}}],["advanced",{"0":{"284":1},"1":{"285":1},"2":{"100":1,"131":1,"143":1,"284":1}}],["advantages",{"2":{"185":1}}],["advantage",{"2":{"64":1,"316":1}}],["adhere",{"2":{"30":1}}],["addr",{"2":{"428":1}}],["addresses",{"2":{"23":1,"24":1,"37":2,"41":1,"43":2,"54":1,"379":1,"393":2,"401":3}}],["address",{"0":{"37":1,"43":1,"72":1,"212":1,"389":1,"451":1},"2":{"23":3,"24":4,"28":1,"30":1,"32":3,"35":2,"37":6,"39":5,"41":4,"50":4,"54":1,"56":1,"57":1,"64":1,"66":6,"67":1,"72":4,"73":2,"74":1,"77":9,"80":10,"81":2,"83":4,"84":4,"85":5,"134":1,"143":1,"145":1,"147":1,"149":1,"150":1,"154":1,"167":1,"188":1,"202":1,"212":3,"213":3,"214":3,"220":1,"226":2,"227":8,"228":8,"229":7,"234":1,"290":3,"304":1,"308":1,"316":1,"318":2,"319":2,"321":2,"326":1,"332":1,"334":4,"336":1,"379":5,"383":3,"384":4,"386":1,"387":5,"388":3,"389":4,"392":1,"394":10,"402":1,"405":1,"410":2,"414":1,"428":2,"431":2,"432":2,"435":1,"436":1,"437":2,"441":1,"448":2,"449":1,"451":3,"452":3,"453":3,"458":1,"464":2,"465":8,"466":8,"467":7,"472":1}}],["adds",{"2":{"374":1}}],["adddynamic",{"2":{"167":2}}],["addition",{"2":{"50":1,"59":1,"130":1,"154":1,"237":1,"283":1}}],["additionally",{"2":{"26":1,"44":1,"53":1,"61":1,"64":1,"99":1,"143":1,"182":1,"237":1}}],["additional",{"2":{"23":1,"24":1,"37":1,"41":1,"61":1,"62":1,"122":1,"138":1,"184":1,"187":1,"237":1,"342":1,"377":2,"385":1,"408":1,"440":1,"441":2}}],["added",{"2":{"44":1,"158":1,"243":1,"251":1,"253":1,"261":1,"378":1,"430":1}}],["add",{"0":{"71":1,"72":1,"81":1},"2":{"1":1,"3":2,"7":1,"27":1,"80":1,"82":2,"90":1,"99":1,"101":1,"117":1,"129":2,"131":3,"136":1,"137":1,"139":2,"154":1,"155":2,"163":1,"167":1,"179":1,"188":1,"235":4,"242":1,"248":1,"252":1,"259":1,"262":1,"351":1,"358":1,"364":4,"378":2}}],["ai",{"2":{"11":1}}],["absolute",{"2":{"213":1,"452":1}}],["abstracted",{"2":{"150":1}}],["abstraction",{"2":{"8":1,"185":1}}],["abis",{"2":{"150":1,"321":1}}],["abi",{"2":{"66":1,"85":1,"145":1,"147":1,"149":1,"150":5,"316":3,"317":1,"318":1,"321":1,"322":1,"387":4,"415":1,"429":1,"430":1,"431":2}}],["ability",{"2":{"66":1,"378":1}}],["about",{"2":{"42":1,"50":1,"55":1,"64":1,"65":1,"73":1,"74":1,"188":1,"283":1,"336":1}}],["above",{"0":{"283":1},"2":{"4":2,"30":1,"43":1,"50":3,"52":1,"72":1,"129":1,"143":2,"144":1,"150":1,"188":1,"213":1,"214":1,"281":1,"282":1,"283":2,"299":1,"302":1,"304":1,"306":1,"308":1,"385":1,"413":1,"414":1,"452":1,"453":1}}],["able",{"2":{"30":1,"49":1,"66":1,"131":1,"177":1,"187":3,"204":1,"207":1,"210":1,"353":2,"378":1,"413":1}}],["audits",{"0":{"419":1},"1":{"420":1,"421":1,"422":1},"2":{"419":1}}],["audited",{"2":{"351":1}}],["audio",{"2":{"4":2}}],["auto",{"2":{"375":1}}],["autoconnect",{"2":{"243":1,"283":2}}],["automatic",{"0":{"446":1},"2":{"74":1,"446":1}}],["automatically",{"2":{"8":1,"33":3,"49":1,"102":1,"127":1,"129":2,"131":1,"133":1,"173":1,"192":1,"197":1,"201":1,"202":1,"213":3,"237":1,"330":1,"371":1,"429":1,"432":1,"434":1,"452":3}}],["authorizationmessage",{"2":{"221":2,"222":1,"459":2,"460":1}}],["authorization",{"0":{"221":1,"222":1,"459":1,"460":1},"2":{"214":1,"453":1}}],["authorized",{"2":{"222":2,"460":2}}],["authorizenonce",{"0":{"195":1},"2":{"195":2}}],["authorize",{"0":{"194":1},"2":{"188":1,"194":2,"213":2,"217":2,"221":1,"452":2,"455":2,"459":1}}],["authfailure",{"2":{"167":2}}],["authsuccess",{"2":{"167":3,"168":1,"169":1,"174":1}}],["authrequirescode",{"2":{"167":3,"168":1}}],["authenticating",{"2":{"352":1}}],["authentication",{"0":{"133":1,"166":1,"168":1,"169":1,"170":1},"1":{"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"167":1,"168":1,"169":1,"170":1},"2":{"90":1,"113":1,"114":1,"133":4,"167":1,"168":1,"169":1,"172":1,"184":1,"217":1,"358":1,"375":1,"433":1,"441":1,"455":1}}],["authenticator",{"2":{"167":3,"168":1}}],["authenticates",{"2":{"353":1}}],["authenticated",{"2":{"92":1,"360":1}}],["authenticate",{"0":{"211":1,"213":1,"214":1,"450":1,"452":1,"453":1},"1":{"212":1,"213":1,"214":1,"451":1,"452":1,"453":1},"2":{"7":1,"213":2,"214":1,"352":1,"433":1,"452":2,"453":1}}],["auth",{"0":{"351":1,"436":1},"2":{"66":2,"72":1,"77":1,"85":2,"165":1,"167":1,"168":1,"173":1,"174":2,"177":1,"191":1,"201":1,"214":1,"351":1,"352":1,"353":2,"433":2,"434":1,"436":4,"439":1,"441":1,"453":1}}],["achieves",{"2":{"352":1}}],["achievement",{"0":{"15":1,"16":1}}],["act",{"2":{"217":1,"455":1}}],["actor",{"2":{"165":2,"172":1,"374":1,"377":1,"378":1}}],["acting",{"2":{"374":1}}],["active",{"2":{"438":1}}],["activities",{"2":{"379":2}}],["activity",{"2":{"139":4,"210":1,"377":1,"379":1}}],["activate",{"2":{"272":2}}],["activated",{"2":{"272":1}}],["activation",{"0":{"272":1}}],["actions",{"2":{"217":1,"352":1,"446":1,"455":1}}],["action",{"2":{"139":8,"188":1,"217":1,"223":1,"338":1,"352":1,"444":2,"446":1,"455":1,"461":1}}],["actually",{"2":{"225":1,"463":1}}],["actual",{"2":{"7":1,"83":1,"188":1,"213":1,"235":1,"364":1,"452":1}}],["across",{"2":{"26":1,"33":1,"59":1}}],["acquire",{"2":{"7":1,"83":1,"91":1,"163":1,"359":1}}],["acc36ed4ef40db74137266e48d863083a5c7e85e2735d69adafcb5b362b6cfc0",{"2":{"448":2}}],["accelerate",{"2":{"180":1,"186":1}}],["accepted",{"2":{"188":1}}],["accepts",{"2":{"143":1,"317":1}}],["accepting",{"2":{"75":1,"141":1}}],["accessing",{"2":{"448":1}}],["accessible",{"2":{"4":2,"51":1,"375":1}}],["accessed",{"2":{"296":1,"349":1}}],["access",{"2":{"3":3,"7":2,"11":1,"22":1,"23":3,"24":1,"25":1,"27":1,"30":1,"31":1,"32":2,"33":1,"36":1,"37":2,"38":1,"39":1,"40":1,"41":1,"43":2,"46":2,"56":2,"57":3,"66":2,"72":1,"77":2,"80":8,"81":1,"85":1,"91":1,"92":1,"100":1,"101":1,"124":1,"132":1,"133":1,"145":1,"147":1,"149":1,"160":1,"163":1,"187":3,"188":2,"204":2,"351":3,"353":3,"359":1,"360":1,"376":2,"378":1,"423":1,"434":1,"435":1,"436":1,"437":1,"438":1,"448":1,"449":1}}],["accurately",{"2":{"33":1}}],["accounts",{"0":{"343":1},"1":{"344":1,"345":1},"2":{"135":1,"342":1,"343":2,"437":4}}],["accountaddresses",{"2":{"37":1}}],["accountaddress",{"2":{"23":7,"24":6,"28":2,"32":6,"37":4,"39":2}}],["account",{"0":{"3":1},"2":{"2":2,"3":2,"23":5,"24":4,"28":1,"32":4,"37":5,"66":3,"72":2,"73":2,"75":1,"76":1,"77":4,"85":1,"141":1,"185":1,"188":1,"213":1,"234":1,"249":1,"258":1,"326":1,"329":1,"351":1,"375":3,"378":1,"433":1,"434":1,"452":1,"472":1}}],["aggregating",{"2":{"6":1}}],["against",{"2":{"62":1,"353":2,"378":1,"386":2,"402":1,"410":1}}],["again",{"2":{"3":1,"179":2,"196":1,"333":1,"375":1}}],["aka",{"0":{"32":1},"2":{"4":1}}],["atomic",{"2":{"404":1}}],["attested",{"2":{"351":1}}],["attempts",{"2":{"281":1}}],["attempting",{"2":{"174":1}}],["attempt",{"2":{"129":1,"131":1,"256":1,"265":1,"266":1,"274":1}}],["attacks",{"2":{"436":1}}],["attacker",{"2":{"353":2,"376":1}}],["attackers",{"2":{"351":1}}],["attached",{"2":{"133":1,"158":1}}],["attach",{"2":{"50":1,"165":1}}],["attributes",{"0":{"63":1,"332":1},"2":{"50":1,"61":6,"62":1,"63":6,"325":1,"332":1}}],["at",{"2":{"4":1,"23":1,"50":2,"66":1,"67":1,"75":1,"87":1,"97":1,"126":1,"132":2,"160":2,"164":1,"179":2,"184":1,"213":1,"240":1,"293":1,"294":1,"298":4,"304":2,"308":2,"317":1,"319":1,"325":1,"353":1,"355":1,"362":1,"368":1,"370":1,"371":1,"375":1,"390":1,"391":1,"452":1}}],["alpha",{"2":{"158":1}}],["alias",{"2":{"75":2}}],["already",{"2":{"67":1,"97":1,"129":1,"131":2,"139":2,"165":1,"188":1,"201":1,"202":1,"203":1,"210":2,"240":1,"316":1,"334":1,"368":1,"434":1}}],["alternatively",{"2":{"181":1,"186":1,"210":2,"317":1,"319":1}}],["alternative",{"2":{"45":1}}],["alongside",{"2":{"243":1,"253":1}}],["along",{"2":{"26":1,"333":1}}],["always",{"2":{"23":1,"24":1,"37":1,"41":1,"126":1,"160":1,"210":1,"214":1,"336":1,"352":1,"406":1,"407":1,"432":1,"449":1,"453":1}}],["also",{"2":{"4":1,"25":1,"30":2,"42":1,"49":1,"50":1,"55":1,"66":3,"73":1,"74":1,"93":1,"94":1,"122":1,"123":1,"129":1,"130":1,"155":1,"167":1,"177":1,"178":1,"182":1,"188":2,"207":1,"210":1,"231":1,"232":1,"233":1,"235":1,"237":3,"247":1,"257":1,"321":2,"322":1,"341":1,"346":1,"352":1,"353":1,"364":1,"373":1,"402":1,"410":1,"414":1,"436":1,"469":1,"470":1,"471":1}}],["ally",{"2":{"62":1}}],["allowed",{"2":{"352":1,"403":1}}],["allowlists",{"2":{"352":1}}],["allowing",{"2":{"99":1,"150":1,"187":1}}],["allows",{"2":{"49":1,"73":1,"150":1,"151":2,"187":1,"213":3,"283":2,"288":1,"332":1,"341":1,"342":1,"346":1,"373":1,"377":1,"386":1,"392":1,"395":1,"399":1,"452":3}}],["allow",{"2":{"8":3,"80":3,"135":1,"145":1,"147":1,"149":1,"165":1,"187":1,"202":1,"207":1,"349":1,"412":1}}],["all",{"0":{"41":1,"282":1},"2":{"1":1,"3":1,"23":2,"24":1,"30":2,"33":3,"35":4,"37":1,"39":2,"41":2,"73":1,"93":1,"96":1,"115":1,"134":1,"135":1,"145":1,"147":1,"149":1,"150":1,"151":3,"152":1,"173":2,"181":1,"185":2,"186":1,"187":1,"204":1,"214":1,"232":1,"237":2,"239":1,"247":1,"257":1,"281":1,"282":1,"283":2,"284":1,"293":1,"294":1,"322":1,"325":1,"327":1,"328":1,"351":1,"367":1,"370":1,"371":1,"375":1,"378":1,"392":1,"395":1,"402":1,"407":1,"432":1,"453":1,"470":1}}],["arcadeum",{"2":{"419":2}}],["architectures",{"2":{"179":1}}],["architecture",{"0":{"350":1},"1":{"351":1,"352":1},"2":{"4":1}}],["argent",{"2":{"348":1}}],["argument",{"2":{"155":1,"443":1}}],["arguments",{"2":{"30":1,"133":1,"317":2}}],["arrive",{"2":{"84":1}}],["array",{"2":{"37":4,"43":1,"56":2,"57":2,"61":1,"63":1,"113":1,"114":1,"151":1,"379":2,"415":1}}],["arbitrum",{"2":{"66":1,"72":1,"340":1,"379":2}}],["arbitrary",{"2":{"62":1,"63":1,"150":1,"317":1,"322":1,"346":1}}],["artstation",{"2":{"62":1}}],["artist",{"2":{"62":1}}],["artists",{"2":{"62":1}}],["armor",{"2":{"62":1}}],["areas",{"2":{"63":1}}],["are",{"0":{"181":1,"184":1,"185":1,"385":1},"2":{"3":1,"8":3,"23":1,"24":1,"25":1,"30":5,"35":1,"37":1,"41":1,"49":1,"59":1,"63":1,"64":2,"77":1,"80":1,"85":1,"113":1,"114":1,"115":2,"123":1,"132":1,"133":1,"135":1,"143":2,"145":1,"147":1,"148":1,"149":1,"150":3,"151":1,"154":1,"155":1,"167":2,"168":1,"174":3,"175":1,"183":1,"185":1,"187":2,"188":1,"189":1,"217":2,"234":2,"237":1,"242":1,"248":1,"249":1,"250":1,"258":1,"259":1,"283":1,"286":1,"289":1,"295":1,"297":2,"298":1,"317":1,"318":1,"332":1,"336":1,"341":1,"343":2,"346":3,"350":2,"352":1,"353":3,"373":1,"375":3,"376":1,"378":1,"379":2,"385":1,"386":1,"389":1,"390":1,"393":1,"401":3,"402":1,"403":1,"405":1,"413":2,"414":1,"419":1,"423":1,"425":1,"426":1,"427":1,"428":1,"430":1,"432":1,"434":1,"436":1,"437":1,"446":1,"447":1,"448":1,"449":1,"455":2,"472":2}}],["arise",{"2":{"0":1}}],["after",{"2":{"3":1,"75":1,"80":1,"126":1,"139":1,"158":1,"160":1,"167":3,"169":1,"172":1,"179":1,"188":1,"197":2,"326":1,"379":1,"391":1}}],["apk",{"2":{"139":2}}],["ape",{"2":{"61":2}}],["appprops",{"2":{"283":1}}],["appprotocol",{"0":{"191":1}}],["appropriate",{"2":{"132":1,"150":1,"158":1,"248":1,"259":1,"315":1,"317":1}}],["approach",{"2":{"66":1,"142":1,"153":1,"154":1,"175":1}}],["applied",{"2":{"426":1}}],["applicable",{"2":{"260":2}}],["application",{"2":{"6":1,"23":2,"24":2,"32":2,"37":2,"39":2,"41":2,"43":2,"49":1,"56":2,"57":4,"75":1,"83":1,"84":1,"96":1,"97":1,"98":1,"100":1,"132":1,"135":2,"139":4,"154":1,"172":1,"177":4,"216":1,"217":1,"224":1,"239":1,"240":1,"249":1,"258":1,"282":4,"283":1,"340":1,"349":1,"367":1,"368":1,"379":3,"433":1,"436":2,"454":1,"455":1,"462":1}}],["applications",{"0":{"238":1,"366":1},"1":{"239":1,"367":1},"2":{"0":1,"30":1,"95":1,"213":1,"214":1,"217":2,"238":1,"284":1,"351":1,"366":1,"452":1,"453":1,"455":2}}],["apply",{"2":{"158":3}}],["appleid",{"2":{"378":1}}],["applevision",{"2":{"179":1}}],["apple",{"0":{"436":1},"2":{"113":1,"135":1,"201":1,"203":1,"435":1,"436":1}}],["appname",{"0":{"266":1,"275":1},"2":{"100":1,"101":1,"124":1,"263":1,"271":3,"275":1}}],["app`",{"2":{"85":1}}],["appear",{"2":{"150":1}}],["appears",{"2":{"61":1,"123":1,"150":1}}],["appended",{"2":{"333":1}}],["append",{"2":{"7":1,"389":1}}],["apps",{"2":{"33":1,"155":1,"178":1}}],["app",{"0":{"190":1,"283":1},"2":{"4":8,"7":1,"23":3,"24":3,"26":2,"27":1,"28":2,"32":3,"37":3,"39":3,"41":3,"43":2,"46":2,"47":1,"50":4,"52":6,"54":1,"56":2,"57":4,"61":2,"62":1,"74":1,"76":1,"77":1,"80":1,"84":1,"85":2,"100":4,"101":3,"104":1,"105":1,"117":2,"124":4,"139":1,"157":1,"179":2,"187":1,"188":2,"190":3,"213":1,"214":1,"237":1,"243":2,"245":1,"246":1,"249":5,"250":5,"253":2,"255":1,"256":1,"258":5,"260":4,"263":1,"266":1,"271":1,"276":1,"281":2,"282":1,"283":3,"284":1,"336":2,"340":1,"351":1,"353":1,"370":1,"371":1,"379":2,"436":1,"452":1,"453":1}}],["apis",{"2":{"80":1,"84":1,"130":1,"180":1,"181":3,"182":2,"349":1}}],["api",{"0":{"1":1,"2":1,"8":1,"22":1,"49":1,"171":1,"172":1,"173":1,"175":1,"340":1},"1":{"3":1,"4":1,"5":1,"23":1,"24":1,"50":1,"51":1,"52":1,"53":1,"54":1,"172":1,"173":1,"174":1,"175":1},"2":{"1":3,"2":4,"3":6,"4":1,"8":1,"22":1,"23":2,"25":3,"26":4,"27":1,"31":1,"32":1,"33":4,"36":1,"37":1,"38":1,"40":1,"43":1,"45":5,"46":2,"49":3,"51":1,"53":1,"54":1,"56":1,"74":2,"75":1,"80":5,"91":1,"126":1,"130":1,"132":2,"134":1,"160":1,"163":1,"165":1,"172":5,"174":1,"182":1,"296":1,"339":1,"340":1,"359":1,"379":3,"380":1,"435":1,"449":1}}],["announced",{"2":{"190":1}}],["another",{"2":{"23":1,"26":1,"43":1,"50":1,"53":1,"56":1,"57":2,"61":1,"352":1,"375":1,"379":1,"383":1}}],["animation",{"2":{"4":2}}],["an",{"0":{"9":1,"17":1,"77":1,"281":1,"340":1},"1":{"78":1,"79":1},"2":{"4":5,"23":2,"24":1,"27":1,"30":1,"32":1,"35":1,"37":1,"39":1,"41":1,"43":2,"46":1,"49":1,"54":1,"56":2,"57":1,"61":2,"62":3,"63":2,"66":1,"73":2,"74":1,"75":2,"77":2,"84":1,"85":1,"94":1,"104":1,"123":4,"129":1,"133":1,"134":1,"135":1,"142":2,"143":1,"144":3,"145":2,"146":3,"147":2,"148":3,"149":2,"150":4,"152":1,"153":2,"154":2,"155":2,"158":1,"164":1,"165":2,"168":1,"175":1,"177":1,"181":1,"185":1,"187":2,"194":1,"195":1,"202":1,"206":1,"210":1,"213":2,"214":1,"216":1,"226":1,"227":2,"228":2,"233":1,"237":1,"248":1,"249":2,"258":2,"259":1,"266":1,"267":2,"279":1,"281":1,"283":3,"287":1,"288":2,"293":2,"294":2,"295":1,"316":1,"317":2,"318":3,"319":1,"321":2,"322":1,"326":1,"332":1,"349":2,"352":1,"353":2,"375":1,"376":1,"379":4,"383":1,"392":1,"401":1,"402":1,"407":1,"427":1,"428":2,"432":1,"433":1,"434":1,"435":6,"438":1,"440":1,"443":1,"444":1,"449":3,"452":2,"453":1,"454":1,"464":1,"465":2,"466":2,"471":1}}],["android=",{"2":{"139":2}}],["androidmanifest",{"2":{"139":1}}],["android",{"0":{"139":1},"2":{"127":1,"139":41,"161":1,"176":1,"177":3}}],["and",{"0":{"4":1,"23":2,"24":2,"75":1,"77":1,"179":1,"185":1,"189":1,"219":1,"282":1,"283":2,"325":1,"335":1,"417":1,"457":1},"1":{"76":1,"78":1,"79":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1},"2":{"0":1,"1":3,"2":4,"3":5,"4":6,"6":1,"7":3,"8":4,"24":1,"25":2,"26":5,"29":1,"30":5,"33":11,"37":1,"41":1,"42":1,"45":1,"48":1,"49":3,"50":6,"51":1,"53":1,"55":2,"59":3,"61":1,"62":1,"63":8,"64":2,"65":1,"67":1,"73":1,"74":5,"75":4,"76":1,"77":3,"80":6,"83":4,"84":5,"85":6,"90":1,"91":1,"93":1,"94":1,"95":1,"96":3,"98":1,"99":2,"104":1,"113":1,"114":1,"118":1,"122":1,"123":1,"124":1,"125":1,"126":2,"129":2,"130":3,"131":4,"132":4,"133":3,"134":2,"136":1,"137":1,"139":4,"141":1,"142":4,"143":4,"144":1,"145":2,"146":1,"147":2,"148":1,"149":2,"150":4,"151":1,"153":1,"154":4,"155":3,"157":1,"158":3,"159":1,"160":2,"164":1,"165":1,"167":1,"168":1,"169":1,"172":2,"175":1,"176":1,"177":3,"179":4,"180":1,"181":5,"182":2,"183":1,"184":3,"185":1,"186":3,"187":6,"188":5,"192":2,"194":1,"198":1,"208":1,"210":2,"213":3,"214":1,"217":3,"220":1,"224":1,"229":1,"232":1,"233":1,"235":1,"237":2,"238":1,"239":3,"243":1,"250":1,"253":1,"256":1,"272":1,"278":1,"281":4,"282":2,"283":7,"284":1,"285":1,"291":1,"292":1,"293":2,"294":2,"295":1,"296":1,"297":1,"298":1,"299":1,"302":1,"304":1,"306":1,"308":1,"309":1,"314":1,"315":1,"316":2,"317":3,"319":2,"321":2,"322":2,"325":1,"326":2,"329":1,"330":1,"332":1,"333":2,"334":1,"335":2,"336":1,"341":1,"342":1,"346":1,"349":3,"351":4,"352":5,"358":1,"359":1,"366":1,"367":3,"373":1,"375":3,"377":1,"378":5,"379":1,"380":1,"381":1,"384":1,"386":3,"388":1,"396":2,"402":1,"406":1,"407":1,"410":1,"412":1,"413":2,"414":1,"415":2,"419":1,"423":1,"424":2,"425":1,"427":2,"428":1,"430":5,"434":1,"436":4,"437":1,"442":2,"449":1,"452":3,"453":1,"455":3,"458":1,"462":1,"467":1,"470":1,"471":1}}],["anywhere",{"2":{"142":1,"153":1,"154":1}}],["anyway",{"2":{"72":1}}],["anyone",{"2":{"84":1,"351":1}}],["anything",{"2":{"30":1,"188":1}}],["any",{"0":{"23":1,"37":1,"39":1,"43":1,"56":1,"209":1},"2":{"0":1,"8":2,"23":1,"24":1,"25":1,"30":1,"32":1,"33":1,"35":3,"37":3,"39":4,"41":4,"42":2,"49":1,"50":2,"55":4,"63":2,"66":3,"67":1,"72":1,"73":1,"75":1,"80":6,"92":1,"126":1,"130":1,"131":1,"133":1,"145":1,"147":1,"149":1,"150":1,"151":1,"159":1,"160":1,"167":1,"172":2,"187":3,"188":1,"210":1,"214":1,"318":1,"321":1,"322":1,"333":1,"334":1,"353":1,"360":1,"370":1,"371":1,"385":2,"401":2,"408":1,"419":1,"425":1,"427":1,"429":1,"430":1,"432":1,"436":1,"438":2,"447":1,"448":1,"449":1,"453":1}}],["answered",{"2":{"75":1}}],["answer",{"2":{"0":2,"435":2}}],["asking",{"2":{"213":1,"441":1,"452":1}}],["ask",{"0":{"212":1,"451":1},"2":{"198":1,"226":1,"464":1}}],["askforemail",{"0":{"198":1},"2":{"198":2}}],["asks",{"2":{"130":1}}],["aspects",{"2":{"433":1}}],["aspect",{"2":{"188":2,"200":1}}],["asequencebackendmanager",{"2":{"167":1}}],["assigned",{"2":{"391":2}}],["assistance",{"2":{"23":1,"43":1,"56":1,"57":2,"379":1}}],["assured",{"2":{"351":1}}],["assuming",{"2":{"172":1}}],["assumes",{"2":{"188":1}}],["assume",{"2":{"67":1}}],["assembled",{"2":{"317":1}}],["assets",{"2":{"4":1,"50":3,"62":1,"78":1,"115":5,"129":1,"130":2,"132":2,"139":1,"158":1,"181":3,"184":1}}],["assetid",{"2":{"4":2}}],["assetidorassettype",{"2":{"4":1}}],["assettype",{"2":{"4":3}}],["asset",{"2":{"4":6,"61":1,"62":1}}],["asstring",{"2":{"295":2}}],["associated",{"2":{"220":1,"415":1,"458":1}}],["association",{"2":{"133":1}}],["asynchronous",{"2":{"142":1,"153":1,"154":1,"284":1}}],["async",{"2":{"7":1,"66":2,"72":1,"77":1,"80":5,"85":2,"120":1,"142":1,"153":1,"154":1,"272":2,"284":1,"317":1,"379":1,"436":3}}],["as",{"0":{"236":1,"365":1},"2":{"0":2,"3":3,"4":2,"8":1,"26":3,"30":2,"43":1,"49":2,"50":2,"52":1,"53":2,"56":1,"57":1,"61":1,"62":1,"63":4,"64":1,"72":1,"75":2,"80":4,"84":1,"85":1,"91":1,"92":1,"94":1,"96":1,"99":1,"100":1,"101":1,"113":1,"114":1,"123":2,"130":2,"131":2,"133":1,"135":1,"141":2,"142":1,"143":5,"144":1,"146":1,"148":2,"150":4,"151":1,"154":1,"155":4,"158":1,"160":1,"168":1,"172":1,"177":2,"180":2,"181":4,"184":3,"185":1,"195":1,"206":1,"210":2,"213":1,"214":2,"217":2,"225":1,"226":2,"227":2,"228":2,"229":1,"233":1,"234":1,"236":1,"239":1,"245":1,"255":1,"272":1,"274":1,"281":1,"288":1,"293":1,"294":1,"296":1,"297":1,"298":1,"299":1,"302":1,"304":1,"306":1,"307":1,"308":1,"316":2,"317":2,"319":3,"321":1,"322":1,"325":1,"326":1,"334":2,"341":1,"342":1,"346":1,"349":1,"350":1,"359":1,"360":1,"365":1,"367":1,"373":1,"378":1,"379":1,"386":1,"389":1,"394":1,"395":1,"413":4,"414":3,"415":1,"419":1,"424":1,"428":1,"429":1,"430":1,"431":3,"432":2,"434":1,"435":4,"443":1,"444":1,"452":1,"453":2,"455":2,"463":1,"464":2,"465":2,"466":2,"467":1,"471":1,"472":1}}],["a",{"0":{"3":1,"7":1,"11":1,"13":1,"14":1,"19":1,"40":1,"41":1,"65":1,"68":1,"74":1,"75":1,"85":1,"87":1,"123":1,"220":1,"229":1,"282":1,"283":1,"338":1,"355":1,"362":1,"458":1,"467":1},"1":{"41":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"75":1,"76":2,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"0":1,"1":2,"2":3,"3":4,"6":1,"7":4,"8":6,"11":2,"23":2,"24":2,"25":1,"26":2,"30":1,"32":2,"33":6,"35":4,"37":7,"39":3,"41":3,"43":2,"45":1,"49":2,"50":6,"51":2,"54":3,"55":1,"56":2,"57":5,"61":2,"62":3,"64":3,"65":1,"66":16,"67":4,"72":5,"73":2,"74":7,"75":4,"76":2,"77":5,"79":1,"80":9,"82":1,"83":2,"84":2,"85":4,"88":1,"91":1,"92":2,"93":1,"95":2,"96":3,"97":1,"100":1,"107":2,"113":2,"114":2,"115":1,"118":1,"120":1,"123":5,"124":1,"125":1,"126":3,"129":4,"130":8,"131":3,"132":5,"133":4,"134":2,"135":2,"139":3,"141":3,"142":6,"143":11,"144":1,"145":4,"147":4,"148":1,"149":4,"150":8,"151":5,"152":1,"153":2,"154":8,"155":6,"156":1,"158":3,"159":1,"160":4,"164":2,"165":6,"167":4,"168":2,"172":2,"173":3,"174":1,"175":1,"177":1,"179":5,"180":1,"181":4,"182":4,"184":4,"185":2,"186":1,"187":6,"188":4,"189":1,"196":1,"200":2,"201":1,"206":1,"208":2,"210":1,"213":6,"214":2,"216":1,"217":7,"220":1,"221":1,"223":1,"224":1,"225":2,"226":4,"227":3,"228":3,"229":1,"232":1,"234":4,"235":3,"236":1,"237":2,"238":2,"239":3,"240":1,"241":1,"246":1,"247":1,"250":4,"251":1,"256":1,"257":1,"260":3,"261":1,"275":1,"276":1,"277":1,"282":3,"283":10,"284":1,"286":1,"287":4,"288":3,"289":1,"293":5,"294":5,"295":2,"296":7,"297":2,"298":3,"299":1,"300":1,"302":2,"304":3,"305":1,"306":1,"308":2,"309":2,"310":1,"312":1,"313":1,"314":1,"315":1,"316":6,"317":7,"318":1,"319":4,"320":1,"321":3,"322":1,"324":1,"325":2,"327":1,"328":1,"334":1,"335":1,"338":1,"339":1,"341":1,"342":1,"343":1,"349":1,"350":2,"351":6,"352":2,"353":1,"356":1,"359":1,"360":2,"363":1,"364":2,"365":1,"366":2,"367":3,"368":1,"373":1,"374":7,"375":5,"377":3,"378":6,"379":4,"381":3,"382":1,"384":1,"385":1,"386":1,"391":2,"393":1,"394":1,"395":1,"396":1,"399":1,"401":2,"402":1,"404":2,"406":1,"407":1,"409":1,"410":3,"413":1,"414":2,"423":1,"424":2,"425":1,"426":2,"427":3,"428":2,"429":2,"430":4,"431":4,"433":1,"434":3,"435":3,"436":6,"437":1,"438":1,"440":2,"441":2,"443":2,"444":4,"448":2,"449":2,"452":6,"453":2,"454":1,"455":7,"458":1,"459":1,"461":1,"462":1,"463":2,"464":4,"465":3,"466":3,"467":1,"470":1,"472":4}}],["swapping",{"2":{"175":1}}],["switches",{"2":{"172":1}}],["switch",{"2":{"172":1}}],["switching",{"2":{"133":1}}],["sso",{"0":{"177":1},"2":{"167":1,"169":2}}],["sqnc",{"2":{"165":1}}],["sfts",{"2":{"148":1}}],["smooth",{"2":{"95":1,"96":1,"238":1,"239":1,"366":1,"367":1}}],["smart",{"0":{"317":1,"342":1,"346":1},"1":{"343":1,"344":1,"345":1,"346":1,"347":2,"348":1},"2":{"65":1,"67":2,"141":1,"145":1,"147":1,"149":1,"150":3,"151":3,"154":4,"185":1,"214":1,"235":1,"304":1,"317":2,"318":1,"319":2,"342":2,"346":2,"350":1,"351":1,"383":1,"401":1,"453":1}}],["small",{"2":{"61":1,"225":1,"463":1}}],["sync",{"2":{"426":1}}],["synonymous",{"2":{"419":1}}],["systems",{"2":{"164":1,"172":1}}],["system",{"2":{"90":1,"127":2,"130":1,"131":1,"157":1,"176":1,"342":1,"349":1,"358":1,"433":1}}],["symbol",{"2":{"50":1,"321":2}}],["skipfetchsetup",{"2":{"85":2}}],["skywvr",{"2":{"50":1}}],["skyweavercover",{"2":{"50":1}}],["skyweaver",{"2":{"39":3,"41":3,"50":10,"62":3}}],["shape=",{"2":{"436":1}}],["sha",{"2":{"177":1}}],["share",{"0":{"125":1},"2":{"84":1,"125":1,"198":1}}],["showing",{"2":{"328":1}}],["showcase",{"2":{"181":1}}],["showcases",{"2":{"130":1}}],["shows",{"2":{"172":1}}],["show",{"2":{"172":1,"205":1,"266":1}}],["showauthsuccessdelegate",{"2":{"167":3}}],["showemailinput",{"0":{"112":1}}],["shown",{"2":{"110":1,"111":1,"112":1,"113":1,"114":1,"121":1}}],["should",{"2":{"3":2,"57":1,"63":1,"66":2,"75":1,"76":1,"82":1,"83":1,"84":3,"85":1,"123":1,"129":1,"131":1,"200":1,"224":1,"235":1,"284":2,"299":1,"302":1,"304":1,"306":1,"308":1,"321":1,"325":1,"326":1,"332":1,"333":1,"364":1,"376":1,"404":1,"407":4,"409":1,"432":1,"444":1,"462":1}}],["src=",{"2":{"236":2,"365":2}}],["src",{"2":{"80":1}}],["snippets",{"2":{"186":1}}],["snippet",{"2":{"77":1,"141":1,"143":1,"144":1,"146":1,"148":1,"150":1,"154":1,"214":1,"296":1,"453":1}}],["slot",{"2":{"394":5}}],["sleepy",{"2":{"61":1}}],["slightly",{"2":{"59":1}}],["sdk",{"0":{"90":1,"95":1,"358":1},"1":{"96":1},"2":{"57":1,"66":1,"90":3,"92":1,"93":1,"126":2,"130":4,"131":6,"132":2,"133":1,"134":1,"139":5,"141":1,"145":1,"147":1,"149":1,"151":1,"152":1,"155":2,"160":3,"173":1,"184":1,"214":1,"232":1,"235":2,"237":1,"286":1,"358":3,"360":1,"364":2,"433":1,"435":3,"436":2,"449":1,"453":1,"470":1}}],["sdks",{"2":{"26":1,"29":1,"48":1,"53":1,"90":1,"91":1,"186":1,"237":1,"358":1,"359":1,"430":1}}],["salt",{"2":{"386":1,"389":1,"390":1,"402":1,"424":1,"432":2}}],["sale",{"2":{"379":1}}],["sardine",{"2":{"341":1,"373":1}}],["savings",{"2":{"151":1}}],["saves",{"2":{"158":1}}],["save",{"2":{"6":1,"75":1,"130":1}}],["safeguarding",{"2":{"376":1}}],["safeguards",{"2":{"353":1}}],["safe",{"2":{"348":1,"353":1}}],["safety",{"2":{"322":1}}],["safetransferfrom",{"2":{"66":2,"72":2,"227":5,"228":5,"229":4,"465":5,"466":5,"467":4}}],["safemint",{"2":{"147":2}}],["safer",{"2":{"131":1}}],["say",{"2":{"50":1}}],["same",{"2":{"26":1,"50":1,"63":1,"66":1,"72":1,"148":1,"213":1,"229":1,"245":1,"255":1,"288":1,"407":1,"426":1,"434":1,"452":1,"467":1}}],["samples",{"0":{"130":1},"2":{"129":2,"130":3}}],["sample",{"2":{"26":1,"130":8,"132":1,"156":1,"436":1}}],["sociallogin",{"2":{"167":1,"169":1}}],["socialauthoptions",{"0":{"113":1},"2":{"124":2}}],["social",{"0":{"135":1,"169":1,"170":1,"375":1,"441":1},"1":{"136":1,"137":1,"138":1,"139":1,"140":1,"376":1,"377":1,"378":1},"2":{"96":1,"113":1,"127":2,"129":1,"132":1,"135":2,"141":1,"184":1,"185":1,"239":1,"347":1,"351":1,"367":1,"374":1,"375":3,"378":2,"380":1,"434":1,"435":1,"436":1,"441":1,"442":1}}],["soliditykeccak256",{"2":{"431":3}}],["soliditypack",{"2":{"387":1,"389":2,"431":1}}],["solidity",{"2":{"77":1}}],["solutions",{"2":{"1":1,"27":1,"28":1}}],["so",{"2":{"30":1,"33":1,"64":1,"74":1,"77":2,"123":1,"132":1,"133":2,"150":2,"159":1,"164":1,"167":4,"181":1,"184":1,"214":1,"282":1,"288":1,"316":2,"321":2,"333":1,"346":1,"351":1,"403":1,"405":1,"453":1}}],["sourced",{"2":{"237":1}}],["sources",{"2":{"30":2}}],["source",{"2":{"26":1,"53":1,"80":1,"94":1,"130":1,"150":2,"163":1,"188":1,"233":1,"236":1,"241":1,"251":1,"261":1,"277":1,"351":1,"365":1,"471":1}}],["soon",{"0":{"20":1,"159":1},"2":{"140":1}}],["someone",{"2":{"84":1}}],["sometimes",{"2":{"63":1,"179":1}}],["something",{"2":{"44":1,"141":1,"142":2,"153":1,"154":2,"175":1,"235":1,"325":1,"333":1,"364":1}}],["some",{"2":{"8":1,"43":1,"56":1,"59":1,"63":1,"64":1,"83":2,"84":4,"127":1,"130":3,"131":1,"135":1,"150":1,"154":1,"155":3,"158":1,"175":1,"188":1,"234":1,"281":1,"285":1,"344":1,"434":1,"472":1}}],["space",{"2":{"73":1,"347":1}}],["spaces",{"2":{"73":3}}],["spam",{"0":{"30":1},"2":{"23":1,"24":1,"30":2,"37":1,"41":1}}],["spec",{"2":{"165":1}}],["spectator",{"2":{"165":3}}],["special",{"2":{"154":1,"188":1,"249":1,"258":1,"298":1,"299":1,"302":1,"304":1,"306":1,"308":1}}],["specifying",{"2":{"124":1}}],["specify",{"2":{"37":5,"50":1,"188":1,"189":1,"201":1,"202":1,"203":1,"206":1,"341":1,"373":1}}],["specifies",{"2":{"120":1,"121":1}}],["specified",{"2":{"23":1,"206":1,"207":1,"226":1,"300":1,"302":1,"304":1,"464":1}}],["specifics",{"0":{"179":1}}],["specific",{"2":{"8":1,"23":1,"24":1,"33":1,"37":1,"41":1,"61":1,"62":1,"66":5,"72":1,"77":1,"84":1,"107":1,"135":1,"210":1,"217":1,"235":1,"299":1,"336":1,"364":1,"379":2,"455":1}}],["specs",{"2":{"74":1}}],["speed",{"2":{"65":1,"74":1}}],["spell",{"2":{"62":1}}],["sponsoring",{"0":{"67":1,"79":1},"1":{"68":1,"69":1,"70":1,"71":1,"72":1},"2":{"66":1,"67":1}}],["sponsor",{"0":{"77":1},"1":{"78":1,"79":1},"2":{"8":1,"11":1,"74":1,"79":2}}],["sponsored",{"0":{"72":1},"2":{"8":1,"67":1,"77":1,"85":1}}],["scenario",{"2":{"353":5}}],["scenarios",{"2":{"344":1,"353":1,"430":1}}],["scene",{"2":{"129":1,"130":2,"131":1,"133":1,"155":1,"158":3}}],["scenes",{"2":{"33":1,"315":1}}],["scope",{"2":{"217":1,"413":1,"414":1,"435":1,"455":1}}],["scheme=",{"2":{"139":2}}],["scheme",{"0":{"158":1},"2":{"132":1,"135":2,"136":1,"137":1,"139":3,"158":3}}],["schemes",{"2":{"127":1,"136":1,"137":1}}],["schemas",{"2":{"139":4}}],["schema",{"2":{"26":1,"61":1,"62":1}}],["scan",{"2":{"210":1,"278":1}}],["scanned",{"2":{"210":2}}],["scaffold",{"2":{"80":1}}],["scaling",{"2":{"74":1}}],["scaled",{"2":{"133":1}}],["scaler",{"2":{"133":1}}],["scale",{"2":{"6":1,"133":2}}],["scroll",{"2":{"136":1,"137":1,"333":1,"334":1}}],["scripts",{"2":{"130":1,"154":1}}],["scripting",{"2":{"130":1}}],["script",{"2":{"129":1,"130":1,"158":1,"179":5,"236":5,"365":5}}],["scriptableobject",{"2":{"132":3}}],["scriptable",{"2":{"129":1,"158":3,"296":1}}],["scratch",{"2":{"75":1}}],["screen",{"2":{"3":1,"108":1,"133":1,"190":1,"331":1}}],["s",{"2":{"4":1,"30":1,"49":1,"50":3,"61":1,"62":1,"73":1,"80":2,"93":1,"102":1,"105":1,"113":1,"114":1,"123":2,"126":1,"130":1,"141":1,"150":1,"157":1,"165":1,"169":1,"175":1,"188":1,"192":1,"195":1,"210":1,"212":1,"214":1,"217":2,"221":1,"232":1,"234":1,"266":1,"283":1,"327":1,"334":1,"346":2,"351":1,"352":3,"353":1,"374":1,"376":1,"378":1,"379":2,"382":1,"392":1,"395":1,"396":1,"403":1,"407":1,"409":1,"415":1,"435":1,"441":1,"443":1,"451":1,"453":1,"455":2,"459":1,"470":1,"472":1}}],["sum",{"2":{"424":1,"425":1}}],["summarize",{"2":{"173":1}}],["summary",{"0":{"121":1},"2":{"121":1}}],["suspicious",{"2":{"377":1}}],["sufficient",{"2":{"441":1}}],["sufficiently",{"2":{"66":1}}],["suffix",{"2":{"333":1}}],["suggestgastipcap",{"0":{"311":1},"2":{"311":1}}],["suggestgasprice",{"0":{"310":1},"2":{"310":1}}],["suggested",{"2":{"310":1,"311":1}}],["suggesting",{"2":{"61":1}}],["surf",{"2":{"187":1}}],["sure",{"2":{"26":1,"39":1,"41":1,"75":1,"80":4,"123":1,"139":1,"144":2,"165":1,"167":1}}],["subject",{"2":{"437":2}}],["subdigests",{"2":{"429":1}}],["subdigest",{"0":{"429":1},"2":{"429":3,"431":1}}],["subdomain",{"2":{"83":1,"84":1}}],["subtree",{"0":{"430":1},"2":{"427":1,"430":1}}],["subtle",{"2":{"59":1}}],["sub",{"2":{"235":3,"364":3}}],["submits",{"2":{"291":1,"292":1,"293":1,"294":1}}],["submit",{"2":{"155":1,"159":1,"309":1}}],["submitted",{"2":{"151":1,"293":3,"294":3}}],["subsequent",{"0":{"408":1},"2":{"388":1}}],["subscribe",{"2":{"141":1}}],["substitute",{"2":{"139":2}}],["succeeded",{"2":{"210":1,"448":2,"449":1}}],["success",{"2":{"83":1,"165":1}}],["successfulcontractdeploymentreturn",{"2":{"154":1}}],["successfultransactionreturn",{"2":{"142":1}}],["successfully",{"2":{"134":1,"135":1,"436":1,"448":1}}],["successful",{"0":{"448":1},"2":{"66":2,"72":1,"173":3,"447":1}}],["such",{"2":{"4":2,"50":1,"64":1,"83":1,"96":1,"99":1,"123":1,"181":2,"184":1,"185":1,"213":1,"239":1,"249":1,"258":1,"281":1,"283":1,"353":1,"367":1,"378":2,"444":1,"445":1,"452":1}}],["suite",{"2":{"180":1}}],["suit",{"2":{"63":1,"157":1}}],["supplied",{"2":{"172":1}}],["supplies",{"0":{"41":1},"2":{"35":1,"39":1,"41":3}}],["supplement",{"2":{"130":1}}],["supplying",{"2":{"168":1}}],["supply",{"2":{"35":2}}],["supports",{"2":{"55":1,"94":1,"208":1,"210":2,"233":1,"341":1,"373":1,"471":1}}],["supported",{"0":{"34":1},"2":{"26":1,"34":1,"39":1,"41":1,"49":1,"50":1,"52":1,"59":1,"136":1,"137":1,"179":1,"201":2,"205":1,"245":1,"255":1,"346":1,"374":1,"435":1,"436":1}}],["support",{"0":{"0":1,"234":1,"472":1},"2":{"0":3,"23":1,"27":1,"28":1,"33":2,"43":1,"56":1,"57":2,"61":1,"80":1,"81":1,"122":1,"143":1,"184":2,"187":1,"237":1,"341":1,"347":1,"351":1,"371":1,"373":1,"383":1,"401":1,"412":1,"441":1}}],["super",{"2":{"33":1}}],["storage",{"2":{"217":1,"220":1,"224":1,"386":1,"390":1,"394":2,"432":2,"455":1,"458":1,"462":1}}],["stores",{"2":{"173":1}}],["storedcredentials",{"2":{"174":1}}],["storedcredentialsvalid",{"2":{"167":1}}],["stored",{"2":{"3":1,"164":4,"217":1,"224":1,"374":1,"376":1,"386":1,"394":1,"431":1,"455":1,"462":1}}],["store",{"2":{"3":1,"63":2,"180":1,"181":2,"220":1,"386":1,"390":1,"458":1}}],["style",{"2":{"139":2}}],["styling",{"2":{"107":1}}],["still",{"2":{"126":1,"131":1,"154":1,"155":2,"160":1,"217":1,"234":1,"353":1,"402":1,"437":1,"455":1,"472":1}}],["straightforward",{"2":{"316":1}}],["streamlines",{"2":{"235":1}}],["streamlining",{"2":{"217":1,"455":1}}],["strength",{"2":{"62":1}}],["strictmode",{"2":{"436":2}}],["strictly",{"2":{"316":1}}],["stripe",{"2":{"187":1}}],["stringify",{"2":{"80":3,"379":1}}],["strings",{"2":{"43":1,"56":2,"57":2}}],["string",{"2":{"23":3,"24":4,"32":2,"37":8,"39":2,"41":3,"43":2,"56":3,"57":3,"61":3,"62":1,"63":2,"66":1,"77":1,"80":9,"83":1,"84":1,"85":2,"115":1,"132":1,"143":1,"145":1,"147":1,"149":1,"150":1,"153":1,"154":2,"213":1,"291":1,"293":3,"295":2,"296":1,"298":3,"300":1,"301":1,"303":1,"304":1,"307":2,"309":2,"316":2,"318":5,"320":1,"321":1,"379":15,"401":1,"413":1,"414":2,"431":3,"452":1}}],["structured",{"0":{"414":1},"2":{"414":1}}],["structure",{"2":{"249":2,"250":2,"258":2,"260":2,"281":3,"283":2}}],["structures",{"2":{"61":1}}],["structs",{"2":{"174":1}}],["struct",{"2":{"168":1}}],["stunt",{"2":{"61":1}}],["stud",{"2":{"61":1}}],["step",{"0":{"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1},"2":{"4":1,"67":1,"75":3,"80":1,"84":1,"85":1,"132":1,"182":2,"434":1}}],["steps",{"0":{"97":1,"240":1,"368":1},"2":{"4":2,"67":1,"74":2,"77":1,"83":1,"85":2,"100":1,"117":1,"138":1,"179":1}}],["stay",{"2":{"184":1}}],["standalone",{"2":{"127":2,"161":2}}],["standardized",{"2":{"80":1,"81":1}}],["standard",{"2":{"59":1,"61":1,"63":1,"144":1,"145":1,"146":1,"147":1,"148":2,"149":1,"214":1,"227":1,"228":1,"229":1,"234":2,"237":1,"287":1,"321":1,"371":1,"412":1,"453":1,"465":1,"466":1,"467":1,"472":2}}],["standards",{"0":{"44":1,"59":1,"60":1},"1":{"61":1,"62":1,"63":1,"64":1},"2":{"30":1,"45":2,"55":1,"59":4,"61":1,"187":1}}],["static",{"2":{"152":1,"427":1,"429":3,"431":1}}],["status",{"0":{"442":1},"1":{"443":1,"444":1,"445":1},"2":{"57":1,"66":6,"72":3,"80":10,"102":1,"379":1,"442":1,"448":3}}],["state",{"2":{"3":1,"131":1,"410":1,"426":1,"436":1}}],["startingblocknumber",{"2":{"302":1}}],["starting",{"2":{"123":1,"130":1}}],["starter",{"2":{"75":1}}],["started",{"0":{"35":1,"89":1,"98":1,"182":1,"186":1,"357":1},"1":{"90":1,"91":1,"92":1,"99":1,"358":1,"359":1,"360":1},"2":{"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1,"88":1,"97":1,"99":1,"181":1,"182":2,"186":2,"240":1,"339":1,"356":1,"363":1,"368":1,"370":1,"371":1}}],["start",{"2":{"0":1,"91":1,"92":1,"167":1,"168":2,"169":1,"175":1,"181":1,"359":1,"360":1}}],["stack",{"2":{"0":1,"6":1,"235":2}}],["situations",{"2":{"281":1}}],["situation",{"2":{"234":1,"472":1}}],["site",{"2":{"75":1}}],["size",{"2":{"133":1,"136":1,"137":1}}],["side",{"0":{"214":1,"453":1},"2":{"66":1,"167":1,"179":1,"214":1,"217":1,"222":1,"223":1,"224":1,"234":1,"249":1,"258":1,"353":1,"453":1,"455":1,"460":1,"461":1,"462":1,"472":1}}],["six",{"2":{"62":1}}],["simulation",{"2":{"449":1}}],["simulations",{"2":{"448":1,"449":1}}],["simulating",{"2":{"449":1}}],["similarly",{"2":{"167":1,"271":1,"272":1,"293":1,"294":1,"435":1}}],["similar",{"2":{"59":1,"133":1,"142":1,"165":1,"175":1,"227":1,"228":1,"235":1,"322":1,"414":1,"465":1,"466":1}}],["simply",{"2":{"4":2,"26":1,"49":1,"50":1,"53":1,"130":1,"151":1,"184":1,"317":1,"319":1,"326":1}}],["simpler",{"2":{"213":1,"452":1}}],["simple",{"2":{"1":1,"2":1,"8":1,"25":1,"33":1,"45":1,"49":1,"51":1,"172":1,"187":1,"213":1,"334":1,"344":1,"351":1,"436":1,"452":1}}],["silently",{"2":{"284":1,"445":1}}],["silence",{"2":{"50":1}}],["silvercardid",{"2":{"50":1}}],["silver",{"2":{"50":1,"61":1,"62":3}}],["signtransactions",{"2":{"225":1,"463":1}}],["sign+verify",{"2":{"213":1,"452":1}}],["signedtransactionstring",{"2":{"309":1}}],["signedmessage",{"2":{"295":2}}],["signed",{"0":{"413":1},"2":{"188":2,"201":1,"202":1,"203":1,"213":3,"214":1,"217":1,"225":1,"309":1,"413":3,"414":1,"415":1,"425":1,"452":3,"453":1,"455":1,"463":1}}],["signer2",{"2":{"73":2}}],["signer1",{"2":{"73":2}}],["signerssigner",{"2":{"382":1}}],["signers",{"0":{"385":1},"2":{"73":1,"350":1,"381":1,"382":2,"384":2,"385":2,"387":1,"390":1,"393":1,"395":1,"396":1,"400":1,"401":4,"413":1,"414":1,"424":1,"425":1,"427":1,"428":1,"430":2}}],["signer",{"0":{"351":1,"352":1,"383":1,"428":1},"1":{"384":1,"385":1},"2":{"66":7,"72":4,"77":3,"85":4,"219":2,"221":1,"225":2,"226":4,"227":4,"228":4,"229":4,"383":2,"387":6,"395":1,"427":1,"428":2,"457":2,"459":1,"463":2,"464":4,"465":4,"466":4,"467":4}}],["signmessagereturn",{"2":{"153":1}}],["signmessage",{"0":{"295":1},"2":{"153":3,"221":1,"223":1,"295":2,"413":1,"414":1,"459":1,"461":1}}],["signinwithemail",{"0":{"202":1},"2":{"202":2}}],["signinwith",{"0":{"201":1},"2":{"201":2}}],["signinoptions",{"0":{"203":1},"2":{"188":2,"203":2}}],["signingin",{"2":{"436":1}}],["signing",{"2":{"132":1,"133":1,"153":1,"179":1,"184":1,"194":1,"210":1,"213":1,"217":1,"225":1,"412":1,"413":1,"414":1,"434":2,"444":1,"452":1,"455":1,"463":1}}],["signin",{"0":{"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"169":1,"170":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1},"2":{"109":1,"124":1,"167":1,"434":1,"435":1,"436":1,"437":1,"438":1,"448":1,"449":1}}],["signs",{"2":{"102":1,"135":1,"291":1,"292":1,"293":1,"294":1}}],["signaturevalidation",{"2":{"415":1}}],["signatures",{"0":{"216":1,"414":1,"454":1},"2":{"234":1,"386":1,"395":1,"396":1,"402":1,"413":1,"414":1,"415":5,"423":1,"425":1,"472":1}}],["signature",{"0":{"211":1,"222":1,"224":1,"412":1,"450":1,"460":1,"462":1},"1":{"212":1,"213":1,"214":1,"413":1,"414":1,"415":1,"451":1,"452":1,"453":1},"2":{"74":1,"150":2,"153":1,"213":1,"214":1,"221":1,"222":2,"224":3,"295":1,"316":1,"317":1,"382":1,"383":1,"386":1,"412":1,"413":2,"414":2,"415":8,"424":1,"427":2,"429":3,"430":1,"432":1,"452":1,"453":1,"459":1,"460":2,"462":3}}],["signals",{"2":{"73":1}}],["sign",{"0":{"109":1,"134":1,"135":1,"153":1,"221":1,"223":1,"434":2,"435":2,"459":1,"461":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"136":1,"137":1,"138":1,"139":1,"140":1,"435":2,"436":2},"2":{"22":1,"25":1,"31":1,"33":1,"36":1,"38":1,"40":1,"66":1,"77":1,"102":1,"109":1,"110":1,"111":1,"112":1,"113":1,"127":2,"129":1,"132":1,"134":1,"135":2,"141":1,"153":1,"188":1,"198":1,"201":1,"202":1,"203":1,"213":2,"216":1,"221":1,"223":1,"295":1,"331":1,"333":1,"335":1,"350":1,"352":1,"423":1,"430":1,"434":1,"435":1,"452":2,"454":1,"459":1,"461":1}}],["signup",{"2":{"11":1}}],["singlesigner",{"2":{"66":2,"72":1,"77":1,"85":1}}],["single",{"2":{"6":1,"8":1,"50":1,"54":1,"64":1,"85":1,"148":1,"151":1,"226":3,"227":2,"228":2,"229":1,"235":1,"293":1,"294":1,"327":1,"343":1,"364":1,"374":1,"431":2,"464":3,"465":2,"466":2,"467":1}}],["since",{"2":{"3":1,"130":1,"151":1,"167":1,"306":1,"321":1,"376":1,"406":1,"407":1}}],["sepolia",{"2":{"340":1,"379":2}}],["separate",{"2":{"326":1}}],["separated",{"2":{"50":1}}],["several",{"2":{"235":1,"364":1}}],["self",{"2":{"393":1,"401":1,"406":1}}],["selling",{"2":{"181":2}}],["selector",{"2":{"415":1}}],["selects",{"2":{"210":1}}],["selecting",{"2":{"77":1,"283":1}}],["selectfee",{"2":{"66":1,"72":1}}],["select",{"2":{"66":1,"77":1,"84":1,"136":2,"137":2,"179":1,"186":1,"330":1}}],["selectwallet",{"2":{"66":1}}],["series",{"2":{"167":1}}],["serves",{"2":{"130":1}}],["servers",{"2":{"141":1,"377":1}}],["serverprivatekey",{"2":{"66":2,"72":1}}],["serverless",{"0":{"19":1,"74":1},"1":{"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"74":1,"336":1}}],["server",{"0":{"65":1,"66":1,"67":1,"214":1,"453":1},"1":{"66":1,"67":1,"68":2,"69":2,"70":2,"71":2,"72":2,"73":1},"2":{"4":2,"26":1,"33":1,"65":1,"66":6,"72":3,"77":2,"214":2,"222":1,"224":1,"234":1,"249":1,"258":1,"281":2,"283":1,"453":2,"460":1,"462":1,"472":1}}],["services",{"2":{"30":2,"63":1,"234":1,"472":1}}],["service",{"0":{"3":1},"2":{"1":1,"2":4,"3":2,"4":1,"8":1,"11":1,"22":1,"25":1,"30":1,"31":1,"33":3,"36":1,"38":1,"40":1,"45":2,"49":3,"51":1,"53":2,"55":1,"57":1,"59":1,"155":1,"296":1,"349":1,"351":1,"352":1}}],["semi",{"2":{"148":1,"426":1}}],["semantic",{"2":{"126":1,"160":1}}],["sessionid",{"2":{"434":1,"438":1}}],["sessionhash",{"2":{"434":3,"435":2,"436":6}}],["sessionaddress",{"2":{"220":1,"224":1,"458":1,"462":1}}],["sessionwallet",{"2":{"220":2,"223":1,"458":2,"461":1}}],["sessionprivatekey",{"2":{"220":4,"458":4}}],["sessionsignature",{"2":{"223":1,"224":1,"461":1,"462":1}}],["sessions",{"0":{"437":1},"2":{"214":2,"434":1,"437":4,"438":2,"453":2}}],["sessionsettings",{"2":{"85":2}}],["session",{"0":{"217":1,"218":1,"220":1,"223":1,"224":1,"376":1,"433":1,"438":1,"443":1,"445":1,"446":1,"455":1,"456":1,"458":1,"461":1,"462":1},"1":{"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"434":1,"435":1,"436":1,"437":1,"438":1,"444":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1},"2":{"66":14,"72":6,"73":2,"75":1,"77":5,"85":5,"133":1,"134":1,"173":2,"174":1,"210":1,"216":1,"217":4,"221":1,"222":2,"223":1,"224":5,"351":2,"375":4,"376":2,"377":1,"433":1,"435":3,"436":5,"438":4,"442":1,"443":2,"444":3,"445":3,"446":2,"448":1,"449":1,"454":1,"455":4,"459":1,"460":2,"461":1,"462":5}}],["seamless",{"2":{"74":1,"87":1,"125":1,"181":1,"185":1,"213":1,"352":1,"355":1,"452":1}}],["seamlessly",{"0":{"238":1,"366":1},"1":{"239":1,"367":1},"2":{"33":1,"96":1,"239":1,"367":1}}],["seaman",{"2":{"61":1}}],["senttransactionresponse",{"2":{"448":1}}],["sent",{"2":{"229":1,"334":1,"448":1,"449":2,"467":1}}],["sensical",{"2":{"59":1}}],["sends",{"2":{"332":1,"440":1,"445":1}}],["sendquery",{"2":{"319":3}}],["sendrawtransaction",{"0":{"309":1},"2":{"309":1}}],["senderc1155values",{"2":{"148":3,"151":2}}],["senderc1155",{"0":{"148":1},"1":{"149":1},"2":{"148":1,"151":1}}],["senderc721",{"0":{"146":1},"1":{"147":1},"2":{"146":1,"151":1}}],["senderc20",{"0":{"144":1},"1":{"145":1},"2":{"144":1,"151":1,"444":1}}],["senderaddress",{"2":{"66":1,"72":1}}],["sending",{"0":{"225":1,"226":1,"227":1,"228":1,"229":1,"463":1,"464":1,"465":1,"466":1,"467":1},"2":{"73":1,"142":1,"151":2,"154":1,"227":2,"228":2,"321":1,"434":1,"444":1,"447":1,"449":1,"465":2,"466":2}}],["sendtransactionmethod",{"2":{"317":1}}],["sendtransactionmethodandwaitforreceipt",{"2":{"317":2,"321":1}}],["sendtransactionandwaitforreceipt",{"0":{"292":1},"2":{"292":1,"294":1,"315":1,"317":2,"321":1}}],["sendtransactionbatchandwaitforreceipts",{"0":{"294":1}}],["sendtransactionbatch",{"0":{"293":1},"2":{"227":1,"228":1,"293":1,"465":1,"466":1}}],["sendtransaction",{"0":{"291":1},"2":{"66":1,"72":1,"73":3,"85":1,"142":2,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":2,"151":2,"154":1,"225":2,"226":2,"227":1,"228":1,"229":2,"291":1,"445":1,"446":1,"448":1,"449":2,"463":2,"464":2,"465":1,"466":1,"467":2}}],["send",{"2":{"8":1,"66":2,"67":1,"72":1,"73":2,"143":2,"144":1,"145":1,"146":1,"147":1,"148":2,"149":1,"150":1,"168":1,"226":3,"227":2,"228":2,"317":1,"319":1,"321":1,"435":2,"441":1,"443":1,"464":3,"465":2,"466":2}}],["sequentially",{"2":{"65":1,"293":1,"294":1}}],["sequentual",{"2":{"65":1}}],["sequenceonboard",{"2":{"263":2}}],["sequenceoptions",{"2":{"263":1}}],["sequencemodule",{"2":{"263":2}}],["sequencemetadata",{"2":{"43":2,"46":2,"56":2,"57":4}}],["sequencewallet",{"2":{"253":2}}],["sequencewaas",{"2":{"92":2,"360":2,"434":2,"435":2,"436":2,"437":2,"438":2,"448":1,"449":1}}],["sequenceutils",{"2":{"418":1}}],["sequenceunreal",{"2":{"179":2}}],["sequenceui",{"2":{"165":1}}],["sequencebackendmanager",{"2":{"167":3}}],["sequenceplugin",{"2":{"163":2,"165":4}}],["sequencecontext",{"2":{"418":1}}],["sequenceconnector",{"2":{"243":2,"271":2,"272":3}}],["sequenceconfig",{"2":{"129":1,"132":4,"136":1,"137":1,"139":1,"296":1}}],["sequencecanvas",{"2":{"158":1}}],["sequencesdk",{"2":{"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":2,"151":1}}],["sequenceethclient",{"2":{"296":2,"297":1}}],["sequenceethereum",{"2":{"126":1,"145":1,"147":1,"149":1,"284":3,"285":1,"286":1,"288":1,"296":1,"318":1}}],["sequenceencryptor",{"2":{"164":1}}],["sequenceexamples",{"2":{"133":1,"155":2}}],["sequenceapiclient",{"2":{"80":1}}],["sequenceindexer",{"2":{"23":2,"24":2,"27":2,"32":2,"37":2,"39":2,"41":2}}],["sequencekit",{"0":{"12":1,"95":1},"1":{"96":1},"2":{"185":1,"362":1,"363":1}}],["sequence",{"0":{"67":1,"98":1,"99":1,"122":1,"172":1,"173":1,"175":1,"183":1,"209":1,"218":1,"219":1,"230":1,"238":1,"323":1,"329":1,"349":1,"351":1,"352":1,"366":1,"456":1,"457":1,"468":1},"1":{"68":1,"69":1,"70":1,"71":1,"72":1,"99":1,"123":1,"184":1,"185":1,"186":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"231":1,"232":1,"233":1,"234":1,"239":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"350":1,"351":1,"352":1,"353":1,"367":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"469":1,"470":1,"471":1,"472":1},"2":{"0":2,"1":2,"2":2,"4":8,"5":2,"6":1,"7":1,"8":5,"11":1,"22":3,"23":7,"24":6,"25":5,"26":5,"27":3,"28":4,"29":3,"30":6,"31":3,"32":6,"33":6,"36":3,"37":6,"38":3,"39":7,"40":3,"41":6,"42":2,"43":5,"45":2,"46":2,"47":2,"48":3,"49":3,"50":4,"52":6,"54":1,"55":3,"56":5,"57":10,"59":1,"61":4,"62":1,"65":2,"66":10,"67":1,"72":4,"74":2,"77":6,"80":9,"81":2,"85":4,"91":2,"92":1,"93":5,"94":1,"95":1,"96":1,"97":2,"98":1,"99":1,"104":1,"105":1,"107":2,"114":1,"117":1,"122":2,"123":2,"124":2,"125":1,"126":2,"129":1,"130":1,"131":1,"132":2,"139":5,"151":2,"152":2,"156":1,"158":1,"160":4,"163":3,"165":3,"167":1,"172":6,"173":1,"179":3,"180":1,"183":1,"186":1,"187":10,"188":9,"189":1,"199":2,"204":1,"205":1,"208":1,"209":1,"210":6,"212":2,"213":3,"214":4,"216":1,"217":1,"221":1,"222":1,"232":5,"233":1,"234":5,"235":3,"237":6,"238":1,"239":1,"240":2,"241":2,"246":1,"247":1,"251":2,"256":1,"257":1,"261":2,"262":3,"263":1,"265":1,"266":1,"267":1,"271":1,"272":2,"274":1,"275":1,"277":2,"278":2,"279":1,"324":1,"329":1,"330":1,"334":1,"336":3,"340":1,"341":4,"342":1,"348":1,"349":2,"350":1,"351":2,"352":4,"353":4,"359":2,"360":1,"364":1,"366":1,"367":1,"368":2,"370":3,"371":4,"372":1,"373":4,"374":2,"375":3,"378":1,"379":2,"381":1,"390":2,"391":1,"395":1,"402":1,"412":1,"413":1,"414":1,"419":3,"423":1,"424":1,"429":1,"430":1,"431":2,"432":1,"433":1,"434":1,"435":1,"436":8,"441":1,"448":1,"449":1,"451":2,"452":3,"453":4,"454":1,"455":1,"459":1,"460":1,"470":5,"471":1,"472":5}}],["seqmetadata",{"2":{"43":2,"47":2,"56":2,"57":4}}],["seqindexer",{"2":{"23":1,"24":1,"28":2,"32":1,"37":1,"39":1,"41":1}}],["seterror",{"2":{"436":3}}],["setbasemetadatauri",{"2":{"332":1,"333":1}}],["setitem",{"2":{"220":1,"458":1}}],["setopenwalletmodal",{"2":{"103":2}}],["setopenconnectmodal",{"2":{"102":2}}],["setting",{"0":{"100":1,"101":1},"2":{"281":1,"283":1}}],["settings",{"0":{"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1},"2":{"3":1,"30":1,"85":3,"118":1,"120":1,"132":1,"136":4,"137":4,"139":2,"163":1,"165":1,"179":2,"188":8,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1}}],["setupcredentials",{"2":{"165":1}}],["setup",{"0":{"75":1,"91":1,"92":1,"132":1,"165":1,"177":1,"359":1,"360":1},"1":{"76":1},"2":{"74":1,"129":3,"130":1,"132":1,"142":1,"153":1,"154":1,"165":2,"167":1,"172":2,"178":1,"282":1,"378":1}}],["setsigningin",{"2":{"436":1}}],["setsessionhash",{"2":{"436":3}}],["sets",{"2":{"4":1,"172":1,"436":1}}],["set",{"0":{"326":1,"329":1,"333":1},"2":{"3":1,"4":1,"30":1,"61":1,"75":1,"80":4,"135":1,"139":3,"158":3,"176":1,"207":1,"329":1,"332":1,"333":1,"390":1,"395":1,"407":1,"423":1,"429":1}}],["seemlessly",{"2":{"151":1}}],["seen",{"2":{"59":1,"63":1,"350":1}}],["see",{"2":{"3":1,"23":1,"25":1,"27":2,"28":2,"34":1,"42":1,"49":1,"50":3,"55":1,"61":3,"62":2,"63":1,"66":1,"72":1,"80":1,"81":1,"85":1,"113":1,"114":1,"127":1,"131":2,"133":1,"139":2,"141":1,"143":1,"150":1,"188":1,"200":1,"208":1,"214":1,"234":1,"237":3,"249":4,"258":4,"281":2,"335":1,"338":1,"341":1,"370":1,"371":1,"373":1,"410":1,"434":1,"436":3,"448":1,"449":1,"453":1,"472":1}}],["security",{"0":{"164":1},"2":{"187":2,"342":1,"351":1,"374":1,"378":2}}],["secured",{"2":{"375":1}}],["secure",{"2":{"11":1,"74":1,"95":1,"96":1,"217":2,"238":1,"239":1,"351":1,"366":1,"367":1,"374":2,"455":2}}],["securely",{"2":{"3":2,"164":2,"336":1}}],["seconds",{"2":{"158":1,"193":2}}],["second",{"2":{"50":1,"130":1,"143":1,"434":1}}],["secret",{"2":{"3":3,"4":1}}],["section",{"2":{"2":1,"4":1,"23":1,"61":1,"64":1,"66":1,"81":1,"136":1,"137":1,"139":1,"143":1,"249":2,"258":2,"329":1,"332":1,"335":1,"413":1,"414":1,"448":1,"449":1}}]],"serializationVersion":2}
diff --git a/api/embedded-wallet/index.html b/api/embedded-wallet/index.html
index a757121dae8..df25a6868a7 100644
--- a/api/embedded-wallet/index.html
+++ b/api/embedded-wallet/index.html
@@ -12,8 +12,8 @@
-
-
+
+
diff --git a/assets/01-connect-wallet-CJS3Q5IL.js b/assets/01-connect-wallet-C2ki7jwJ.js
similarity index 99%
rename from assets/01-connect-wallet-CJS3Q5IL.js
rename to assets/01-connect-wallet-C2ki7jwJ.js
index 457d611e2af..ac17d4ea47a 100644
--- a/assets/01-connect-wallet-CJS3Q5IL.js
+++ b/assets/01-connect-wallet-C2ki7jwJ.js
@@ -1,4 +1,4 @@
-import{d as l,j as e}from"./index-LuHMmo7L.js";const r={title:"Connect Wallet",description:"undefined"};function i(s){const n={a:"a",code:"code",div:"div",em:"em",h1:"h1",h2:"h2",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",...l(),...s.components};return e.jsxs(e.Fragment,{children:[e.jsx(n.header,{children:e.jsxs(n.h1,{id:"connect-wallet",children:["Connect Wallet",e.jsx(n.a,{"aria-hidden":"true",tabIndex:"-1",href:"#connect-wallet",children:e.jsx(n.div,{"data-autolink-icon":!0})})]})}),`
+import{d as l,j as e}from"./index-T9CcbaWL.js";const r={title:"Connect Wallet",description:"undefined"};function i(s){const n={a:"a",code:"code",div:"div",em:"em",h1:"h1",h2:"h2",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",...l(),...s.components};return e.jsxs(e.Fragment,{children:[e.jsx(n.header,{children:e.jsxs(n.h1,{id:"connect-wallet",children:["Connect Wallet",e.jsx(n.a,{"aria-hidden":"true",tabIndex:"-1",href:"#connect-wallet",children:e.jsx(n.div,{"data-autolink-icon":!0})})]})}),`
`,e.jsx(n.p,{children:"Sequence is a very flexible wallet which allow users multiple ways to connect / access their wallet. This includes:"}),`
`,e.jsxs(n.ol,{children:[`
`,e.jsxs(n.li,{children:[`
diff --git a/assets/01-connect-wallet-BcH_VWhK.js b/assets/01-connect-wallet-Ojh1eNYb.js
similarity index 99%
rename from assets/01-connect-wallet-BcH_VWhK.js
rename to assets/01-connect-wallet-Ojh1eNYb.js
index 69b36cca2c7..01a5afd3dec 100644
--- a/assets/01-connect-wallet-BcH_VWhK.js
+++ b/assets/01-connect-wallet-Ojh1eNYb.js
@@ -1,4 +1,4 @@
-import{d as l,j as e,e as a}from"./index-LuHMmo7L.js";import"./HomePage.css.js.vanilla-l0sNRNKZ.js";const c={title:"Connect Wallet",description:"undefined"};function i(n){const s={a:"a",code:"code",div:"div",em:"em",h1:"h1",h2:"h2",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",...l(),...n.components};return e.jsxs(e.Fragment,{children:[e.jsx(s.header,{children:e.jsxs(s.h1,{id:"connect-wallet",children:["Connect Wallet",e.jsx(s.a,{"aria-hidden":"true",tabIndex:"-1",href:"#connect-wallet",children:e.jsx(s.div,{"data-autolink-icon":!0})})]})}),`
+import{d as l,j as e,e as a}from"./index-T9CcbaWL.js";import"./HomePage.css.js.vanilla-l0sNRNKZ.js";const c={title:"Connect Wallet",description:"undefined"};function i(n){const s={a:"a",code:"code",div:"div",em:"em",h1:"h1",h2:"h2",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",...l(),...n.components};return e.jsxs(e.Fragment,{children:[e.jsx(s.header,{children:e.jsxs(s.h1,{id:"connect-wallet",children:["Connect Wallet",e.jsx(s.a,{"aria-hidden":"true",tabIndex:"-1",href:"#connect-wallet",children:e.jsx(s.div,{"data-autolink-icon":!0})})]})}),`
`,e.jsx(s.p,{children:"Sequence is a very flexible wallet which allow users multiple ways to connect / access their wallet. This includes:"}),`
`,e.jsxs(s.ol,{children:[`
`,e.jsxs(s.li,{children:[`
diff --git a/assets/01-deploy-CMCDROZB.js b/assets/01-deploy-BI3ZJ31P.js
similarity index 98%
rename from assets/01-deploy-CMCDROZB.js
rename to assets/01-deploy-BI3ZJ31P.js
index cd8202b015a..6fc935936d5 100644
--- a/assets/01-deploy-CMCDROZB.js
+++ b/assets/01-deploy-BI3ZJ31P.js
@@ -1,4 +1,4 @@
-import{d as i,j as e,e as r}from"./index-LuHMmo7L.js";import"./HomePage.css.js.vanilla-l0sNRNKZ.js";const o={title:"Deploy Process V2",description:"undefined"};function t(s){const n={a:"a",code:"code",div:"div",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",span:"span",strong:"strong",...i(),...s.components};return e.jsxs(e.Fragment,{children:[e.jsx(n.header,{children:e.jsxs(n.h1,{id:"deploy-process-v2",children:["Deploy Process V2",e.jsx(n.a,{"aria-hidden":"true",tabIndex:"-1",href:"#deploy-process-v2",children:e.jsx(n.div,{"data-autolink-icon":!0})})]})}),`
+import{d as i,j as e,e as r}from"./index-T9CcbaWL.js";import"./HomePage.css.js.vanilla-l0sNRNKZ.js";const o={title:"Deploy Process V2",description:"undefined"};function t(s){const n={a:"a",code:"code",div:"div",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",span:"span",strong:"strong",...i(),...s.components};return e.jsxs(e.Fragment,{children:[e.jsx(n.header,{children:e.jsxs(n.h1,{id:"deploy-process-v2",children:["Deploy Process V2",e.jsx(n.a,{"aria-hidden":"true",tabIndex:"-1",href:"#deploy-process-v2",children:e.jsx(n.div,{"data-autolink-icon":!0})})]})}),`
`,e.jsxs(n.p,{children:["The following steps are required to deploy the ",e.jsx(n.a,{href:"#TODO",children:"Sequence Wallet Context"})," on a new network."]}),`
`,e.jsx(r,{type:"info",children:e.jsxs(n.p,{children:["Notice ",e.jsx("br",{}),`
For most popular networks this process `,e.jsx(n.strong,{children:"is not"}),` required; due to the wallet contracts
diff --git a/assets/01-deploy-DPdlDvod.js b/assets/01-deploy-BQACtlX8.js
similarity index 99%
rename from assets/01-deploy-DPdlDvod.js
rename to assets/01-deploy-BQACtlX8.js
index be6af288021..a6ea24e5720 100644
--- a/assets/01-deploy-DPdlDvod.js
+++ b/assets/01-deploy-BQACtlX8.js
@@ -1,4 +1,4 @@
-import{d as t,j as e,e as a}from"./index-LuHMmo7L.js";import"./HomePage.css.js.vanilla-l0sNRNKZ.js";const o={title:"Deploy Process V1",description:"undefined"};function d(n){const s={a:"a",code:"code",div:"div",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",span:"span",strong:"strong",...t(),...n.components};return e.jsxs(e.Fragment,{children:[e.jsx(s.header,{children:e.jsxs(s.h1,{id:"deploy-process-v1",children:["Deploy Process V1",e.jsx(s.a,{"aria-hidden":"true",tabIndex:"-1",href:"#deploy-process-v1",children:e.jsx(s.div,{"data-autolink-icon":!0})})]})}),`
+import{d as t,j as e,e as a}from"./index-T9CcbaWL.js";import"./HomePage.css.js.vanilla-l0sNRNKZ.js";const o={title:"Deploy Process V1",description:"undefined"};function d(n){const s={a:"a",code:"code",div:"div",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",span:"span",strong:"strong",...t(),...n.components};return e.jsxs(e.Fragment,{children:[e.jsx(s.header,{children:e.jsxs(s.h1,{id:"deploy-process-v1",children:["Deploy Process V1",e.jsx(s.a,{"aria-hidden":"true",tabIndex:"-1",href:"#deploy-process-v1",children:e.jsx(s.div,{"data-autolink-icon":!0})})]})}),`
`,e.jsxs(s.p,{children:["The following steps are required to deploy the ",e.jsx(s.a,{href:"#TODO",children:"Sequence Wallet V1 Context"})," on a new network."]}),`
`,e.jsx(a,{type:"info",children:e.jsxs(s.p,{children:["Notice ",e.jsx("br",{}),`
For most popular networks this process `,e.jsx(s.strong,{children:"is not"}),` required; due to the wallet contracts
diff --git a/assets/01-deploy-an-item-collection-D88ubTIw.js b/assets/01-deploy-an-item-collection-fj0z6Tzc.js
similarity index 99%
rename from assets/01-deploy-an-item-collection-D88ubTIw.js
rename to assets/01-deploy-an-item-collection-fj0z6Tzc.js
index 709f12ead02..a7453558214 100644
--- a/assets/01-deploy-an-item-collection-D88ubTIw.js
+++ b/assets/01-deploy-an-item-collection-fj0z6Tzc.js
@@ -1,4 +1,4 @@
-import{d as s,j as e,e as i}from"./index-LuHMmo7L.js";import"./HomePage.css.js.vanilla-l0sNRNKZ.js";const a={title:"How to Deploy an Item Collection Contract",description:"undefined"};function c(n){const t={a:"a",code:"code",div:"div",h1:"h1",h2:"h2",h4:"h4",header:"header",img:"img",p:"p",...s(),...n.components};return e.jsxs(e.Fragment,{children:[e.jsx(t.header,{children:e.jsxs(t.h1,{id:"how-to-deploy-an-item-collection-contract",children:["How to Deploy an Item Collection Contract",e.jsx(t.a,{"aria-hidden":"true",tabIndex:"-1",href:"#how-to-deploy-an-item-collection-contract",children:e.jsx(t.div,{"data-autolink-icon":!0})})]})}),`
+import{d as s,j as e,e as i}from"./index-T9CcbaWL.js";import"./HomePage.css.js.vanilla-l0sNRNKZ.js";const a={title:"How to Deploy an Item Collection Contract",description:"undefined"};function c(n){const t={a:"a",code:"code",div:"div",h1:"h1",h2:"h2",h4:"h4",header:"header",img:"img",p:"p",...s(),...n.components};return e.jsxs(e.Fragment,{children:[e.jsx(t.header,{children:e.jsxs(t.h1,{id:"how-to-deploy-an-item-collection-contract",children:["How to Deploy an Item Collection Contract",e.jsx(t.a,{"aria-hidden":"true",tabIndex:"-1",href:"#how-to-deploy-an-item-collection-contract",children:e.jsx(t.div,{"data-autolink-icon":!0})})]})}),`
`,e.jsx(t.p,{children:"This guide walks through how to setup and deploy a Web3 Game Item contract in Builder."}),`
`,e.jsxs(i,{type:"warning",children:[e.jsx(t.p,{children:"Prerequisite: Create a Project"}),e.jsxs(t.p,{children:["This guide assumes that you have already ",e.jsx(t.a,{href:"/solutions/builder/getting-started",children:"signed up for Builder and created a Project"}),"."]})]}),`
`,e.jsxs(t.h4,{id:"erc721-vs-erc1155",children:["ERC721 vs. ERC1155",e.jsx(t.a,{"aria-hidden":"true",tabIndex:"-1",href:"#erc721-vs-erc1155",children:e.jsx(t.div,{"data-autolink-icon":!0})})]}),`
diff --git a/assets/01-deployment-DJ_Huzps.js b/assets/01-deployment-C3RQMFAz.js
similarity index 98%
rename from assets/01-deployment-DJ_Huzps.js
rename to assets/01-deployment-C3RQMFAz.js
index d454440133f..f0ebe4a7830 100644
--- a/assets/01-deployment-DJ_Huzps.js
+++ b/assets/01-deployment-C3RQMFAz.js
@@ -1,4 +1,4 @@
-import{d as r,j as e,e as a}from"./index-LuHMmo7L.js";import"./HomePage.css.js.vanilla-l0sNRNKZ.js";const d={title:"Contract Deployment",description:"undefined"};function i(n){const t={a:"a",div:"div",h1:"h1",h2:"h2",h4:"h4",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...r(),...n.components};return e.jsxs(e.Fragment,{children:[e.jsx(t.header,{children:e.jsxs(t.h1,{id:"contract-deployment",children:["Contract Deployment",e.jsx(t.a,{"aria-hidden":"true",tabIndex:"-1",href:"#contract-deployment",children:e.jsx(t.div,{"data-autolink-icon":!0})})]})}),`
+import{d as r,j as e,e as a}from"./index-T9CcbaWL.js";import"./HomePage.css.js.vanilla-l0sNRNKZ.js";const d={title:"Contract Deployment",description:"undefined"};function i(n){const t={a:"a",div:"div",h1:"h1",h2:"h2",h4:"h4",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...r(),...n.components};return e.jsxs(e.Fragment,{children:[e.jsx(t.header,{children:e.jsxs(t.h1,{id:"contract-deployment",children:["Contract Deployment",e.jsx(t.a,{"aria-hidden":"true",tabIndex:"-1",href:"#contract-deployment",children:e.jsx(t.div,{"data-autolink-icon":!0})})]})}),`
`,e.jsx(t.p,{children:"Sequence contract wallets are fully deterministic; a wallet will map to the same address on any network that is EVM compatible."}),`
`,e.jsx(t.p,{children:"This means that when a wallet is created, its address can be derived in advance, and it will be the same on networks like Ethereum, Arbitrum, Polygon, and others."}),`
`,e.jsxs(a,{type:"warning",children:[e.jsxs(t.p,{children:[e.jsx(t.strong,{children:"Limitations"}),e.jsx("br",{}),`
diff --git a/assets/01-fiat-on-ramps-C84xxRYt.js b/assets/01-fiat-on-ramps-BRLJ5xX3.js
similarity index 96%
rename from assets/01-fiat-on-ramps-C84xxRYt.js
rename to assets/01-fiat-on-ramps-BRLJ5xX3.js
index 99c89c1cf1d..ac6097f6599 100644
--- a/assets/01-fiat-on-ramps-C84xxRYt.js
+++ b/assets/01-fiat-on-ramps-BRLJ5xX3.js
@@ -1,4 +1,4 @@
-import{d as t,j as e}from"./index-LuHMmo7L.js";const s={slug:"/fiat-on-ramps",title:"Fiat On-Ramps",description:"undefined"};function r(i){const n={a:"a",div:"div",h1:"h1",header:"header",img:"img",li:"li",p:"p",ul:"ul",...t(),...i.components};return e.jsxs(e.Fragment,{children:[e.jsx(n.header,{children:e.jsxs(n.h1,{id:"fiat-on-ramps",children:["Fiat On-Ramps",e.jsx(n.a,{"aria-hidden":"true",tabIndex:"-1",href:"#fiat-on-ramps",children:e.jsx(n.div,{"data-autolink-icon":!0})})]})}),`
+import{d as t,j as e}from"./index-T9CcbaWL.js";const s={slug:"/fiat-on-ramps",title:"Fiat On-Ramps",description:"undefined"};function r(i){const n={a:"a",div:"div",h1:"h1",header:"header",img:"img",li:"li",p:"p",ul:"ul",...t(),...i.components};return e.jsxs(e.Fragment,{children:[e.jsx(n.header,{children:e.jsxs(n.h1,{id:"fiat-on-ramps",children:["Fiat On-Ramps",e.jsx(n.a,{"aria-hidden":"true",tabIndex:"-1",href:"#fiat-on-ramps",children:e.jsx(n.div,{"data-autolink-icon":!0})})]})}),`
`,e.jsx(n.p,{children:"Sequence Wallet allows users to purchase cryptocurrencies directly with their credit card and debit card via on-ramp providers. Currently Sequence supports 6 on-ramp providers;"}),`
`,e.jsxs(n.ul,{children:[`
`,e.jsx(n.li,{children:e.jsx(n.a,{href:"https://www.moonpay.com/",children:"Moonpay"})}),`
diff --git a/assets/01-introduction-DWla56Ln.js b/assets/01-introduction-CWX-gCEN.js
similarity index 98%
rename from assets/01-introduction-DWla56Ln.js
rename to assets/01-introduction-CWX-gCEN.js
index d8e601597e5..de85860bf81 100644
--- a/assets/01-introduction-DWla56Ln.js
+++ b/assets/01-introduction-CWX-gCEN.js
@@ -1,4 +1,4 @@
-import{d as a,j as e}from"./index-LuHMmo7L.js";const r={title:"Advanced - Introduction",description:"undefined"};function i(n){const t={a:"a",code:"code",div:"div",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",...a(),...n.components};return e.jsxs(e.Fragment,{children:[e.jsx(t.header,{children:e.jsxs(t.h1,{id:"advanced---introduction",children:["Advanced - Introduction",e.jsx(t.a,{"aria-hidden":"true",tabIndex:"-1",href:"#advanced---introduction",children:e.jsx(t.div,{"data-autolink-icon":!0})})]})}),`
+import{d as a,j as e}from"./index-T9CcbaWL.js";const r={title:"Advanced - Introduction",description:"undefined"};function i(n){const t={a:"a",code:"code",div:"div",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",...a(),...n.components};return e.jsxs(e.Fragment,{children:[e.jsx(t.header,{children:e.jsxs(t.h1,{id:"advanced---introduction",children:["Advanced - Introduction",e.jsx(t.a,{"aria-hidden":"true",tabIndex:"-1",href:"#advanced---introduction",children:e.jsx(t.div,{"data-autolink-icon":!0})})]})}),`
`,e.jsxs(t.p,{children:["For advanced users with experience developing applications on EVM-based blockchains, we've provided our own lightweight, custom-made for Unity, Ethereum library: ",e.jsx(t.a,{href:"https://github.com/0xsequence/sequence-unity/tree/master/Assets/SequenceSDK/Ethereum",children:"SequenceEthereum"}),`.
SequenceEthereum should provide everything you need to build your Unity app on the EVM, without all the extra bells and whistles that the popular `,e.jsx(t.a,{href:"https://github.com/Nethereum/Nethereum",children:"Nethereum"})," library provides."]}),`
`,e.jsxs(t.p,{children:['While SequenceEthereum is heavily tested, in general, when working with asynchronous methods in the library, you should consider them to be "unsafe", in that they ',e.jsx("i",{children:"may"}),` throw Exceptions when used improperly.
diff --git a/assets/01-overview-CRzhDq1L.js b/assets/01-overview-BS-hstsN.js
similarity index 97%
rename from assets/01-overview-CRzhDq1L.js
rename to assets/01-overview-BS-hstsN.js
index 88a0e842af1..ec71d33e3fa 100644
--- a/assets/01-overview-CRzhDq1L.js
+++ b/assets/01-overview-BS-hstsN.js
@@ -1,4 +1,4 @@
-import{d as r,j as e}from"./index-LuHMmo7L.js";const o={title:"Introduction",description:"undefined"};function t(i){const n={a:"a",code:"code",div:"div",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...r(),...i.components};return e.jsxs(e.Fragment,{children:[e.jsx(n.header,{children:e.jsxs(n.h1,{id:"introduction",children:["Introduction",e.jsx(n.a,{"aria-hidden":"true",tabIndex:"-1",href:"#introduction",children:e.jsx(n.div,{"data-autolink-icon":!0})})]})}),`
+import{d as r,j as e}from"./index-T9CcbaWL.js";const o={title:"Introduction",description:"undefined"};function t(i){const n={a:"a",code:"code",div:"div",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...r(),...i.components};return e.jsxs(e.Fragment,{children:[e.jsx(n.header,{children:e.jsxs(n.h1,{id:"introduction",children:["Introduction",e.jsx(n.a,{"aria-hidden":"true",tabIndex:"-1",href:"#introduction",children:e.jsx(n.div,{"data-autolink-icon":!0})})]})}),`
`,e.jsxs(n.p,{children:["The Sequence Unity Embedded Wallet SDK provides full Sequence ",e.jsx(n.a,{href:"/solutions/wallets/embedded-wallet/01-overview",children:"Embedded Wallet"})," and ",e.jsx(n.a,{href:"/api/indexer/overview",children:"Indexer"})," integration for your Unity Games, integrated with our own purpose-built for Unity SequenceEthereum library. That's right, no Nethereum required!"]}),`
`,e.jsxs(n.p,{children:["This SDK follows ",e.jsx(n.a,{href:"https://semver.org/",children:"Semantic Versioning"})," (",e.jsx(n.code,{children:"major.minor.patch"}),"). While we're still in ",e.jsx(n.code,{children:"0.x.y"})," builds, API breaking changes can be made at any time. After ",e.jsx(n.code,{children:"1.0.0"}),", breaking changes will always cause a ",e.jsx(n.code,{children:"major"})," version increment, non-breaking new features will cause a ",e.jsx(n.code,{children:"minor"})," version increment, and bugfixes will cause a ",e.jsx(n.code,{children:"patch"})," version increment."]}),`
`,e.jsxs(n.h2,{id:"requirements",children:["Requirements",e.jsx(n.a,{"aria-hidden":"true",tabIndex:"-1",href:"#requirements",children:e.jsx(n.div,{"data-autolink-icon":!0})})]}),`
diff --git a/assets/01-overview-BapTVX_x.js b/assets/01-overview-BV7JTr3I.js
similarity index 99%
rename from assets/01-overview-BapTVX_x.js
rename to assets/01-overview-BV7JTr3I.js
index 2eed40936a4..356c9326e68 100644
--- a/assets/01-overview-BapTVX_x.js
+++ b/assets/01-overview-BV7JTr3I.js
@@ -1,4 +1,4 @@
-var gp=Object.defineProperty;var pp=(r,e,t)=>e in r?gp(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var Se=(r,e,t)=>(pp(r,typeof e!="symbol"?e+"":e,t),t);import{g as xp,f as Lu,h as Xi,i as bp,s as mp,r as ca,j as Ne,d as Uu}from"./index-LuHMmo7L.js";const wp=[{inputs:[{internalType:"bytes32",type:"bytes32"}],name:"getAlternativeSignature",outputs:[{internalType:"string",type:"string"}],stateMutability:"view",type:"function"}];var yp=Object.freeze({__proto__:null,abi:wp});const vp=[{type:"function",name:"isValidSignature",constant:!0,inputs:[{type:"bytes32"},{type:"bytes"}],outputs:[{type:"bytes4"}],payable:!1,stateMutability:"view"}],Ep={isValidSignatureBytes32:"0x1626ba7e"};var Ap=Object.freeze({__proto__:null,abi:vp,returns:Ep});const _p=[{inputs:[{internalType:"bytes",name:"error",type:"bytes"}],name:"ERC1271Revert",type:"error"},{inputs:[{internalType:"bytes",name:"error",type:"bytes"}],name:"ERC6492DeployFailed",type:"error"},{inputs:[{internalType:"address",name:"_signer",type:"address"},{internalType:"bytes32",name:"_hash",type:"bytes32"},{internalType:"bytes",name:"_signature",type:"bytes"}],name:"isValidSig",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_signer",type:"address"},{internalType:"bytes32",name:"_hash",type:"bytes32"},{internalType:"bytes",name:"_signature",type:"bytes"},{internalType:"bool",name:"allowSideEffects",type:"bool"},{internalType:"bool",name:"deployAlreadyDeployed",type:"bool"}],name:"isValidSigImpl",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_signer",type:"address"},{internalType:"bytes32",name:"_hash",type:"bytes32"},{internalType:"bytes",name:"_signature",type:"bytes"}],name:"isValidSigNoThrow",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_signer",type:"address"},{internalType:"bytes32",name:"_hash",type:"bytes32"},{internalType:"bytes",name:"_signature",type:"bytes"}],name:"isValidSigWithSideEffects",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_signer",type:"address"},{internalType:"bytes32",name:"_hash",type:"bytes32"},{internalType:"bytes",name:"_signature",type:"bytes"}],name:"isValidSigWithSideEffectsNoThrow",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"}];var Sp=Object.freeze({__proto__:null,abi:_p});const Cp=[{type:"function",name:"deploy",constant:!1,inputs:[{type:"address"},{type:"bytes32"}],outputs:[],payable:!0,stateMutability:"payable"}];var Ip=Object.freeze({__proto__:null,abi:Cp});const kp=[{type:"function",name:"nonce",constant:!0,inputs:[],outputs:[{type:"uint256"}],payable:!1,stateMutability:"view"},{type:"function",name:"readNonce",constant:!0,inputs:[{type:"uint256"}],outputs:[{type:"uint256"}],payable:!1,stateMutability:"view"},{type:"function",name:"updateImplementation",constant:!1,inputs:[{type:"address"}],outputs:[],payable:!1,stateMutability:"nonpayable"},{type:"function",name:"selfExecute",constant:!1,inputs:[{components:[{type:"bool",name:"delegateCall"},{type:"bool",name:"revertOnError"},{type:"uint256",name:"gasLimit"},{type:"address",name:"target"},{type:"uint256",name:"value"},{type:"bytes",name:"data"}],type:"tuple[]"}],outputs:[],payable:!1,stateMutability:"nonpayable"},{type:"function",name:"execute",constant:!1,inputs:[{components:[{type:"bool",name:"delegateCall"},{type:"bool",name:"revertOnError"},{type:"uint256",name:"gasLimit"},{type:"address",name:"target"},{type:"uint256",name:"value"},{type:"bytes",name:"data"}],type:"tuple[]"},{type:"uint256"},{type:"bytes"}],outputs:[],payable:!1,stateMutability:"nonpayable"},{type:"function",name:"createContract",inputs:[{type:"bytes"}],payable:!0,stateMutability:"payable"},{type:"function",name:"setExtraImageHash",constant:!1,inputs:[{type:"bytes32",name:"imageHash"},{type:"uint256",name:"expiration"}],outputs:[],payable:!1,stateMutability:"nonpayable"}];var Tp=Object.freeze({__proto__:null,abi:kp});const Mp=[{type:"function",name:"updateImageHash",constant:!0,inputs:[{type:"bytes32"}],outputs:[],payable:!1,stateMutability:"view"},{type:"function",name:"imageHash",constant:!0,inputs:[],outputs:[{type:"bytes32"}],payable:!1,stateMutability:"view"}];var Op=Object.freeze({__proto__:null,abi:Mp});const Np=[{inputs:[{internalType:"address",name:"_factory",type:"address"},{internalType:"address",name:"_mainModule",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_wallet",type:"address"},{indexed:!0,internalType:"bytes32",name:"_imageHash",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"_threshold",type:"uint256"},{indexed:!1,internalType:"bytes",name:"_signers",type:"bytes"}],name:"RequiredConfig",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_wallet",type:"address"},{indexed:!0,internalType:"address",name:"_signer",type:"address"}],name:"RequiredSigner",type:"event"},{inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"callBalanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"callBlockNumber",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"_i",type:"uint256"}],name:"callBlockhash",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"callChainId",outputs:[{internalType:"uint256",name:"id",type:"uint256"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"callCode",outputs:[{internalType:"bytes",name:"code",type:"bytes"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"callCodeHash",outputs:[{internalType:"bytes32",name:"codeHash",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"callCodeSize",outputs:[{internalType:"uint256",name:"size",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"callCoinbase",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"callDifficulty",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"callGasLeft",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"callGasLimit",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"callGasPrice",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"callOrigin",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"callTimestamp",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"knownImageHashes",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"",type:"bytes32"}],name:"lastImageHashUpdate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"lastSignerUpdate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"lastWalletUpdate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{components:[{internalType:"bool",name:"delegateCall",type:"bool"},{internalType:"bool",name:"revertOnError",type:"bool"},{internalType:"uint256",name:"gasLimit",type:"uint256"},{internalType:"address",name:"target",type:"address"},{internalType:"uint256",name:"value",type:"uint256"},{internalType:"bytes",name:"data",type:"bytes"}],internalType:"struct IModuleCalls.Transaction[]",name:"_txs",type:"tuple[]"}],name:"multiCall",outputs:[{internalType:"bool[]",name:"_successes",type:"bool[]"},{internalType:"bytes[]",name:"_results",type:"bytes[]"}],stateMutability:"payable",type:"function"},{inputs:[{internalType:"address",name:"_wallet",type:"address"},{internalType:"uint256",name:"_threshold",type:"uint256"},{components:[{internalType:"uint256",name:"weight",type:"uint256"},{internalType:"address",name:"signer",type:"address"}],internalType:"struct RequireUtils.Member[]",name:"_members",type:"tuple[]"},{internalType:"bool",name:"_index",type:"bool"}],name:"publishConfig",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_wallet",type:"address"},{internalType:"bytes32",name:"_hash",type:"bytes32"},{internalType:"uint256",name:"_sizeMembers",type:"uint256"},{internalType:"bytes",name:"_signature",type:"bytes"},{internalType:"bool",name:"_index",type:"bool"}],name:"publishInitialSigners",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_wallet",type:"address"},{internalType:"uint256",name:"_nonce",type:"uint256"}],name:"requireMinNonce",outputs:[],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"_expiration",type:"uint256"}],name:"requireNonExpired",outputs:[],stateMutability:"view",type:"function"}];var Pp=Object.freeze({__proto__:null,abi:Np});const Rp=[{inputs:[{internalType:"address",name:"",type:"address"}],name:"requireFreshSigner",outputs:[],stateMutability:"nonpayable",type:"function"}];var Bp=Object.freeze({__proto__:null,abi:Rp});const Rt={erc6492:Sp,erc5719:yp,erc1271:Ap,factory:Ip,mainModule:Tp,mainModuleUpgradable:Op,sequenceUtils:Pp,requireFreshSigner:Bp},Dp=Object.freeze(Object.defineProperty({__proto__:null,walletContracts:Rt},Symbol.toStringTag,{value:"Module"}));function Ra(){return Ra=Object.assign?Object.assign.bind():function(r){for(var e=1;ethis.fetch(this.url("Ping"),fe({},n)).then(i=>ue(i).then(s=>({status:s.status}))),this.version=n=>this.fetch(this.url("Version"),fe({},n)).then(i=>ue(i).then(s=>({version:s.version}))),this.runtimeStatus=n=>this.fetch(this.url("RuntimeStatus"),fe({},n)).then(i=>ue(i).then(s=>({status:s.status}))),this.clock=n=>this.fetch(this.url("Clock"),fe({},n)).then(i=>ue(i).then(s=>({serverTime:s.serverTime}))),this.getSequenceContext=n=>this.fetch(this.url("GetSequenceContext"),fe({},n)).then(i=>ue(i).then(s=>({data:s.data}))),this.getAuthToken=(n,i)=>this.fetch(this.url("GetAuthToken"),fe(n,i)).then(s=>ue(s).then(a=>({status:a.status,jwtToken:a.jwtToken,address:a.address,user:a.user}))),this.getAuthToken2=(n,i)=>this.fetch(this.url("GetAuthToken2"),fe(n,i)).then(s=>ue(s).then(a=>({status:a.status,jwtToken:a.jwtToken,address:a.address,user:a.user}))),this.sendPasswordlessLink=(n,i)=>this.fetch(this.url("SendPasswordlessLink"),fe(n,i)).then(s=>ue(s).then(a=>({status:a.status}))),this.friendList=(n,i)=>this.fetch(this.url("FriendList"),fe(n,i)).then(s=>ue(s).then(a=>({page:a.page,friends:a.friends}))),this.getFriendByAddress=(n,i)=>this.fetch(this.url("GetFriendByAddress"),fe(n,i)).then(s=>ue(s).then(a=>({status:a.status,friend:a.friend}))),this.searchFriends=(n,i)=>this.fetch(this.url("SearchFriends"),fe(n,i)).then(s=>ue(s).then(a=>({friends:a.friends}))),this.addFriend=(n,i)=>this.fetch(this.url("AddFriend"),fe(n,i)).then(s=>ue(s).then(a=>({status:a.status,friend:a.friend}))),this.updateFriendNickname=(n,i)=>this.fetch(this.url("UpdateFriendNickname"),fe(n,i)).then(s=>ue(s).then(a=>({status:a.status,friend:a.friend}))),this.removeFriend=(n,i)=>this.fetch(this.url("RemoveFriend"),fe(n,i)).then(s=>ue(s).then(a=>({status:a.status}))),this.contractCall=(n,i)=>this.fetch(this.url("ContractCall"),fe(n,i)).then(s=>ue(s).then(a=>({returns:a.returns}))),this.decodeContractCall=(n,i)=>this.fetch(this.url("DecodeContractCall"),fe(n,i)).then(s=>ue(s).then(a=>({call:a.call}))),this.lookupContractCallSelectors=(n,i)=>this.fetch(this.url("LookupContractCallSelectors"),fe(n,i)).then(s=>ue(s).then(a=>({signatures:a.signatures}))),this.userStorageFetch=(n,i)=>this.fetch(this.url("UserStorageFetch"),fe(n,i)).then(s=>ue(s).then(a=>({object:a.object}))),this.userStorageSave=(n,i)=>this.fetch(this.url("UserStorageSave"),fe(n,i)).then(s=>ue(s).then(a=>({ok:a.ok}))),this.userStorageDelete=(n,i)=>this.fetch(this.url("UserStorageDelete"),fe(n,i)).then(s=>ue(s).then(a=>({ok:a.ok}))),this.userStorageFetchAll=(n,i)=>this.fetch(this.url("UserStorageFetchAll"),fe(n,i)).then(s=>ue(s).then(a=>({objects:a.objects}))),this.getMoonpayLink=(n,i)=>this.fetch(this.url("GetMoonpayLink"),fe(n,i)).then(s=>ue(s).then(a=>({signedUrl:a.signedUrl}))),this.getSardineClientToken=n=>this.fetch(this.url("GetSardineClientToken"),fe({},n)).then(i=>ue(i).then(s=>({token:s.token}))),this.resolveENSAddress=(n,i)=>this.fetch(this.url("ResolveENSAddress"),fe(n,i)).then(s=>ue(s).then(a=>({address:a.address,ok:a.ok}))),this.isValidSignature=(n,i)=>this.fetch(this.url("IsValidSignature"),fe(n,i)).then(s=>ue(s).then(a=>({isValid:a.isValid}))),this.isValidMessageSignature=(n,i)=>this.fetch(this.url("IsValidMessageSignature"),fe(n,i)).then(s=>ue(s).then(a=>({isValid:a.isValid}))),this.isValidTypedDataSignature=(n,i)=>this.fetch(this.url("IsValidTypedDataSignature"),fe(n,i)).then(s=>ue(s).then(a=>({isValid:a.isValid}))),this.isValidETHAuthProof=(n,i)=>this.fetch(this.url("IsValidETHAuthProof"),fe(n,i)).then(s=>ue(s).then(a=>({isValid:a.isValid}))),this.getCoinPrices=(n,i)=>this.fetch(this.url("GetCoinPrices"),fe(n,i)).then(s=>ue(s).then(a=>({tokenPrices:a.tokenPrices}))),this.getCollectiblePrices=(n,i)=>this.fetch(this.url("GetCollectiblePrices"),fe(n,i)).then(s=>ue(s).then(a=>({tokenPrices:a.tokenPrices}))),this.getExchangeRate=(n,i)=>this.fetch(this.url("GetExchangeRate"),fe(n,i)).then(s=>ue(s).then(a=>({exchangeRate:a.exchangeRate}))),this.memoryStore=(n,i)=>this.fetch(this.url("MemoryStore"),fe(n,i)).then(s=>ue(s).then(a=>({ok:a.ok}))),this.memoryLoad=(n,i)=>this.fetch(this.url("MemoryLoad"),fe(n,i)).then(s=>ue(s).then(a=>({value:a.value}))),this.getInviteInfo=n=>this.fetch(this.url("GetInviteInfo"),fe({},n)).then(i=>ue(i).then(s=>({inviteInfo:s.inviteInfo}))),this.isValidAccessCode=(n,i)=>this.fetch(this.url("IsValidAccessCode"),fe(n,i)).then(s=>ue(s).then(a=>({status:a.status}))),this.internalClaimAccessCode=(n,i)=>this.fetch(this.url("InternalClaimAccessCode"),fe(n,i)).then(s=>ue(s).then(a=>({status:a.status}))),this.blockNumberAtTime=(n,i)=>this.fetch(this.url("BlockNumberAtTime"),fe(n,i)).then(s=>ue(s).then(a=>({blocks:a.blocks}))),this.paperSessionSecret=(n,i)=>this.fetch(this.url("PaperSessionSecret"),fe(n,i)).then(s=>ue(s).then(a=>({secret:a.secret}))),this.paperSessionSecret2=(n,i)=>this.fetch(this.url("PaperSessionSecret2"),fe(n,i)).then(s=>ue(s).then(a=>({secret:a.secret}))),this.linkWallet=(n,i)=>this.fetch(this.url("LinkWallet"),fe(n,i)).then(s=>ue(s).then(a=>({status:a.status,linkedWalletAddress:a.linkedWalletAddress}))),this.getLinkedWallets=(n,i)=>this.fetch(this.url("GetLinkedWallets"),fe(n,i)).then(s=>ue(s).then(a=>({linkedWallets:a.linkedWallets}))),this.hostname=e,this.fetch=(n,i)=>t(n,i)}url(e){return this.hostname+this.path+e}}const fe=(r={},e={})=>({method:"POST",headers:Ra({},e,{"Content-Type":"application/json"}),body:JSON.stringify(r||{})}),ue=r=>r.text().then(e=>{let t;try{t=JSON.parse(e)}catch{throw{code:"unknown",msg:`expecting JSON, got: ${e}`,status:r.status}}if(!r.ok)throw t;return t}),g0=typeof global=="object"?global.fetch:window.fetch;class ma extends Fu{constructor(e,t,n){super(e.endsWith("/")?e.slice(0,-1):e,g0),this.projectAccessKey=t,this.jwtAuth=n,this._fetch=(i,s)=>{const a={},o=this.jwtAuth,c=this.projectAccessKey;return o&&o.length>0&&(a.Authorization=`BEARER ${o}`),c&&c.length>0&&(a["X-Access-Key"]=c),s.headers=Ra({},s.headers,a),g0(i,s)},this.fetch=this._fetch}}const Wp=Object.freeze(Object.defineProperty({__proto__:null,API:Fu,SequenceAPIClient:ma,SortOrder:Hp,WebRPCSchemaHash:Fp,WebRPCSchemaVersion:Up,WebRPCVersion:Lp},Symbol.toStringTag,{value:"Module"}));var nf={exports:{}};const jp={},qp=Object.freeze(Object.defineProperty({__proto__:null,default:jp},Symbol.toStringTag,{value:"Module"})),Gp=xp(qp);nf.exports;(function(r){(function(e,t){function n(M,l){if(!M)throw new Error(l||"Assertion failed")}function i(M,l){M.super_=l;var x=function(){};x.prototype=l.prototype,M.prototype=new x,M.prototype.constructor=M}function s(M,l,x){if(s.isBN(M))return M;this.negative=0,this.words=null,this.length=0,this.red=null,M!==null&&((l==="le"||l==="be")&&(x=l,l=10),this._init(M||0,l||10,x||"be"))}typeof e=="object"?e.exports=s:t.BN=s,s.BN=s,s.wordSize=26;var a;try{typeof window<"u"&&typeof window.Buffer<"u"?a=window.Buffer:a=Gp.Buffer}catch{}s.isBN=function(l){return l instanceof s?!0:l!==null&&typeof l=="object"&&l.constructor.wordSize===s.wordSize&&Array.isArray(l.words)},s.max=function(l,x){return l.cmp(x)>0?l:x},s.min=function(l,x){return l.cmp(x)<0?l:x},s.prototype._init=function(l,x,y){if(typeof l=="number")return this._initNumber(l,x,y);if(typeof l=="object")return this._initArray(l,x,y);x==="hex"&&(x=16),n(x===(x|0)&&x>=2&&x<=36),l=l.toString().replace(/\s+/g,"");var C=0;l[0]==="-"&&(C++,this.negative=1),C=0;C-=3)w=l[C]|l[C-1]<<8|l[C-2]<<16,this.words[p]|=w<>>26-v&67108863,v+=24,v>=26&&(v-=26,p++);else if(y==="le")for(C=0,p=0;C>>26-v&67108863,v+=24,v>=26&&(v-=26,p++);return this._strip()};function o(M,l){var x=M.charCodeAt(l);if(x>=48&&x<=57)return x-48;if(x>=65&&x<=70)return x-55;if(x>=97&&x<=102)return x-87;n(!1,"Invalid character in "+M)}function c(M,l,x){var y=o(M,x);return x-1>=l&&(y|=o(M,x-1)<<4),y}s.prototype._parseHex=function(l,x,y){this.length=Math.ceil((l.length-x)/6),this.words=new Array(this.length);for(var C=0;C=x;C-=2)v=c(l,x,C)<