[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"navigation":3,"\u002Fbuild\u002Ftreasury-guide":260,"\u002Fbuild\u002Ftreasury-guide-surround":1782},[4,22,105,148,177,186,243],{"title":5,"path":6,"stem":7,"children":8,"page":21},"Agents","\u002Fagents","agents",[9,13,17],{"title":10,"path":11,"stem":12},"LLMs.txt","\u002Fagents\u002Fllms-txt","agents\u002Fllms-txt",{"title":14,"path":15,"stem":16},"MCP Server","\u002Fagents\u002Fmcp-server","agents\u002Fmcp-server",{"title":18,"path":19,"stem":20},"Skills","\u002Fagents\u002Fskills","agents\u002Fskills",false,{"title":23,"path":24,"stem":25,"children":26,"page":21},"Api Reference","\u002Fapi-reference","api-reference",[27,31,35,68],{"title":28,"path":29,"stem":30},"Authentication","\u002Fapi-reference\u002Fauthentication","api-reference\u002Fauthentication",{"title":32,"path":33,"stem":34},"API Reference","\u002Fapi-reference\u002Fintroduction","api-reference\u002Fintroduction",{"title":36,"path":37,"stem":38,"children":39,"page":21},"Orchestration","\u002Fapi-reference\u002Forchestration","api-reference\u002Forchestration",[40,44,48,52,56,60,64],{"title":41,"path":42,"stem":43},"POST \u002Fcancel-order","\u002Fapi-reference\u002Forchestration\u002Fcancel-order","api-reference\u002Forchestration\u002Fcancel-order",{"title":45,"path":46,"stem":47},"GET \u002Forder-status\u002F{orderId}","\u002Fapi-reference\u002Forchestration\u002Forder-status","api-reference\u002Forchestration\u002Forder-status",{"title":49,"path":50,"stem":51},"GET \u002Forders","\u002Fapi-reference\u002Forchestration\u002Forders","api-reference\u002Forchestration\u002Forders",{"title":53,"path":54,"stem":55},"Orchestration API","\u002Fapi-reference\u002Forchestration\u002Foverview","api-reference\u002Forchestration\u002Foverview",{"title":57,"path":58,"stem":59},"POST \u002Fquote","\u002Fapi-reference\u002Forchestration\u002Fquote","api-reference\u002Forchestration\u002Fquote",{"title":61,"path":62,"stem":63},"GET \u002Fsupported-assets","\u002Fapi-reference\u002Forchestration\u002Fsupported-assets","api-reference\u002Forchestration\u002Fsupported-assets",{"title":65,"path":66,"stem":67},"TypeScript Type Generation","\u002Fapi-reference\u002Forchestration\u002Ftype-generation","api-reference\u002Forchestration\u002Ftype-generation",{"title":69,"path":70,"stem":71,"children":72,"page":21},"Recipes","\u002Fapi-reference\u002Frecipes","api-reference\u002Frecipes",[73,77,81,85,89,93,97,101],{"title":74,"path":75,"stem":76},"Collateral Composition","\u002Fapi-reference\u002Frecipes\u002Fcollateral-composition","api-reference\u002Frecipes\u002Fcollateral-composition",{"title":78,"path":79,"stem":80},"Daily Yields","\u002Fapi-reference\u002Frecipes\u002Fdaily-yields","api-reference\u002Frecipes\u002Fdaily-yields",{"title":82,"path":83,"stem":84},"Earner Rate History","\u002Fapi-reference\u002Frecipes\u002Fearner-rate-history","api-reference\u002Frecipes\u002Fearner-rate-history",{"title":86,"path":87,"stem":88},"Minter Daily Expenses","\u002Fapi-reference\u002Frecipes\u002Fminter-daily-expenses","api-reference\u002Frecipes\u002Fminter-daily-expenses",{"title":90,"path":91,"stem":92},"Network Supply","\u002Fapi-reference\u002Frecipes\u002Fnetwork-supply","api-reference\u002Frecipes\u002Fnetwork-supply",{"title":94,"path":95,"stem":96},"Protocol Configuration","\u002Fapi-reference\u002Frecipes\u002Fprotocol-config","api-reference\u002Frecipes\u002Fprotocol-config",{"title":98,"path":99,"stem":100},"Token Holders","\u002Fapi-reference\u002Frecipes\u002Ftoken-holders","api-reference\u002Frecipes\u002Ftoken-holders",{"title":102,"path":103,"stem":104},"Token Overview","\u002Fapi-reference\u002Frecipes\u002Ftoken-overview","api-reference\u002Frecipes\u002Ftoken-overview",{"title":106,"path":107,"stem":108,"children":109,"page":21},"Build","\u002Fbuild","build",[110,114,118,122,126,130,134,138,142,145],{"title":111,"path":112,"stem":113},"Integrating with the M0 Portals","\u002Fbuild\u002Fbridging-developer","build\u002Fbridging-developer",{"title":115,"path":116,"stem":117},"Bridging M And wM Tokens","\u002Fbuild\u002Fbridging-user","build\u002Fbridging-user",{"title":119,"path":120,"stem":121},"Stablecoin Extension Templates","\u002Fbuild\u002Fchoosing-your-model","build\u002Fchoosing-your-model",{"title":123,"path":124,"stem":125},"How to Design Your Stablecoin","\u002Fbuild\u002Foverview","build\u002Foverview",{"title":127,"path":128,"stem":129},"Implementation Guide: NoYield","\u002Fbuild\u002Fsvm-noyield-guide","build\u002Fsvm-noyield-guide",{"title":131,"path":132,"stem":133},"Getting started","\u002Fbuild\u002Fsvm-noyield-guide-overview","build\u002Fsvm-noyield-guide-overview",{"title":135,"path":136,"stem":137},"Implementation Guide: MYieldToOne (Onshore)","\u002Fbuild\u002Ftreasury-guide","build\u002Ftreasury-guide",{"title":139,"path":140,"stem":141},"Implementation Guide: JMI (Offshore)","\u002Fbuild\u002Ftreasury-jmi-guide","build\u002Ftreasury-jmi-guide",{"title":131,"path":143,"stem":144},"\u002Fbuild\u002Ftreasury-jmi-overview","build\u002Ftreasury-jmi-overview",{"title":131,"path":146,"stem":147},"\u002Fbuild\u002Ftreasury-model","build\u002Ftreasury-model",{"title":149,"path":150,"stem":151,"children":152,"page":21},"Get Started","\u002Fget-started","get-started",[153,157,161,165,169,173],{"title":154,"path":155,"stem":156},"Accessing Liquidity","\u002Fget-started\u002Faccessing-liquidity","get-started\u002Faccessing-liquidity",{"title":158,"path":159,"stem":160},"Cross Chain Interoperability","\u002Fget-started\u002Fcross-chain","get-started\u002Fcross-chain",{"title":162,"path":163,"stem":164},"Architecture Overview","\u002Fget-started\u002Fhow-it-works","get-started\u002Fhow-it-works",{"title":166,"path":167,"stem":168},"Overview","\u002Fget-started\u002Foverview","get-started\u002Foverview",{"title":170,"path":171,"stem":172},"Platform Mechanics & Reward Programmability","\u002Fget-started\u002Fprotocol-mechanics","get-started\u002Fprotocol-mechanics",{"title":174,"path":175,"stem":176},"Stablecoin Features","\u002Fget-started\u002Fstablecoin-features","get-started\u002Fstablecoin-features",{"title":178,"path":179,"stem":180,"children":181,"page":21},"Issuers","\u002Fissuers","issuers",[182],{"title":183,"path":184,"stem":185},"Issue Your Stablecoin","\u002Fissuers\u002Foverview","issuers\u002Foverview",{"title":187,"path":188,"stem":189,"children":190,"page":21},"Protocol","\u002Fprotocol","protocol",[191,195,199,203,207,211,215,219,223,227,231,235,239],{"title":192,"path":193,"stem":194},"Distribution Vault","\u002Fprotocol\u002Fdistribution-vault","protocol\u002Fdistribution-vault",{"title":196,"path":197,"stem":198},"M0 Extensions","\u002Fprotocol\u002Fextensions","protocol\u002Fextensions",{"title":200,"path":201,"stem":202},"Limit Order Protocol","\u002Fprotocol\u002Flimit-order-protocol","protocol\u002Flimit-order-protocol",{"title":204,"path":205,"stem":206},"M0 Portals","\u002Fprotocol\u002Fm-portals","protocol\u002Fm-portals",{"title":208,"path":209,"stem":210},"M Token","\u002Fprotocol\u002Fm-token","protocol\u002Fm-token",{"title":212,"path":213,"stem":214},"M Token Specification","\u002Fprotocol\u002Fm-token-spec","protocol\u002Fm-token-spec",{"title":216,"path":217,"stem":218},"Minting & Burning (MinterGateway)","\u002Fprotocol\u002Fminting-burning","protocol\u002Fminting-burning",{"title":220,"path":221,"stem":222},"Portal V2","\u002Fprotocol\u002Fportal-v2","protocol\u002Fportal-v2",{"title":224,"path":225,"stem":226},"Rate Models & Yield","\u002Fprotocol\u002Frate-models","protocol\u002Frate-models",{"title":228,"path":229,"stem":230},"Roles","\u002Fprotocol\u002Froles","protocol\u002Froles",{"title":232,"path":233,"stem":234},"M0 On Solana","\u002Fprotocol\u002Fsolana","protocol\u002Fsolana",{"title":236,"path":237,"stem":238},"Wrapped M (wM)","\u002Fprotocol\u002Fwrapped-m","protocol\u002Fwrapped-m",{"title":240,"path":241,"stem":242},"Wrapped M Specification","\u002Fprotocol\u002Fwrapped-m-spec","protocol\u002Fwrapped-m-spec",{"title":244,"path":245,"stem":246,"children":247,"page":21},"Resources","\u002Fresources","resources",[248,252,256],{"title":249,"path":250,"stem":251},"Deployments","\u002Fresources\u002Faddresses","resources\u002Faddresses",{"title":253,"path":254,"stem":255},"Audits","\u002Fresources\u002Faudits","resources\u002Faudits",{"title":257,"path":258,"stem":259},"Glossary","\u002Fresources\u002Fglossary","resources\u002Fglossary",{"id":261,"title":135,"body":262,"description":1776,"extension":1777,"links":1778,"meta":1779,"navigation":541,"path":136,"seo":1780,"stem":137,"__hash__":1781},"docs\u002Fbuild\u002Ftreasury-guide.md",{"type":263,"value":264,"toc":1762},"minimark",[265,274,285,300,305,311,316,323,496,500,510,520,692,697,754,768,772,779,969,973,976,1227,1231,1234,1256,1263,1267,1270,1285,1289,1293,1362,1366,1423,1427,1430,1474,1478,1485,1500,1503,1507,1511,1604,1608,1611,1684,1688,1692,1718,1722,1740,1746,1750,1758],[266,267,268,269,273],"p",{},"Deploy a Treasury Model stablecoin where 100% of rewards are captured by the use case owner. This guide covers the EVM implementation using ",[270,271,272],"code",{},"MYieldToOne",".",[266,275,276,277,284],{},"If you haven't already, please review the ",[278,279,280],"a",{"href":146},[281,282,283],"strong",{},"Treasury Model Deep Dive"," for conceptual details about this model and its implementations.",[286,287,288],"note",{},[266,289,290,291,293,294,299],{},"This guide covers the standard ",[270,292,272],{}," implementation. If you need to accept additional stablecoins (USDC, USDT, DAI), see the ",[278,295,296],{"href":140},[281,297,298],{},"JMI Implementation Guide"," instead.",[301,302,304],"h2",{"id":303},"evm-implementation-myieldtoone","EVM Implementation: MYieldToOne",[266,306,307,308,310],{},"This section covers deploying the ",[270,309,272],{}," contract on EVM chains (Ethereum, Base, Arbitrum, etc.).",[312,313,315],"h3",{"id":314},"_1-setup-your-environment","1. Setup Your Environment",[266,317,318,319,322],{},"First, you'll need to clone the ",[270,320,321],{},"m-extensions"," repository and set up your development environment:",[324,325,326,367,382],"ol",{},[327,328,329,332],"li",{},[281,330,331],{},"Clone the repository:",[333,334,339],"pre",{"className":335,"code":336,"language":337,"meta":338,"style":338},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https:\u002F\u002Fgithub.com\u002Fm0-foundation\u002Fm-extensions.git\ncd m-extensions\n","bash","",[270,340,341,357],{"__ignoreMap":338},[342,343,346,350,354],"span",{"class":344,"line":345},"line",1,[342,347,349],{"class":348},"sBMFI","git",[342,351,353],{"class":352},"sfazB"," clone",[342,355,356],{"class":352}," https:\u002F\u002Fgithub.com\u002Fm0-foundation\u002Fm-extensions.git\n",[342,358,360,364],{"class":344,"line":359},2,[342,361,363],{"class":362},"s2Zo4","cd",[342,365,366],{"class":352}," m-extensions\n",[327,368,369,372,373,381],{},[281,370,371],{},"Follow the setup instructions:"," Refer to the ",[278,374,378],{"href":375,"rel":376},"https:\u002F\u002Fgithub.com\u002Fm0-foundation\u002Fm-extensions\u002Fblob\u002Fmain\u002FREADME.md",[377],"nofollow",[281,379,380],{},"README.md"," and follow all the commands provided to install dependencies and configure your development environment.",[327,383,384,387,388,391,392,461,464,465,467,468,471,472],{},[281,385,386],{},"Configure Environment Variables:"," Create a ",[270,389,390],{},".env"," file in the root directory:\n",[333,393,395],{"className":335,"code":394,"language":337,"meta":338,"style":338},"# Private key for deployment (include 0x prefix)\nPRIVATE_KEY=0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n# RPC URLs\nMAINNET_RPC_URL=https:\u002F\u002Feth-mainnet.alchemyapi.io\u002Fv2\u002Fyour-api-key\nSEPOLIA_RPC_URL=https:\u002F\u002Feth-sepolia.alchemyapi.io\u002Fv2\u002Fyour-api-key\n# Etherscan API key for verification\nETHERSCAN_API_KEY=your-etherscan-api-key\n",[270,396,397,403,416,422,433,444,450],{"__ignoreMap":338},[342,398,399],{"class":344,"line":345},[342,400,402],{"class":401},"sHwdD","# Private key for deployment (include 0x prefix)\n",[342,404,405,409,413],{"class":344,"line":359},[342,406,408],{"class":407},"sTEyZ","PRIVATE_KEY",[342,410,412],{"class":411},"sMK4o","=",[342,414,415],{"class":352},"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n",[342,417,419],{"class":344,"line":418},3,[342,420,421],{"class":401},"# RPC URLs\n",[342,423,425,428,430],{"class":344,"line":424},4,[342,426,427],{"class":407},"MAINNET_RPC_URL",[342,429,412],{"class":411},[342,431,432],{"class":352},"https:\u002F\u002Feth-mainnet.alchemyapi.io\u002Fv2\u002Fyour-api-key\n",[342,434,436,439,441],{"class":344,"line":435},5,[342,437,438],{"class":407},"SEPOLIA_RPC_URL",[342,440,412],{"class":411},[342,442,443],{"class":352},"https:\u002F\u002Feth-sepolia.alchemyapi.io\u002Fv2\u002Fyour-api-key\n",[342,445,447],{"class":344,"line":446},6,[342,448,449],{"class":401},"# Etherscan API key for verification\n",[342,451,453,456,458],{"class":344,"line":452},7,[342,454,455],{"class":407},"ETHERSCAN_API_KEY",[342,457,412],{"class":411},[342,459,460],{"class":352},"your-etherscan-api-key\n",[281,462,463],{},"Security Warning:"," Never commit your ",[270,466,390],{}," file to version control. Add it to your ",[270,469,470],{},".gitignore",":\n",[333,473,475],{"className":335,"code":474,"language":337,"meta":338,"style":338},"echo \".env\" >> .gitignore\n",[270,476,477],{"__ignoreMap":338},[342,478,479,482,485,487,490,493],{"class":344,"line":345},[342,480,481],{"class":362},"echo",[342,483,484],{"class":411}," \"",[342,486,390],{"class":352},[342,488,489],{"class":411},"\"",[342,491,492],{"class":411}," >>",[342,494,495],{"class":352}," .gitignore\n",[312,497,499],{"id":498},"_2-create-and-initialize-your-contract","2. Create and Initialize Your Contract",[266,501,502,503,505,506,509],{},"Your custom extension contract will inherit from ",[270,504,272],{},". The most important step is the ",[270,507,508],{},"initialize"," function, where you configure your token's name, symbol, and access control roles.",[266,511,512,513,516,517,273],{},"Create a new file in the ",[270,514,515],{},"src\u002F"," directory, for example, ",[270,518,519],{},"MyTreasuryToken.sol",[333,521,525],{"className":522,"code":523,"language":524,"meta":338,"style":338},"language-solidity shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F SPDX-License-Identifier: BUSL-1.1\npragma solidity 0.8.26;\n\nimport { MYieldToOne } from \".\u002Fprojects\u002FyieldToOne\u002FMYieldToOne.sol\";\n\ncontract MyTreasuryToken is MYieldToOne {\n    \u002F\u002F\u002F @custom:oz-upgrades-unsafe-allow constructor\n    constructor(address mToken_, address swapFacility_) MYieldToOne(mToken_, swapFacility_) {\n        _disableInitializers();\n    }\n\n    function initialize(\n        string memory name,\n        string memory symbol,\n        address yieldRecipient_,\n        address admin,\n        address freezeManager,\n        address yieldRecipientManager\n    ) public initializer {\n        MYieldToOne.initialize(\n            name,                    \u002F\u002F \"My Treasury USD\"\n            symbol,                  \u002F\u002F \"tUSD\"\n            yieldRecipient_,         \u002F\u002F Treasury wallet address\n            admin,                   \u002F\u002F Admin multisig address\n            freezeManager,           \u002F\u002F Freeze manager address (can be same as admin)\n            yieldRecipientManager    \u002F\u002F Rewards recipient manager address\n        );\n    }\n}\n","solidity",[270,526,527,532,537,543,548,552,557,562,568,574,580,585,591,597,603,609,615,621,627,633,639,645,651,657,663,669,675,681,686],{"__ignoreMap":338},[342,528,529],{"class":344,"line":345},[342,530,531],{},"\u002F\u002F SPDX-License-Identifier: BUSL-1.1\n",[342,533,534],{"class":344,"line":359},[342,535,536],{},"pragma solidity 0.8.26;\n",[342,538,539],{"class":344,"line":418},[342,540,542],{"emptyLinePlaceholder":541},true,"\n",[342,544,545],{"class":344,"line":424},[342,546,547],{},"import { MYieldToOne } from \".\u002Fprojects\u002FyieldToOne\u002FMYieldToOne.sol\";\n",[342,549,550],{"class":344,"line":435},[342,551,542],{"emptyLinePlaceholder":541},[342,553,554],{"class":344,"line":446},[342,555,556],{},"contract MyTreasuryToken is MYieldToOne {\n",[342,558,559],{"class":344,"line":452},[342,560,561],{},"    \u002F\u002F\u002F @custom:oz-upgrades-unsafe-allow constructor\n",[342,563,565],{"class":344,"line":564},8,[342,566,567],{},"    constructor(address mToken_, address swapFacility_) MYieldToOne(mToken_, swapFacility_) {\n",[342,569,571],{"class":344,"line":570},9,[342,572,573],{},"        _disableInitializers();\n",[342,575,577],{"class":344,"line":576},10,[342,578,579],{},"    }\n",[342,581,583],{"class":344,"line":582},11,[342,584,542],{"emptyLinePlaceholder":541},[342,586,588],{"class":344,"line":587},12,[342,589,590],{},"    function initialize(\n",[342,592,594],{"class":344,"line":593},13,[342,595,596],{},"        string memory name,\n",[342,598,600],{"class":344,"line":599},14,[342,601,602],{},"        string memory symbol,\n",[342,604,606],{"class":344,"line":605},15,[342,607,608],{},"        address yieldRecipient_,\n",[342,610,612],{"class":344,"line":611},16,[342,613,614],{},"        address admin,\n",[342,616,618],{"class":344,"line":617},17,[342,619,620],{},"        address freezeManager,\n",[342,622,624],{"class":344,"line":623},18,[342,625,626],{},"        address yieldRecipientManager\n",[342,628,630],{"class":344,"line":629},19,[342,631,632],{},"    ) public initializer {\n",[342,634,636],{"class":344,"line":635},20,[342,637,638],{},"        MYieldToOne.initialize(\n",[342,640,642],{"class":344,"line":641},21,[342,643,644],{},"            name,                    \u002F\u002F \"My Treasury USD\"\n",[342,646,648],{"class":344,"line":647},22,[342,649,650],{},"            symbol,                  \u002F\u002F \"tUSD\"\n",[342,652,654],{"class":344,"line":653},23,[342,655,656],{},"            yieldRecipient_,         \u002F\u002F Treasury wallet address\n",[342,658,660],{"class":344,"line":659},24,[342,661,662],{},"            admin,                   \u002F\u002F Admin multisig address\n",[342,664,666],{"class":344,"line":665},25,[342,667,668],{},"            freezeManager,           \u002F\u002F Freeze manager address (can be same as admin)\n",[342,670,672],{"class":344,"line":671},26,[342,673,674],{},"            yieldRecipientManager    \u002F\u002F Rewards recipient manager address\n",[342,676,678],{"class":344,"line":677},27,[342,679,680],{},"        );\n",[342,682,684],{"class":344,"line":683},28,[342,685,579],{},[342,687,689],{"class":344,"line":688},29,[342,690,691],{},"}\n",[693,694,696],"h4",{"id":695},"key-parameters-explained","Key Parameters Explained:",[698,699,700,708,716,722,734,744],"ul",{},[327,701,702,707],{},[281,703,704],{},[270,705,706],{},"name",": The full name of your token (e.g., \"My Treasury USD\")",[327,709,710,715],{},[281,711,712],{},[270,713,714],{},"symbol",": The token symbol (e.g., \"tUSD\")",[327,717,718,721],{},[270,719,720],{},"yieldRecipient_",": The wallet that will receive all rewards (your treasury)",[327,723,724,729,730,733],{},[281,725,726],{},[270,727,728],{},"admin",": Address with ",[270,731,732],{},"DEFAULT_ADMIN_ROLE"," (should be a multisig)",[327,735,736,729,741],{},[281,737,738],{},[270,739,740],{},"freezeManager",[270,742,743],{},"FREEZE_MANAGER_ROLE",[327,745,746,729,751],{},[281,747,748],{},[270,749,750],{},"yieldRecipientManager",[270,752,753],{},"YIELD_RECIPIENT_MANAGER_ROLE",[266,755,756,759,760,763,764,767],{},[281,757,758],{},"Note:"," The ",[270,761,762],{},"mToken"," and ",[270,765,766],{},"swapFacility"," addresses are set in the constructor as immutable variables, not in the initializer.",[312,769,771],{"id":770},"_3-write-deployment-script","3. Write Deployment Script",[266,773,774,775,778],{},"Create a deployment script in the ",[270,776,777],{},"script\u002F"," directory:",[333,780,782],{"className":522,"code":781,"language":524,"meta":338,"style":338},"\u002F\u002F SPDX-License-Identifier: BUSL-1.1\npragma solidity 0.8.26;\n\nimport { Script } from \"forge-std\u002FScript.sol\";\nimport { Upgrades } from \"openzeppelin-foundry-upgrades\u002FUpgrades.sol\";\nimport { MyTreasuryToken } from \"..\u002Fsrc\u002FMyTreasuryToken.sol\";\n\ncontract DeployMyTreasuryToken is Script {\n    function run() external {\n        uint256 deployerPrivateKey = vm.envUint(\"PRIVATE_KEY\");\n        address deployer = vm.addr(deployerPrivateKey);\n\n        vm.startBroadcast(deployerPrivateKey);\n\n        \u002F\u002F Deploying a Transparent Proxy, which requires a proxy admin.\n        address proxy = Upgrades.deployTransparentProxy(\n            \"MyTreasuryToken.sol\",          \u002F\u002F Contract file name\n            deployer,                       \u002F\u002F The admin for the proxy contract itself\n            abi.encodeCall(                 \u002F\u002F The initializer call data\n                MyTreasuryToken.initialize,\n                (\n                    \"My Treasury USD\",        \u002F\u002F name\n                    \"tUSD\",                   \u002F\u002F symbol\n                    0x...,                    \u002F\u002F rewards recipient\n                    0x...,                    \u002F\u002F admin (DEFAULT_ADMIN_ROLE for the logic)\n                    0x...,                    \u002F\u002F freezeManager\n                    0x...                     \u002F\u002F rewards recipient manager\n                )\n            )\n        );\n\n        vm.stopBroadcast();\n\n        console.log(\"MyTreasuryToken deployed at:\", proxy);\n    }\n}\n",[270,783,784,788,792,796,801,806,811,815,820,825,830,835,839,844,848,853,858,866,871,876,881,886,894,902,907,912,917,922,927,932,937,942,948,953,959,964],{"__ignoreMap":338},[342,785,786],{"class":344,"line":345},[342,787,531],{},[342,789,790],{"class":344,"line":359},[342,791,536],{},[342,793,794],{"class":344,"line":418},[342,795,542],{"emptyLinePlaceholder":541},[342,797,798],{"class":344,"line":424},[342,799,800],{},"import { Script } from \"forge-std\u002FScript.sol\";\n",[342,802,803],{"class":344,"line":435},[342,804,805],{},"import { Upgrades } from \"openzeppelin-foundry-upgrades\u002FUpgrades.sol\";\n",[342,807,808],{"class":344,"line":446},[342,809,810],{},"import { MyTreasuryToken } from \"..\u002Fsrc\u002FMyTreasuryToken.sol\";\n",[342,812,813],{"class":344,"line":452},[342,814,542],{"emptyLinePlaceholder":541},[342,816,817],{"class":344,"line":564},[342,818,819],{},"contract DeployMyTreasuryToken is Script {\n",[342,821,822],{"class":344,"line":570},[342,823,824],{},"    function run() external {\n",[342,826,827],{"class":344,"line":576},[342,828,829],{},"        uint256 deployerPrivateKey = vm.envUint(\"PRIVATE_KEY\");\n",[342,831,832],{"class":344,"line":582},[342,833,834],{},"        address deployer = vm.addr(deployerPrivateKey);\n",[342,836,837],{"class":344,"line":587},[342,838,542],{"emptyLinePlaceholder":541},[342,840,841],{"class":344,"line":593},[342,842,843],{},"        vm.startBroadcast(deployerPrivateKey);\n",[342,845,846],{"class":344,"line":599},[342,847,542],{"emptyLinePlaceholder":541},[342,849,850],{"class":344,"line":605},[342,851,852],{},"        \u002F\u002F Deploying a Transparent Proxy, which requires a proxy admin.\n",[342,854,855],{"class":344,"line":611},[342,856,857],{},"        address proxy = Upgrades.deployTransparentProxy(\n",[342,859,860,863],{"class":344,"line":617},[342,861,862],{},"            \"MyTreasuryToken.sol\",",[342,864,865],{},"          \u002F\u002F Contract file name\n",[342,867,868],{"class":344,"line":623},[342,869,870],{},"            deployer,                       \u002F\u002F The admin for the proxy contract itself\n",[342,872,873],{"class":344,"line":629},[342,874,875],{},"            abi.encodeCall(                 \u002F\u002F The initializer call data\n",[342,877,878],{"class":344,"line":635},[342,879,880],{},"                MyTreasuryToken.initialize,\n",[342,882,883],{"class":344,"line":641},[342,884,885],{},"                (\n",[342,887,888,891],{"class":344,"line":647},[342,889,890],{},"                    \"My Treasury USD\",",[342,892,893],{},"        \u002F\u002F name\n",[342,895,896,899],{"class":344,"line":653},[342,897,898],{},"                    \"tUSD\",",[342,900,901],{},"                   \u002F\u002F symbol\n",[342,903,904],{"class":344,"line":659},[342,905,906],{},"                    0x...,                    \u002F\u002F rewards recipient\n",[342,908,909],{"class":344,"line":665},[342,910,911],{},"                    0x...,                    \u002F\u002F admin (DEFAULT_ADMIN_ROLE for the logic)\n",[342,913,914],{"class":344,"line":671},[342,915,916],{},"                    0x...,                    \u002F\u002F freezeManager\n",[342,918,919],{"class":344,"line":677},[342,920,921],{},"                    0x...                     \u002F\u002F rewards recipient manager\n",[342,923,924],{"class":344,"line":683},[342,925,926],{},"                )\n",[342,928,929],{"class":344,"line":688},[342,930,931],{},"            )\n",[342,933,935],{"class":344,"line":934},30,[342,936,680],{},[342,938,940],{"class":344,"line":939},31,[342,941,542],{"emptyLinePlaceholder":541},[342,943,945],{"class":344,"line":944},32,[342,946,947],{},"        vm.stopBroadcast();\n",[342,949,951],{"class":344,"line":950},33,[342,952,542],{"emptyLinePlaceholder":541},[342,954,956],{"class":344,"line":955},34,[342,957,958],{},"        console.log(\"MyTreasuryToken deployed at:\", proxy);\n",[342,960,962],{"class":344,"line":961},35,[342,963,579],{},[342,965,967],{"class":344,"line":966},36,[342,968,691],{},[312,970,972],{"id":971},"_4-testing-your-contract","4. Testing Your Contract",[266,974,975],{},"Before deployment, create comprehensive tests:",[333,977,979],{"className":522,"code":978,"language":524,"meta":338,"style":338},"\u002F\u002F SPDX-License-Identifier: BUSL-1.1\npragma solidity 0.8.26;\n\nimport { Test } from \"forge-std\u002FTest.sol\";\nimport { MyTreasuryToken } from \"..\u002Fsrc\u002FMyTreasuryToken.sol\";\n\ncontract MyTreasuryTokenTest is Test {\n    MyTreasuryToken token;\n    address admin = makeAddr(\"admin\");\n    address treasury = makeAddr(\"treasury\");\n    address user = makeAddr(\"user\");\n\n    function setUp() public {\n        token = new MyTreasuryToken(\n            address(mockMToken),      \u002F\u002F $M Token address\n            address(mockSwapFacility) \u002F\u002F SwapFacility address\n        );\n\n        token.initialize(\n            \"My Treasury USD\",\n            \"tUSD\",\n            treasury,                 \u002F\u002F Rewards recipient\n            admin,                    \u002F\u002F Admin\n            admin,                    \u002F\u002F Freeze manager\n            admin                     \u002F\u002F Rewards recipient manager\n        );\n    }\n\n    function testYieldClaim() public {\n        \u002F\u002F Test rewards claiming functionality\n        \u002F\u002F Mock some rewards accrual\n        \u002F\u002F Call claimYield()\n        \u002F\u002F Assert rewards goes to treasury\n    }\n\n    function testFreezing() public {\n        \u002F\u002F Test freezing functionality\n        vm.prank(admin);\n        token.freeze(user);\n        assertTrue(token.isFrozen(user));\n    }\n\n    function testYieldRecipientChange() public {\n        \u002F\u002F Test changing rewards recipient\n        address newTreasury = makeAddr(\"newTreasury\");\n        vm.prank(admin);\n        token.setYieldRecipient(newTreasury);\n        assertEq(token.yieldRecipient(), newTreasury);\n    }\n}\n",[270,980,981,985,989,993,998,1002,1006,1011,1016,1021,1026,1031,1035,1040,1045,1050,1055,1059,1063,1068,1073,1078,1083,1088,1093,1098,1102,1106,1110,1115,1120,1125,1130,1135,1139,1143,1148,1154,1160,1166,1172,1177,1182,1188,1194,1200,1205,1211,1217,1222],{"__ignoreMap":338},[342,982,983],{"class":344,"line":345},[342,984,531],{},[342,986,987],{"class":344,"line":359},[342,988,536],{},[342,990,991],{"class":344,"line":418},[342,992,542],{"emptyLinePlaceholder":541},[342,994,995],{"class":344,"line":424},[342,996,997],{},"import { Test } from \"forge-std\u002FTest.sol\";\n",[342,999,1000],{"class":344,"line":435},[342,1001,810],{},[342,1003,1004],{"class":344,"line":446},[342,1005,542],{"emptyLinePlaceholder":541},[342,1007,1008],{"class":344,"line":452},[342,1009,1010],{},"contract MyTreasuryTokenTest is Test {\n",[342,1012,1013],{"class":344,"line":564},[342,1014,1015],{},"    MyTreasuryToken token;\n",[342,1017,1018],{"class":344,"line":570},[342,1019,1020],{},"    address admin = makeAddr(\"admin\");\n",[342,1022,1023],{"class":344,"line":576},[342,1024,1025],{},"    address treasury = makeAddr(\"treasury\");\n",[342,1027,1028],{"class":344,"line":582},[342,1029,1030],{},"    address user = makeAddr(\"user\");\n",[342,1032,1033],{"class":344,"line":587},[342,1034,542],{"emptyLinePlaceholder":541},[342,1036,1037],{"class":344,"line":593},[342,1038,1039],{},"    function setUp() public {\n",[342,1041,1042],{"class":344,"line":599},[342,1043,1044],{},"        token = new MyTreasuryToken(\n",[342,1046,1047],{"class":344,"line":605},[342,1048,1049],{},"            address(mockMToken),      \u002F\u002F $M Token address\n",[342,1051,1052],{"class":344,"line":611},[342,1053,1054],{},"            address(mockSwapFacility) \u002F\u002F SwapFacility address\n",[342,1056,1057],{"class":344,"line":617},[342,1058,680],{},[342,1060,1061],{"class":344,"line":623},[342,1062,542],{"emptyLinePlaceholder":541},[342,1064,1065],{"class":344,"line":629},[342,1066,1067],{},"        token.initialize(\n",[342,1069,1070],{"class":344,"line":635},[342,1071,1072],{},"            \"My Treasury USD\",\n",[342,1074,1075],{"class":344,"line":641},[342,1076,1077],{},"            \"tUSD\",\n",[342,1079,1080],{"class":344,"line":647},[342,1081,1082],{},"            treasury,                 \u002F\u002F Rewards recipient\n",[342,1084,1085],{"class":344,"line":653},[342,1086,1087],{},"            admin,                    \u002F\u002F Admin\n",[342,1089,1090],{"class":344,"line":659},[342,1091,1092],{},"            admin,                    \u002F\u002F Freeze manager\n",[342,1094,1095],{"class":344,"line":665},[342,1096,1097],{},"            admin                     \u002F\u002F Rewards recipient manager\n",[342,1099,1100],{"class":344,"line":671},[342,1101,680],{},[342,1103,1104],{"class":344,"line":677},[342,1105,579],{},[342,1107,1108],{"class":344,"line":683},[342,1109,542],{"emptyLinePlaceholder":541},[342,1111,1112],{"class":344,"line":688},[342,1113,1114],{},"    function testYieldClaim() public {\n",[342,1116,1117],{"class":344,"line":934},[342,1118,1119],{},"        \u002F\u002F Test rewards claiming functionality\n",[342,1121,1122],{"class":344,"line":939},[342,1123,1124],{},"        \u002F\u002F Mock some rewards accrual\n",[342,1126,1127],{"class":344,"line":944},[342,1128,1129],{},"        \u002F\u002F Call claimYield()\n",[342,1131,1132],{"class":344,"line":950},[342,1133,1134],{},"        \u002F\u002F Assert rewards goes to treasury\n",[342,1136,1137],{"class":344,"line":955},[342,1138,579],{},[342,1140,1141],{"class":344,"line":961},[342,1142,542],{"emptyLinePlaceholder":541},[342,1144,1145],{"class":344,"line":966},[342,1146,1147],{},"    function testFreezing() public {\n",[342,1149,1151],{"class":344,"line":1150},37,[342,1152,1153],{},"        \u002F\u002F Test freezing functionality\n",[342,1155,1157],{"class":344,"line":1156},38,[342,1158,1159],{},"        vm.prank(admin);\n",[342,1161,1163],{"class":344,"line":1162},39,[342,1164,1165],{},"        token.freeze(user);\n",[342,1167,1169],{"class":344,"line":1168},40,[342,1170,1171],{},"        assertTrue(token.isFrozen(user));\n",[342,1173,1175],{"class":344,"line":1174},41,[342,1176,579],{},[342,1178,1180],{"class":344,"line":1179},42,[342,1181,542],{"emptyLinePlaceholder":541},[342,1183,1185],{"class":344,"line":1184},43,[342,1186,1187],{},"    function testYieldRecipientChange() public {\n",[342,1189,1191],{"class":344,"line":1190},44,[342,1192,1193],{},"        \u002F\u002F Test changing rewards recipient\n",[342,1195,1197],{"class":344,"line":1196},45,[342,1198,1199],{},"        address newTreasury = makeAddr(\"newTreasury\");\n",[342,1201,1203],{"class":344,"line":1202},46,[342,1204,1159],{},[342,1206,1208],{"class":344,"line":1207},47,[342,1209,1210],{},"        token.setYieldRecipient(newTreasury);\n",[342,1212,1214],{"class":344,"line":1213},48,[342,1215,1216],{},"        assertEq(token.yieldRecipient(), newTreasury);\n",[342,1218,1220],{"class":344,"line":1219},49,[342,1221,579],{},[342,1223,1225],{"class":344,"line":1224},50,[342,1226,691],{},[312,1228,1230],{"id":1229},"_5-gain-m0-earner-approval","5. Gain M0 Earner Approval",[266,1232,1233],{},"For your contract to accrue rewards, its deployed address must be approved as an M0 Earner.",[698,1235,1236,1246],{},[327,1237,1238,1241,1242,1245],{},[281,1239,1240],{},"Calculate Your Address:"," Determine your contract's final deployment address. You can do this deterministically using ",[270,1243,1244],{},"CREATE2"," or by deploying it to a testnet first.",[327,1247,1248,1251,1252,1255],{},[281,1249,1250],{},"Submit a Proposal:"," Create and submit a proposal to M0 to add your contract's address to the ",[270,1253,1254],{},"earners"," list.",[266,1257,1258,1259,1262],{},"For more details on this process, see the ",[278,1260,1261],{"href":229},"Gaining Earner Approval"," guide.",[312,1264,1266],{"id":1265},"_6-security-audit","6. Security & Audit",[266,1268,1269],{},"Even though you are building on an audited template, any modifications or new logic should be thoroughly tested and independently audited. Security is paramount.",[698,1271,1272,1279,1282],{},[327,1273,1274,1275,1278],{},"Write comprehensive tests for your new contract in the ",[270,1276,1277],{},"test\u002F"," directory.",[327,1280,1281],{},"Run static analysis tools like Slither.",[327,1283,1284],{},"Engage with a reputable security firm for a full audit if you've made significant modifications.",[312,1286,1288],{"id":1287},"_7-deploy-launch","7. Deploy & Launch",[693,1290,1292],{"id":1291},"deploy-to-testnet-first","Deploy to Testnet First",[333,1294,1296],{"className":335,"code":1295,"language":337,"meta":338,"style":338},"# Load environment variables\nsource .env\n\n# Deploy to Sepolia\nforge script script\u002FDeployMyTreasuryToken.s.sol \\\n    --rpc-url $SEPOLIA_RPC_URL \\\n    --verify \\\n    --etherscan-api-key $ETHERSCAN_API_KEY \\\n    --broadcast\n",[270,1297,1298,1303,1311,1315,1320,1334,1342,1349,1357],{"__ignoreMap":338},[342,1299,1300],{"class":344,"line":345},[342,1301,1302],{"class":401},"# Load environment variables\n",[342,1304,1305,1308],{"class":344,"line":359},[342,1306,1307],{"class":362},"source",[342,1309,1310],{"class":352}," .env\n",[342,1312,1313],{"class":344,"line":418},[342,1314,542],{"emptyLinePlaceholder":541},[342,1316,1317],{"class":344,"line":424},[342,1318,1319],{"class":401},"# Deploy to Sepolia\n",[342,1321,1322,1325,1328,1331],{"class":344,"line":435},[342,1323,1324],{"class":348},"forge",[342,1326,1327],{"class":352}," script",[342,1329,1330],{"class":352}," script\u002FDeployMyTreasuryToken.s.sol",[342,1332,1333],{"class":407}," \\\n",[342,1335,1336,1339],{"class":344,"line":446},[342,1337,1338],{"class":352},"    --rpc-url",[342,1340,1341],{"class":407}," $SEPOLIA_RPC_URL \\\n",[342,1343,1344,1347],{"class":344,"line":452},[342,1345,1346],{"class":352},"    --verify",[342,1348,1333],{"class":407},[342,1350,1351,1354],{"class":344,"line":564},[342,1352,1353],{"class":352},"    --etherscan-api-key",[342,1355,1356],{"class":407}," $ETHERSCAN_API_KEY \\\n",[342,1358,1359],{"class":344,"line":570},[342,1360,1361],{"class":352},"    --broadcast\n",[693,1363,1365],{"id":1364},"deploy-to-mainnet","Deploy to Mainnet",[333,1367,1369],{"className":335,"code":1368,"language":337,"meta":338,"style":338},"# Load environment variables\nsource .env\n\n# Deploy to Mainnet\nforge script script\u002FDeployMyTreasuryToken.s.sol \\\n    --rpc-url $MAINNET_RPC_URL \\\n    --verify \\\n    --etherscan-api-key $ETHERSCAN_API_KEY \\\n    --broadcast\n",[270,1370,1371,1375,1381,1385,1390,1400,1407,1413,1419],{"__ignoreMap":338},[342,1372,1373],{"class":344,"line":345},[342,1374,1302],{"class":401},[342,1376,1377,1379],{"class":344,"line":359},[342,1378,1307],{"class":362},[342,1380,1310],{"class":352},[342,1382,1383],{"class":344,"line":418},[342,1384,542],{"emptyLinePlaceholder":541},[342,1386,1387],{"class":344,"line":424},[342,1388,1389],{"class":401},"# Deploy to Mainnet\n",[342,1391,1392,1394,1396,1398],{"class":344,"line":435},[342,1393,1324],{"class":348},[342,1395,1327],{"class":352},[342,1397,1330],{"class":352},[342,1399,1333],{"class":407},[342,1401,1402,1404],{"class":344,"line":446},[342,1403,1338],{"class":352},[342,1405,1406],{"class":407}," $MAINNET_RPC_URL \\\n",[342,1408,1409,1411],{"class":344,"line":452},[342,1410,1346],{"class":352},[342,1412,1333],{"class":407},[342,1414,1415,1417],{"class":344,"line":564},[342,1416,1353],{"class":352},[342,1418,1356],{"class":407},[342,1420,1421],{"class":344,"line":570},[342,1422,1361],{"class":352},[693,1424,1426],{"id":1425},"alternative-hardware-wallet-deployment","Alternative: Hardware Wallet Deployment",[266,1428,1429],{},"For production deployments, consider using a hardware wallet:",[333,1431,1433],{"className":335,"code":1432,"language":337,"meta":338,"style":338},"forge script script\u002FDeployMyTreasuryToken.s.sol \\\n    --rpc-url $MAINNET_RPC_URL \\\n    --verify \\\n    --etherscan-api-key $ETHERSCAN_API_KEY \\\n    --ledger \\\n    --broadcast\n",[270,1434,1435,1445,1451,1457,1463,1470],{"__ignoreMap":338},[342,1436,1437,1439,1441,1443],{"class":344,"line":345},[342,1438,1324],{"class":348},[342,1440,1327],{"class":352},[342,1442,1330],{"class":352},[342,1444,1333],{"class":407},[342,1446,1447,1449],{"class":344,"line":359},[342,1448,1338],{"class":352},[342,1450,1406],{"class":407},[342,1452,1453,1455],{"class":344,"line":418},[342,1454,1346],{"class":352},[342,1456,1333],{"class":407},[342,1458,1459,1461],{"class":344,"line":424},[342,1460,1353],{"class":352},[342,1462,1356],{"class":407},[342,1464,1465,1468],{"class":344,"line":435},[342,1466,1467],{"class":352},"    --ledger",[342,1469,1333],{"class":407},[342,1471,1472],{"class":344,"line":446},[342,1473,1361],{"class":352},[693,1475,1477],{"id":1476},"enable-earning","Enable Earning",[266,1479,1480,1481,1484],{},"After your contract is deployed and earner approval is confirmed, call the ",[270,1482,1483],{},"enableEarning()"," function on your deployed contract:",[333,1486,1488],{"className":522,"code":1487,"language":524,"meta":338,"style":338},"\u002F\u002F Call this function to start rewards accrual\nmyTreasuryToken.enableEarning();\n",[270,1489,1490,1495],{"__ignoreMap":338},[342,1491,1492],{"class":344,"line":345},[342,1493,1494],{},"\u002F\u002F Call this function to start rewards accrual\n",[342,1496,1497],{"class":344,"line":359},[342,1498,1499],{},"myTreasuryToken.enableEarning();\n",[266,1501,1502],{},"This will start the rewards accrual process.",[312,1504,1506],{"id":1505},"_8-integration-usage","8. Integration & Usage",[693,1508,1510],{"id":1509},"for-treasury-management","For Treasury Management",[324,1512,1513,1528,1549],{},[327,1514,1515,1518,1519],{},[281,1516,1517],{},"Claiming Rewards:"," Anyone can call the rewards claim function when surplus exists:\n",[333,1520,1522],{"className":522,"code":1521,"language":524,"meta":338,"style":338},"uint256 yieldAmount = myTreasuryToken.claimYield();\n",[270,1523,1524],{"__ignoreMap":338},[342,1525,1526],{"class":344,"line":345},[342,1527,1521],{},[327,1529,1530,1533,1534],{},[281,1531,1532],{},"Managing Rewards Recipient:"," The rewards recipient manager can update where rewards go:\n",[333,1535,1537],{"className":522,"code":1536,"language":524,"meta":338,"style":338},"\u002F\u002F Only YIELD_RECIPIENT_MANAGER_ROLE can call this\nmyTreasuryToken.setYieldRecipient(newTreasuryAddress);\n",[270,1538,1539,1544],{"__ignoreMap":338},[342,1540,1541],{"class":344,"line":345},[342,1542,1543],{},"\u002F\u002F Only YIELD_RECIPIENT_MANAGER_ROLE can call this\n",[342,1545,1546],{"class":344,"line":359},[342,1547,1548],{},"myTreasuryToken.setYieldRecipient(newTreasuryAddress);\n",[327,1550,1551,1554],{},[281,1552,1553],{},"Freezing (if needed):",[333,1555,1557],{"className":522,"code":1556,"language":524,"meta":338,"style":338},"\u002F\u002F Only FREEZE_MANAGER_ROLE can call this\nmyTreasuryToken.freeze(suspiciousAddress);\nmyTreasuryToken.unfreeze(rehabilitatedAddress);\n\u002F\u002F Batch operations\naddress[] memory accounts = new address[](3);\naccounts[0] = addr1;\naccounts[1] = addr2;\naccounts[2] = addr3;\nmyTreasuryToken.freezeAccounts(accounts);\n",[270,1558,1559,1564,1569,1574,1579,1584,1589,1594,1599],{"__ignoreMap":338},[342,1560,1561],{"class":344,"line":345},[342,1562,1563],{},"\u002F\u002F Only FREEZE_MANAGER_ROLE can call this\n",[342,1565,1566],{"class":344,"line":359},[342,1567,1568],{},"myTreasuryToken.freeze(suspiciousAddress);\n",[342,1570,1571],{"class":344,"line":418},[342,1572,1573],{},"myTreasuryToken.unfreeze(rehabilitatedAddress);\n",[342,1575,1576],{"class":344,"line":424},[342,1577,1578],{},"\u002F\u002F Batch operations\n",[342,1580,1581],{"class":344,"line":435},[342,1582,1583],{},"address[] memory accounts = new address[](3);\n",[342,1585,1586],{"class":344,"line":446},[342,1587,1588],{},"accounts[0] = addr1;\n",[342,1590,1591],{"class":344,"line":452},[342,1592,1593],{},"accounts[1] = addr2;\n",[342,1595,1596],{"class":344,"line":564},[342,1597,1598],{},"accounts[2] = addr3;\n",[342,1600,1601],{"class":344,"line":570},[342,1602,1603],{},"myTreasuryToken.freezeAccounts(accounts);\n",[693,1605,1607],{"id":1606},"frontend-integration","Frontend Integration",[266,1609,1610],{},"Display real-time rewards information to your users:",[333,1612,1616],{"className":1613,"code":1614,"language":1615,"meta":338,"style":338},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Get current claimable rewards\nconst currentYield = await myTreasuryToken.yield();\n\n\u002F\u002F Get total supply\nconst totalSupply = await myTreasuryToken.totalSupply();\n\n\u002F\u002F Get user balance\nconst userBalance = await myTreasuryToken.balanceOf(userAddress);\n\n\u002F\u002F Check if address is frozen\nconst isFrozen = await myTreasuryToken.isFrozen(userAddress);\n\n\u002F\u002F Get rewards recipient\nconst yieldRecipient = await myTreasuryToken.yieldRecipient();\n","javascript",[270,1617,1618,1623,1628,1632,1637,1642,1646,1651,1656,1660,1665,1670,1674,1679],{"__ignoreMap":338},[342,1619,1620],{"class":344,"line":345},[342,1621,1622],{},"\u002F\u002F Get current claimable rewards\n",[342,1624,1625],{"class":344,"line":359},[342,1626,1627],{},"const currentYield = await myTreasuryToken.yield();\n",[342,1629,1630],{"class":344,"line":418},[342,1631,542],{"emptyLinePlaceholder":541},[342,1633,1634],{"class":344,"line":424},[342,1635,1636],{},"\u002F\u002F Get total supply\n",[342,1638,1639],{"class":344,"line":435},[342,1640,1641],{},"const totalSupply = await myTreasuryToken.totalSupply();\n",[342,1643,1644],{"class":344,"line":446},[342,1645,542],{"emptyLinePlaceholder":541},[342,1647,1648],{"class":344,"line":452},[342,1649,1650],{},"\u002F\u002F Get user balance\n",[342,1652,1653],{"class":344,"line":564},[342,1654,1655],{},"const userBalance = await myTreasuryToken.balanceOf(userAddress);\n",[342,1657,1658],{"class":344,"line":570},[342,1659,542],{"emptyLinePlaceholder":541},[342,1661,1662],{"class":344,"line":576},[342,1663,1664],{},"\u002F\u002F Check if address is frozen\n",[342,1666,1667],{"class":344,"line":582},[342,1668,1669],{},"const isFrozen = await myTreasuryToken.isFrozen(userAddress);\n",[342,1671,1672],{"class":344,"line":587},[342,1673,542],{"emptyLinePlaceholder":541},[342,1675,1676],{"class":344,"line":593},[342,1677,1678],{},"\u002F\u002F Get rewards recipient\n",[342,1680,1681],{"class":344,"line":599},[342,1682,1683],{},"const yieldRecipient = await myTreasuryToken.yieldRecipient();\n",[312,1685,1687],{"id":1686},"_9-monitoring-maintenance","9. Monitoring & Maintenance",[693,1689,1691],{"id":1690},"key-metrics-to-track","Key Metrics to Track",[698,1693,1694,1700,1706,1712],{},[327,1695,1696,1699],{},[281,1697,1698],{},"Total Supply",": How much of your token is in circulation.",[327,1701,1702,1705],{},[281,1703,1704],{},"Rewards Rate",": Current rewards being generated.",[327,1707,1708,1711],{},[281,1709,1710],{},"Treasury Balance",": Amount accumulated in the rewards recipient address.",[327,1713,1714,1717],{},[281,1715,1716],{},"Underlying Balance",": Total value held by your contract.",[693,1719,1721],{"id":1720},"operational-considerations","Operational Considerations",[698,1723,1724,1731,1734,1737],{},[327,1725,1726,1727,1730],{},"Monitor the ",[270,1728,1729],{},"yield()"," function regularly to see claimable amounts.",[327,1732,1733],{},"Set up automated rewards claiming if desired.",[327,1735,1736],{},"Keep track of frozen addresses for compliance.",[327,1738,1739],{},"Monitor gas costs for user operations.",[266,1741,1742,1745],{},[281,1743,1744],{},"Congratulations!"," You now have a fully functional treasury-focused stablecoin that automatically accumulates rewards for your use case while providing users with a stable, 1:1 backed token experience.",[301,1747,1749],{"id":1748},"svm-implementation","SVM Implementation",[266,1751,1752,1753,273],{},"For the Solana\u002FSVM implementation, see the dedicated ",[278,1754,1755],{"href":128},[281,1756,1757],{},"NoYield (SVM) Deployment Guide",[1759,1760,1761],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":338,"searchDepth":345,"depth":359,"links":1763},[1764,1775],{"id":303,"depth":359,"text":304,"children":1765},[1766,1767,1768,1769,1770,1771,1772,1773,1774],{"id":314,"depth":418,"text":315},{"id":498,"depth":418,"text":499},{"id":770,"depth":418,"text":771},{"id":971,"depth":418,"text":972},{"id":1229,"depth":418,"text":1230},{"id":1265,"depth":418,"text":1266},{"id":1287,"depth":418,"text":1288},{"id":1505,"depth":418,"text":1506},{"id":1686,"depth":418,"text":1687},{"id":1748,"depth":359,"text":1749},"Step-by-step instructions for deploying a Treasury Model stablecoin where 100% of rewards are captured by the use case owner.","md",null,{},{"title":135,"description":1776},"mdfNU5JgDOqBBeWS47E2G5kXPfiEslINmSJh_XzQgbw",[1783,1785],{"title":131,"path":132,"stem":133,"description":1784,"children":-1},"Step-by-step guide for deploying the NoYield treasury model stablecoin on Solana and SVM chains.",{"title":139,"path":140,"stem":141,"description":1786,"children":-1},"Step-by-step instructions for deploying a JMI (Just Mint It) stablecoin extension with multi-collateral support and centralized rewards distribution."]