Grant the TrueCurrent RFQ contract the narrow Injective authz permissions required for taker and maker SDK settlement.
TrueCurrent settles RFQ trades through Injective’s exchange module. To make settlement atomic, taker and maker wallets grant the RFQ contract narrow authz permissions before trading.The grants are one-time setup per wallet. They are scoped to the current RFQ contract address, limited to specific message types, and revocable at any time.
Lets the contract open or close taker-side derivative positions
Taker
/injective.exchange.v2.MsgBatchUpdateOrders
Reserved exchange permission used by taker settlement paths
Taker
/cosmos.bank.v1beta1.MsgSend
Lets the contract move taker margin during settlement
MsgWithdraw appears in some contract notes as a canonical grant, but the current working setup intentionally omits it. The active settlement path does not exercise it, and granting unused permissions increases attack surface. If a future contract path requires a new message type, add it only after verifying the deployed contract and runbook.
The script below grants the working testnet set for one maker wallet and one taker wallet. The shell wrapper loads .env before running the Python script so the private keys are present.
set -a. ./.envset +apython grant_all.py
import asyncioimport osos.environ["RFQ_ENV"] = "testnet"from rfq_test.config import get_environment_configfrom rfq_test.clients.chain import ChainClientenv = get_environment_config()CONTRACT = env.contract.addressasync def grant_all(): chain = ChainClient(env.chain) await chain.connect() grants = [ # Maker (os.getenv("TESTNET_MM_PRIVATE_KEY"), "/injective.exchange.v2.MsgPrivilegedExecuteContract"), (os.getenv("TESTNET_MM_PRIVATE_KEY"), "/cosmos.bank.v1beta1.MsgSend"), # Taker (os.getenv("TESTNET_RETAIL_PRIVATE_KEY"), "/injective.exchange.v2.MsgPrivilegedExecuteContract"), (os.getenv("TESTNET_RETAIL_PRIVATE_KEY"), "/injective.exchange.v2.MsgBatchUpdateOrders"), (os.getenv("TESTNET_RETAIL_PRIVATE_KEY"), "/cosmos.bank.v1beta1.MsgSend"), ] for private_key, msg_type in grants: if not private_key: raise RuntimeError(f"missing private key for {msg_type}") tx_hash = await chain.grant_authz( private_key=private_key, grantee=CONTRACT, msg_type=msg_type, ) print(f"Granted {msg_type}: {tx_hash}") # Each grant is a separate tx. Wait for account sequence and LCD state. await asyncio.sleep(3) await chain.close()asyncio.run(grant_all())
Submit grant transactions sequentially. Parallel grant broadcasts commonly fail with account sequence mismatch errors.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"TrueCurrent Docs","description":"TrueCurrent allows you to trade markets without limits.","colors":{"primary":"#fd9a00","light":"#ecaa83","dark":"#000000"},"logo":{"light":"https://mintcdn.com/injectivelabs-2/TAi2KoKzFwI2tA_y/img/logo-light.png?fit=max\u0026auto=format\u0026n=TAi2KoKzFwI2tA_y\u0026q=85\u0026s=f7446d955d9b68fa400415f663de20d1","dark":"https://mintcdn.com/injectivelabs-2/TAi2KoKzFwI2tA_y/img/logo-dark.png?fit=max\u0026auto=format\u0026n=TAi2KoKzFwI2tA_y\u0026q=85\u0026s=7c10937abcc9d1b46db1ed3b71bb9288"},"favicon":"https://mintcdn.com/injectivelabs-2/TAi2KoKzFwI2tA_y/img/logo-dark.png?fit=max\u0026auto=format\u0026n=TAi2KoKzFwI2tA_y\u0026q=85\u0026s=7c10937abcc9d1b46db1ed3b71bb9288","search":{"prompt":"Search TrueCurrent docs..."},"seo":{"metatags":{"og:type":"website","og:site_name":"TrueCurrent Docs","canonical":"https://docs.tc.xyz"},"indexing":"all"},"styling":{"eyebrows":"breadcrumbs","latex":true},"metadata":{"timestamp":true},"navigation":{"languages":[{"language":"en","href":""}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"injectivelabs-2","hasAudioNarration":false,"actualSubdomain":"injectivelabs-2","customDomains":["docs.tc.xyz"],"gitSource":{"type":"github","owner":"truecurrent","repo":"truecurrent-docs","deployBranch":"main","contentDirectory":"mintlify","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af4808a911eab1428db6e5e","clientVersion":"0.0.4111","searchFilterCounts":[{"language":"en","tag":"TRUECURRENT","count":68},{"language":"en","tag":"SDK Trading","count":22},{"language":"en","tag":"Trading","count":14},{"language":"en","tag":"Mobile","count":9},{"language":"en","tag":"Makers","count":8},{"language":"en","tag":"Takers","count":6},{"language":"en","tag":"Technical","count":6},{"language":"en","tag":"Getting Started","count":4},{"language":"en","tag":"Overview","count":3},{"language":"en","tag":"Predictions","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"sdk-trading/authz","slug":"/sdk-trading/authz","pageMetadata":{"title":"Authorization setup","description":"Grant the TrueCurrent RFQ contract the narrow Injective authz permissions required for taker and maker SDK settlement.","updatedAt":"2026-05-27","href":"/sdk-trading/authz"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Grant the TrueCurrent RFQ contract the narrow Injective authz permissions required for taker and maker SDK settlement.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,hr:`hr`,li:`li`,p:`p`,pre:`pre`,span:`span`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Info,Table}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Table)_missingMdxReference(`Table`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`TrueCurrent settles RFQ trades through Injective’s exchange module. To make settlement atomic, taker and maker wallets grant the RFQ contract narrow `,_jsx(_components.code,{children:`authz`}),` permissions before trading.`]}),`\n`,_jsx(_components.p,{children:`The grants are one-time setup per wallet. They are scoped to the current RFQ contract address, limited to specific message types, and revocable at any time.`}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`required-grants`,children:`Required grants`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Role`}),_jsx(_components.th,{children:`Message type`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Maker`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/injective.exchange.v2.MsgPrivilegedExecuteContract`})}),_jsx(_components.td,{children:`Lets the contract open or close maker-side derivative positions`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Maker`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/cosmos.bank.v1beta1.MsgSend`})}),_jsx(_components.td,{children:`Lets the contract move maker margin during settlement`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Taker`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/injective.exchange.v2.MsgPrivilegedExecuteContract`})}),_jsx(_components.td,{children:`Lets the contract open or close taker-side derivative positions`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Taker`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/injective.exchange.v2.MsgBatchUpdateOrders`})}),_jsx(_components.td,{children:`Reserved exchange permission used by taker settlement paths`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Taker`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/cosmos.bank.v1beta1.MsgSend`})}),_jsx(_components.td,{children:`Lets the contract move taker margin during settlement`})]})]})]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`MsgWithdraw`}),` appears in some contract notes as a canonical grant, but the current working setup intentionally omits it. The active settlement path does not exercise it, and granting unused permissions increases attack surface. If a future contract path requires a new message type, add it only after verifying the deployed contract and runbook.`]})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`grant-all-testnet-permissions`,children:`Grant all testnet permissions`}),`\n`,_jsxs(_components.p,{children:[`The script below grants the working testnet set for one maker wallet and one taker wallet. The shell wrapper loads `,_jsx(_components.code,{children:`.env`}),` before running the Python script so the private keys are present.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`set`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -a`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`.`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ./.env`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`set`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` +a`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`python`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` grant_all.py`})]}),`\n`]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`43`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`43`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` asyncio`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` os`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`os.environ[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"RFQ_ENV\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`] `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"testnet\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` rfq_test.config `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` get_environment_config`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` rfq_test.clients.chain `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ChainClient`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`env `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` get_environment_config()`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`CONTRACT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` env.contract.address`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`async`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` grant_all`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`():`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` chain `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ChainClient(env.chain)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` chain.connect()`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` grants `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Maker`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (os.getenv(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"TESTNET_MM_PRIVATE_KEY\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`), `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/injective.exchange.v2.MsgPrivilegedExecuteContract\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (os.getenv(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"TESTNET_MM_PRIVATE_KEY\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`), `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/cosmos.bank.v1beta1.MsgSend\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Taker`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (os.getenv(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"TESTNET_RETAIL_PRIVATE_KEY\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`), `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/injective.exchange.v2.MsgPrivilegedExecuteContract\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (os.getenv(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"TESTNET_RETAIL_PRIVATE_KEY\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`), `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/injective.exchange.v2.MsgBatchUpdateOrders\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (os.getenv(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"TESTNET_RETAIL_PRIVATE_KEY\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`), `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/cosmos.bank.v1beta1.MsgSend\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` for`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` private_key, msg_type `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`in`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` grants:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` not`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` private_key:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` raise`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` RuntimeError`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`f`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"missing private key for `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`{`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`msg_type`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` tx_hash `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` chain.grant_authz(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` private_key`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`private_key,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` grantee`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`CONTRACT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` msg_type`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`msg_type,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` )`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` print`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`f`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Granted `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`{`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`msg_type`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`{`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`tx_hash`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Each grant is a separate tx. Wait for account sequence and LCD state.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` asyncio.sleep(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`3`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` chain.close()`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`asyncio.run(grant_all())`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Submit grant transactions sequentially. Parallel grant broadcasts commonly fail with account sequence mismatch errors.`}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`verify-grants`,children:`Verify grants`}),`\n`,_jsx(_components.p,{children:`Use the Injective LCD to confirm grants before running settlement tests.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`9`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`9`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Maker grants`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -s`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://testnet.sentry.lcd.injective.network/cosmos/authz/v1beta1/grants?granter=\u003cMM_ADDR>\u0026grantee=inj1qw7jk82hjvf79tnjykux6zacuh9gl0z0wl3ruk\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` python3`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -m`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` json.tool`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Taker grants`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -s`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://testnet.sentry.lcd.injective.network/cosmos/authz/v1beta1/grants?granter=\u003cTAKER_ADDR>\u0026grantee=inj1qw7jk82hjvf79tnjykux6zacuh9gl0z0wl3ruk\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` python3`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -m`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` json.tool`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Expected result:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Maker grants include `,_jsx(_components.code,{children:`MsgPrivilegedExecuteContract`}),` and `,_jsx(_components.code,{children:`MsgSend`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Taker grants include `,_jsx(_components.code,{children:`MsgPrivilegedExecuteContract`}),`, `,_jsx(_components.code,{children:`MsgBatchUpdateOrders`}),`, and `,_jsx(_components.code,{children:`MsgSend`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.code,{children:`grantee`}),` is the current RFQ contract address.`]}),`\n`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`direct-genericauthorization`,children:`Direct GenericAuthorization`}),`\n`,_jsxs(_components.p,{children:[`If your Injective SDK helper forces an expiration or uses a specialized authorization, build the grant manually as `,_jsx(_components.code,{children:`GenericAuthorization`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`21`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`21`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` google.protobuf `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` any_pb2`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` pyinjective.proto.cosmos.authz.v1beta1 `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` authz_pb2`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` pyinjective.proto.cosmos.authz.v1beta1 `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` tx_pb2 `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`as`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` authz_tx_pb2`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` create_grant_msg`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`granter`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`grantee`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`msg_type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` generic_authz `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` authz_pb2.GenericAuthorization()`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` generic_authz.msg `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` msg_type`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` authz_any `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` any_pb2.Any()`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` authz_any.type_url `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"/cosmos.authz.v1beta1.GenericAuthorization\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` authz_any.value `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` generic_authz.SerializeToString()`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` grant `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` authz_pb2.Grant()`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` grant.authorization.CopyFrom(authz_any)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Leave grant.expiration unset if you want no expiration.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` grant_msg `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` authz_tx_pb2.MsgGrant()`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` grant_msg.granter `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` granter`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` grant_msg.grantee `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` grantee`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` grant_msg.grant.CopyFrom(grant)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` grant_msg`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Use gas heuristics for grant broadcasts. Simulation can under-estimate grant transaction gas and produce avoidable failures.`}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`revoking-grants`,children:`Revoking grants`}),`\n`,_jsxs(_components.p,{children:[`Revoking `,_jsx(_components.code,{children:`MsgPrivilegedExecuteContract`}),` is the fastest kill switch. It prevents future contract-initiated settlements for that wallet.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` chain.revoke_authz(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` private_key`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`PRIVATE_KEY`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` grantee`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`CONTRACT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` msg_type`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/injective.exchange.v2.MsgPrivilegedExecuteContract\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Revocation does not close open positions. It only prevents future TrueCurrent contract settlement actions for that wallet.`}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`security-checklist`,children:`Security checklist`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Use dedicated maker and taker wallets.`}),`\n`,_jsx(_components.li,{children:`Grant only the message types listed above.`}),`\n`,_jsx(_components.li,{children:`Grant only to the current RFQ contract address.`}),`\n`,_jsx(_components.li,{children:`Re-verify grants after contract upgrades.`}),`\n`,_jsx(_components.li,{children:`Keep a revocation path ready before going live.`}),`\n`,_jsx(_components.li,{children:`Monitor grant presence at bot startup.`}),`\n`,_jsxs(_components.li,{children:[`Re-run grant setup if settlement fails with `,_jsx(_components.code,{children:`unauthorized`}),` or `,_jsx(_components.code,{children:`authorization not found`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`For the broader trust model, see `,_jsx(_components.a,{href:`/technical/authz-model`,children:`Authorization model`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Authorization setup","description":"Grant the TrueCurrent RFQ contract the narrow Injective authz permissions required for taker and maker SDK settlement.","updatedAt":"2026-05-27","href":"/sdk-trading/authz"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Required grants","slug":"required-grants","depth":2,"children":[]},{"title":"Grant all testnet permissions","slug":"grant-all-testnet-permissions","depth":2,"children":[]},{"title":"Verify grants","slug":"verify-grants","depth":2,"children":[]},{"title":"Direct GenericAuthorization","slug":"direct-genericauthorization","depth":2,"children":[]},{"title":"Revoking grants","slug":"revoking-grants","depth":2,"children":[]},{"title":"Security checklist","slug":"security-checklist","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"injectivelabs-2","siteName":"TrueCurrent Docs","title":"Authorization setup - TrueCurrent Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/sdk-trading/authz","matchLevel":0}}},"lastModified":"2026-05-29T02:15:24.934Z","gitLastModified":"2026-05-28T17:03:14.000Z","originalFileLocation":"sdk-trading/authz.md","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Grant the TrueCurrent RFQ contract the narrow Injective authz permissions required for taker and maker SDK settlement.\">\u003cmeta data-mint-head name=\"application-name\" content=\"TrueCurrent Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://mintcdn.com/injectivelabs-2/TAi2KoKzFwI2tA_y/img/logo-dark.png?fit=max\u0026amp;auto=format\u0026amp;n=TAi2KoKzFwI2tA_y\u0026amp;q=85\u0026amp;s=7c10937abcc9d1b46db1ed3b71bb9288\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://mintcdn.com/injectivelabs-2/TAi2KoKzFwI2tA_y/img/logo-dark.png?fit=max\u0026amp;auto=format\u0026amp;n=TAi2KoKzFwI2tA_y\u0026amp;q=85\u0026amp;s=7c10937abcc9d1b46db1ed3b71bb9288\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://mintcdn.com/injectivelabs-2/TAi2KoKzFwI2tA_y/img/logo-dark.png?fit=max\u0026amp;auto=format\u0026amp;n=TAi2KoKzFwI2tA_y\u0026amp;q=85\u0026amp;s=7c10937abcc9d1b46db1ed3b71bb9288\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/png\" href=\"https://mintcdn.com/injectivelabs-2/TAi2KoKzFwI2tA_y/img/logo-dark.png?fit=max\u0026amp;auto=format\u0026amp;n=TAi2KoKzFwI2tA_y\u0026amp;q=85\u0026amp;s=7c10937abcc9d1b46db1ed3b71bb9288\">\u003cmeta data-mint-head property=\"og:title\" content=\"Authorization setup - TrueCurrent Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Grant the TrueCurrent RFQ contract the narrow Injective authz permissions required for taker and maker SDK settlement.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"TrueCurrent Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.tc.xyz/sdk-trading/authz\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://injectivelabs-2.mintlify.site/_mintlify/api/og/v2?division=SDK+Trading\u0026amp;title=Authorization+setup\u0026amp;description=Grant+the+TrueCurrent+RFQ+contract+the+narrow+Injective+authz+permissions+required+for+taker+and+maker+SDK+settlement.\u0026amp;theme=e3bdd70339167c669e270528\u0026amp;signature=0a4f9f1da8419cba999896a2ee8bf9cbec3861f11fa0f0630620fc696658060d\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Authorization setup - TrueCurrent Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Grant the TrueCurrent RFQ contract the narrow Injective authz permissions required for taker and maker SDK settlement.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://injectivelabs-2.mintlify.site/_mintlify/api/og/v2?division=SDK+Trading\u0026amp;title=Authorization+setup\u0026amp;description=Grant+the+TrueCurrent+RFQ+contract+the+narrow+Injective+authz+permissions+required+for+taker+and+maker+SDK+settlement.\u0026amp;theme=e3bdd70339167c669e270528\u0026amp;signature=0a4f9f1da8419cba999896a2ee8bf9cbec3861f11fa0f0630620fc696658060d\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/injectivelabs-2/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"TrueCurrent Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#fd9a00\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.tc.xyz/sdk-trading/authz\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/sdk-trading/authz.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.tc.xyz/#organization\",\"name\":\"TrueCurrent Docs\",\"url\":\"https://docs.tc.xyz\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/injectivelabs-2/TAi2KoKzFwI2tA_y/img/logo-light.png?fit=max\u0026auto=format\u0026n=TAi2KoKzFwI2tA_y\u0026q=85\u0026s=f7446d955d9b68fa400415f663de20d1\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.tc.xyz#website\",\"name\":\"TrueCurrent Docs\",\"url\":\"https://docs.tc.xyz\",\"publisher\":{\"@id\":\"https://docs.tc.xyz/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.tc.xyz/sdk-trading/authz#webpage\",\"url\":\"https://docs.tc.xyz/sdk-trading/authz\",\"name\":\"Authorization setup\",\"description\":\"Grant the TrueCurrent RFQ contract the narrow Injective authz permissions required for taker and maker SDK settlement.\",\"dateModified\":\"2026-05-28T17:03:14.000Z\",\"isPartOf\":{\"@id\":\"https://docs.tc.xyz#website\"},\"breadcrumb\":{\"@id\":\"https://docs.tc.xyz/sdk-trading/authz#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.tc.xyz/sdk-trading/authz#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"TRUECURRENT\",\"item\":\"https://docs.tc.xyz\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SDK Trading\",\"item\":\"https://docs.tc.xyz/sdk-trading/overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Authorization setup\",\"item\":\"https://docs.tc.xyz/sdk-trading/authz\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.tc.xyz/sdk-trading/authz#article\",\"headline\":\"Authorization setup\",\"name\":\"Authorization setup\",\"description\":\"Grant the TrueCurrent RFQ contract the narrow Injective authz permissions required for taker and maker SDK settlement.\",\"url\":\"https://docs.tc.xyz/sdk-trading/authz\",\"mainEntityOfPage\":{\"@id\":\"https://docs.tc.xyz/sdk-trading/authz#webpage\"},\"dateModified\":\"2026-05-28T17:03:14.000Z\",\"publisher\":{\"@id\":\"https://docs.tc.xyz/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.tc.xyz#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"TrueCurrent Docs\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"TrueCurrent Docs\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/sdk-trading/authz.md","siteName":"TrueCurrent Docs","nav":{"global":null,"languages":[{"language":"en","groups":[{"group":"TRUECURRENT","pages":[{"title":"About TrueCurrent","href":""},{"group":"Overview","icon":"","expanded":false,"pages":[{"title":"How TrueCurrent works","href":"/overview/how-it-works"},{"title":"Why TrueCurrent","href":"/overview/why-truecurrent"},{"title":"RFQ explained","href":"/overview/rfq-explained"}]},{"group":"Getting Started","icon":"","expanded":false,"pages":[{"title":"Connect your wallet","href":"/getting-started/connect-wallet"},{"title":"Deposit funds","href":"/getting-started/deposit-funds"},{"title":"Your first trade","href":"/getting-started/first-trade"},{"title":"How referrals work","hidden":true,"href":"/getting-started/how-referrals-work"}]},{"group":"Mobile","expanded":false,"pages":[{"title":"TrueCurrent Mobile","href":"/mobile/overview"},{"title":"Download \u0026 install","href":"/mobile/download-and-install"},{"title":"Create an account \u0026 sign in","href":"/mobile/create-account"},{"title":"Navigating the app","href":"/mobile/app-navigation"},{"title":"Trading on mobile","href":"/mobile/trading"},{"title":"Deposits \u0026 withdrawals","href":"/mobile/deposits-and-withdrawals"},{"title":"Push notifications","href":"/mobile/notifications"},{"title":"Security \u0026 settings","href":"/mobile/security"},{"title":"Mobile FAQ","href":"/mobile/faq"}]},{"group":"Predictions","icon":"","expanded":false,"pages":[{"title":"Enable Predictions","href":"/predictions/enable-predictions"},{"title":"Fund Your Prediction Account","href":"/predictions/fund-account"},{"title":"Make a Prediction","href":"/predictions/make-a-prediction"}]},{"group":"Trading","icon":"","expanded":false,"pages":[{"title":"How to trade","href":"/trading/how-to-trade"},{"title":"Understanding quotes","href":"/trading/understanding-quotes"},{"title":"Order types","href":"/trading/order-types"},{"title":"Perpetual markets","href":"/trading/perpetual-markets"},{"title":"Oracle feed sources","href":"/trading/oracle-feed-sources"},{"title":"Roll Schedules","href":"/trading/roll-schedules"},{"title":"Index, mark, and quoted prices","href":"/trading/prices"},{"title":"Trigger orders (TP/SL)","href":"/trading/trigger-orders"},{"title":"Funding rates","href":"/trading/funding-rates"},{"title":"Fees","href":"/trading/fees"},{"title":"Margin trading","href":"/trading/margin-trading"},{"title":"Liquidation","href":"/trading/liquidation"},{"title":"Auto-deleveraging (ADL)","href":"/trading/adl"},{"title":"Price tolerance","href":"/trading/slippage-and-worst-price"}]},{"group":"Social","icon":"","expanded":false,"pages":[{"title":"Discover traders","href":"/social/leaderboard"},{"title":"Create your public profile","href":"/social/create-profile"},{"title":"View and follow traders","href":"/social/trader-profiles"}]},{"group":"SDK Trading","icon":"","expanded":false,"pages":[{"title":"Intro to SDK Trading","href":"/sdk-trading/overview"},{"title":"SDK architecture","href":"/sdk-trading/architecture"},{"title":"Testnet configuration","description":"Endpoint, contract, token, EIP-712, and market configuration reference for TrueCurrent RFQ SDK integrations on testnet.","href":"/sdk-trading/testnet-configuration"},{"title":"Authorization setup","href":"/sdk-trading/authz"},{"title":"Runbook","description":"Procedural testnet checklist for validating TrueCurrent RFQ taker, maker, settlement, and TP/SL signed-intent integrations.","href":"/sdk-trading/runbook"},{"group":"Takers","icon":"","expanded":false,"pages":[{"title":"Taker SDK trading","href":"/sdk-trading/takers"},{"title":"Quickstart","href":"/sdk-trading/taker-quickstart"},{"title":"TakerStream","href":"/sdk-trading/taker-stream"},{"title":"Accepting quotes","href":"/sdk-trading/accepting-quotes"},{"title":"Signed taker intents (TP/SL)","href":"/sdk-trading/signed-intents"},{"title":"Taker best practices","href":"/sdk-trading/taker-best-practices"}]},{"group":"Makers","icon":"","expanded":false,"pages":[{"title":"Maker SDK trading","href":"/sdk-trading/makers"},{"title":"Maker whitelist","href":"/sdk-trading/maker-whitelist"},{"title":"Maker setup","href":"/sdk-trading/maker-setup"},{"title":"MakerStream","href":"/sdk-trading/maker-stream"},{"title":"RFQ requests","href":"/sdk-trading/rfq-requests"},{"title":"Building \u0026 signing quotes","href":"/sdk-trading/signing-quotes"},{"title":"Sending quotes","href":"/sdk-trading/sending-quotes"},{"title":"Quoting guidelines","href":"/sdk-trading/quoting-guidelines"}]},{"title":"Protocol reference","href":"/sdk-trading/protocol-reference"},{"title":"Reference implementations","href":"/sdk-trading/reference-implementations"},{"title":"Troubleshooting","href":"/sdk-trading/troubleshooting"}]},{"group":"Technical","icon":"","expanded":false,"pages":[{"title":"Architecture","href":"/technical/architecture"},{"title":"How RFQ works","href":"/technical/how-rfq-works"},{"title":"Smart contract","href":"/technical/smart-contract"},{"title":"WebSocket streams","href":"/technical/websocket-streams"},{"title":"Authorization model","href":"/technical/authz-model"},{"title":"Error reference","href":"/technical/error-reference"}]},{"title":"Frequently asked questions","href":"/faq"},{"title":"Glossary","href":"/glossary"},{"title":"Support","href":"/support"},{"group":"TrueCurrent News","icon":"newspaper","expanded":false,"pages":[]}]}]}]},"basePath":"","title":"Authorization setup - TrueCurrent Docs","buildId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","deploymentId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","dynamics":[],"chunks":[]}