{"abi":[{"type":"function","name":"allowance","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"approve","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"balanceOf","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transfer","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"ERC20InsufficientAllowance","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"allowance","type":"uint256","internalType":"uint256"},{"name":"needed","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC20InsufficientBalance","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"balance","type":"uint256","internalType":"uint256"},{"name":"needed","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC20InvalidApprover","inputs":[{"name":"approver","type":"address","internalType":"address"}]},{"type":"error","name":"ERC20InvalidReceiver","inputs":[{"name":"receiver","type":"address","internalType":"address"}]},{"type":"error","name":"ERC20InvalidSender","inputs":[{"name":"sender","type":"address","internalType":"address"}]},{"type":"error","name":"ERC20InvalidSpender","inputs":[{"name":"spender","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","decimals()":"313ce567","name()":"06fdde03","symbol()":"95d89b41","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSpender\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC20 standard as defined in the EIP.\",\"errors\":{\"ERC20InsufficientAllowance(address,uint256,uint256)\":[{\"details\":\"Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\",\"params\":{\"allowance\":\"Amount of tokens a `spender` is allowed to operate with.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"details\":\"Indicates an error related to the current `balance` of a `sender`. Used in transfers.\",\"params\":{\"balance\":\"Current balance for the interacting account.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC20InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC20InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidSpender(address)\":[{\"details\":\"Indicates a failure with the `spender` to be approved. Used in approvals.\",\"params\":{\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the value of tokens owned by `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"Returns the value of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"node_modules/@latticexyz/world-modules/src/modules/erc20-puppet/IERC20.sol\":\"IERC20\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":3000},\"remappings\":[\":@dk1a/solidity-stringutils/=node_modules/@dk1a/solidity-stringutils/\",\":@latticexyz/=node_modules/@latticexyz/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":base/=src/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":solmate/=node_modules/solmate/src/\"]},\"sources\":{\"node_modules/@latticexyz/world-modules/src/modules/erc20-puppet/IERC20.sol\":{\"keccak256\":\"0x4da2e95751daa6444c24063c1da6886380a487b958808d888f6f4f4b1da7b60b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://111b988299e13500d38a87e2a6309087f42abd6a871e6e9c5da7bc7d09c71b2c\",\"dweb:/ipfs/QmWyShHQnKFNvZdKyKmsuRCwhYRrz2UMqHP2oLnHvqArdj\"]},\"node_modules/@latticexyz/world-modules/src/modules/erc20-puppet/IERC20Errors.sol\":{\"keccak256\":\"0x704a9e25590a92a80d153552fbe79a83fe0a80a8f6eaa8d2ccaca70649e40fce\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0e6ae9510a9c5023299a1064c945b652336a31f5cd225bbe9a72f9e2fd81ada2\",\"dweb:/ipfs/QmdvTCUs3ZiP5unHGdwJz3MxAR5b7K7bYVTZjBT8xadBVR\"]},\"node_modules/@latticexyz/world-modules/src/modules/erc20-puppet/IERC20Events.sol\":{\"keccak256\":\"0xee632339ff14c1e5e6994ce3c605799761f24f40093cabf3b091f6dcbd9ef8ff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a0c7a33110c14cfc32011bda15c4330d8f193d133c1f34448f1566f44a0663bd\",\"dweb:/ipfs/QmadwRXGu4H2H3WxgEchXTyLx5PKSLZd7VHvRPEZ5zAgaZ\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"type":"error","name":"ERC20InsufficientAllowance"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"type":"error","name":"ERC20InsufficientBalance"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"type":"error","name":"ERC20InvalidApprover"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"type":"error","name":"ERC20InvalidReceiver"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"type":"error","name":"ERC20InvalidSender"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"type":"error","name":"ERC20InvalidSpender"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"spender","type":"address","indexed":true},{"internalType":"uint256","name":"value","type":"uint256","indexed":false}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"value","type":"uint256","indexed":false}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"stateMutability":"view","type":"function","name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"decimals()":{"details":"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"name()":{"details":"Returns the name of the token."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"Returns the value of tokens in existence."},"transfer(address,uint256)":{"details":"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{"details":"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@dk1a/solidity-stringutils/=node_modules/@dk1a/solidity-stringutils/","@latticexyz/=node_modules/@latticexyz/","@openzeppelin/=node_modules/@openzeppelin/","base/=src/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/","solmate/=node_modules/solmate/src/"],"optimizer":{"enabled":true,"runs":3000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"node_modules/@latticexyz/world-modules/src/modules/erc20-puppet/IERC20.sol":"IERC20"},"evmVersion":"paris","libraries":{}},"sources":{"node_modules/@latticexyz/world-modules/src/modules/erc20-puppet/IERC20.sol":{"keccak256":"0x4da2e95751daa6444c24063c1da6886380a487b958808d888f6f4f4b1da7b60b","urls":["bzz-raw://111b988299e13500d38a87e2a6309087f42abd6a871e6e9c5da7bc7d09c71b2c","dweb:/ipfs/QmWyShHQnKFNvZdKyKmsuRCwhYRrz2UMqHP2oLnHvqArdj"],"license":"MIT"},"node_modules/@latticexyz/world-modules/src/modules/erc20-puppet/IERC20Errors.sol":{"keccak256":"0x704a9e25590a92a80d153552fbe79a83fe0a80a8f6eaa8d2ccaca70649e40fce","urls":["bzz-raw://0e6ae9510a9c5023299a1064c945b652336a31f5cd225bbe9a72f9e2fd81ada2","dweb:/ipfs/QmdvTCUs3ZiP5unHGdwJz3MxAR5b7K7bYVTZjBT8xadBVR"],"license":"MIT"},"node_modules/@latticexyz/world-modules/src/modules/erc20-puppet/IERC20Events.sol":{"keccak256":"0xee632339ff14c1e5e6994ce3c605799761f24f40093cabf3b091f6dcbd9ef8ff","urls":["bzz-raw://a0c7a33110c14cfc32011bda15c4330d8f193d133c1f34448f1566f44a0663bd","dweb:/ipfs/QmadwRXGu4H2H3WxgEchXTyLx5PKSLZd7VHvRPEZ5zAgaZ"],"license":"MIT"}},"version":1},"ast":{"absolutePath":"node_modules/@latticexyz/world-modules/src/modules/erc20-puppet/IERC20.sol","id":27485,"exportedSymbols":{"IERC20":[27484],"IERC20Errors":[27526],"IERC20Events":[27547]},"nodeType":"SourceUnit","src":"106:3154:53","nodes":[{"id":27400,"nodeType":"PragmaDirective","src":"106:25:53","nodes":[],"literals":["solidity",">=","0.8",".24"]},{"id":27402,"nodeType":"ImportDirective","src":"133:50:53","nodes":[],"absolutePath":"node_modules/@latticexyz/world-modules/src/modules/erc20-puppet/IERC20Events.sol","file":"./IERC20Events.sol","nameLocation":"-1:-1:-1","scope":27485,"sourceUnit":27548,"symbolAliases":[{"foreign":{"id":27401,"name":"IERC20Events","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27547,"src":"142:12:53","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":27404,"nodeType":"ImportDirective","src":"184:50:53","nodes":[],"absolutePath":"node_modules/@latticexyz/world-modules/src/modules/erc20-puppet/IERC20Errors.sol","file":"./IERC20Errors.sol","nameLocation":"-1:-1:-1","scope":27485,"sourceUnit":27527,"symbolAliases":[{"foreign":{"id":27403,"name":"IERC20Errors","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27526,"src":"193:12:53","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":27484,"nodeType":"ContractDefinition","src":"307:2952:53","nodes":[{"id":27415,"nodeType":"FunctionDefinition","src":"411:54:53","nodes":[],"documentation":{"id":27410,"nodeType":"StructuredDocumentation","src":"358:50:53","text":" @dev Returns the name of the token."},"functionSelector":"06fdde03","implemented":false,"kind":"function","modifiers":[],"name":"name","nameLocation":"420:4:53","parameters":{"id":27411,"nodeType":"ParameterList","parameters":[],"src":"424:2:53"},"returnParameters":{"id":27414,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27413,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27415,"src":"450:13:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":27412,"name":"string","nodeType":"ElementaryTypeName","src":"450:6:53","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"449:15:53"},"scope":27484,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":27421,"nodeType":"FunctionDefinition","src":"568:56:53","nodes":[],"documentation":{"id":27416,"nodeType":"StructuredDocumentation","src":"469:96:53","text":" @dev Returns the symbol of the token, usually a shorter version of the\n name."},"functionSelector":"95d89b41","implemented":false,"kind":"function","modifiers":[],"name":"symbol","nameLocation":"577:6:53","parameters":{"id":27417,"nodeType":"ParameterList","parameters":[],"src":"583:2:53"},"returnParameters":{"id":27420,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27419,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27421,"src":"609:13:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":27418,"name":"string","nodeType":"ElementaryTypeName","src":"609:6:53","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"608:15:53"},"scope":27484,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":27427,"nodeType":"FunctionDefinition","src":"1229:50:53","nodes":[],"documentation":{"id":27422,"nodeType":"StructuredDocumentation","src":"628:598:53","text":" @dev Returns the number of decimals used to get its user representation.\n For example, if `decimals` equals `2`, a balance of `505` tokens should\n be displayed to a user as `5.05` (`505 / 10 ** 2`).\n Tokens usually opt for a value of 18, imitating the relationship between\n Ether and Wei. This is the default value returned by this function, unless\n it's overridden.\n NOTE: This information is only used for _display_ purposes: it in\n no way affects any of the arithmetic of the contract, including\n {IERC20-balanceOf} and {IERC20-transfer}."},"functionSelector":"313ce567","implemented":false,"kind":"function","modifiers":[],"name":"decimals","nameLocation":"1238:8:53","parameters":{"id":27423,"nodeType":"ParameterList","parameters":[],"src":"1246:2:53"},"returnParameters":{"id":27426,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27425,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27427,"src":"1272:5:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":27424,"name":"uint8","nodeType":"ElementaryTypeName","src":"1272:5:53","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"1271:7:53"},"scope":27484,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":27433,"nodeType":"FunctionDefinition","src":"1347:55:53","nodes":[],"documentation":{"id":27428,"nodeType":"StructuredDocumentation","src":"1283:61:53","text":" @dev Returns the value of tokens in existence."},"functionSelector":"18160ddd","implemented":false,"kind":"function","modifiers":[],"name":"totalSupply","nameLocation":"1356:11:53","parameters":{"id":27429,"nodeType":"ParameterList","parameters":[],"src":"1367:2:53"},"returnParameters":{"id":27432,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27431,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27433,"src":"1393:7:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27430,"name":"uint256","nodeType":"ElementaryTypeName","src":"1393:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1392:9:53"},"scope":27484,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":27441,"nodeType":"FunctionDefinition","src":"1476:68:53","nodes":[],"documentation":{"id":27434,"nodeType":"StructuredDocumentation","src":"1406:67:53","text":" @dev Returns the value of tokens owned by `account`."},"functionSelector":"70a08231","implemented":false,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"1485:9:53","parameters":{"id":27437,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27436,"mutability":"mutable","name":"account","nameLocation":"1503:7:53","nodeType":"VariableDeclaration","scope":27441,"src":"1495:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27435,"name":"address","nodeType":"ElementaryTypeName","src":"1495:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1494:17:53"},"returnParameters":{"id":27440,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27439,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27441,"src":"1535:7:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27438,"name":"uint256","nodeType":"ElementaryTypeName","src":"1535:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1534:9:53"},"scope":27484,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":27451,"nodeType":"FunctionDefinition","src":"1752:69:53","nodes":[],"documentation":{"id":27442,"nodeType":"StructuredDocumentation","src":"1548:201:53","text":" @dev Moves a `value` amount of tokens from the caller's account to `to`.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event."},"functionSelector":"a9059cbb","implemented":false,"kind":"function","modifiers":[],"name":"transfer","nameLocation":"1761:8:53","parameters":{"id":27447,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27444,"mutability":"mutable","name":"to","nameLocation":"1778:2:53","nodeType":"VariableDeclaration","scope":27451,"src":"1770:10:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27443,"name":"address","nodeType":"ElementaryTypeName","src":"1770:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27446,"mutability":"mutable","name":"value","nameLocation":"1790:5:53","nodeType":"VariableDeclaration","scope":27451,"src":"1782:13:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27445,"name":"uint256","nodeType":"ElementaryTypeName","src":"1782:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1769:27:53"},"returnParameters":{"id":27450,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27449,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27451,"src":"1815:4:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":27448,"name":"bool","nodeType":"ElementaryTypeName","src":"1815:4:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1814:6:53"},"scope":27484,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":27461,"nodeType":"FunctionDefinition","src":"2080:83:53","nodes":[],"documentation":{"id":27452,"nodeType":"StructuredDocumentation","src":"1825:252:53","text":" @dev Returns the remaining number of tokens that `spender` will be\n allowed to spend on behalf of `owner` through {transferFrom}. This is\n zero by default.\n This value changes when {approve} or {transferFrom} are called."},"functionSelector":"dd62ed3e","implemented":false,"kind":"function","modifiers":[],"name":"allowance","nameLocation":"2089:9:53","parameters":{"id":27457,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27454,"mutability":"mutable","name":"owner","nameLocation":"2107:5:53","nodeType":"VariableDeclaration","scope":27461,"src":"2099:13:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27453,"name":"address","nodeType":"ElementaryTypeName","src":"2099:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27456,"mutability":"mutable","name":"spender","nameLocation":"2122:7:53","nodeType":"VariableDeclaration","scope":27461,"src":"2114:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27455,"name":"address","nodeType":"ElementaryTypeName","src":"2114:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2098:32:53"},"returnParameters":{"id":27460,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27459,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27461,"src":"2154:7:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27458,"name":"uint256","nodeType":"ElementaryTypeName","src":"2154:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2153:9:53"},"scope":27484,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":27471,"nodeType":"FunctionDefinition","src":"2809:73:53","nodes":[],"documentation":{"id":27462,"nodeType":"StructuredDocumentation","src":"2167:639:53","text":" @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n caller's tokens.\n Returns a boolean value indicating whether the operation succeeded.\n IMPORTANT: Beware that changing an allowance with this method brings the risk\n that someone may use both the old and the new allowance by unfortunate\n transaction ordering. One possible solution to mitigate this race\n condition is to first reduce the spender's allowance to 0 and set the\n desired value afterwards:\n https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n Emits an {Approval} event."},"functionSelector":"095ea7b3","implemented":false,"kind":"function","modifiers":[],"name":"approve","nameLocation":"2818:7:53","parameters":{"id":27467,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27464,"mutability":"mutable","name":"spender","nameLocation":"2834:7:53","nodeType":"VariableDeclaration","scope":27471,"src":"2826:15:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27463,"name":"address","nodeType":"ElementaryTypeName","src":"2826:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27466,"mutability":"mutable","name":"value","nameLocation":"2851:5:53","nodeType":"VariableDeclaration","scope":27471,"src":"2843:13:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27465,"name":"uint256","nodeType":"ElementaryTypeName","src":"2843:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2825:32:53"},"returnParameters":{"id":27470,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27469,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27471,"src":"2876:4:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":27468,"name":"bool","nodeType":"ElementaryTypeName","src":"2876:4:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2875:6:53"},"scope":27484,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":27483,"nodeType":"FunctionDefinition","src":"3170:87:53","nodes":[],"documentation":{"id":27472,"nodeType":"StructuredDocumentation","src":"2886:281:53","text":" @dev Moves a `value` amount of tokens from `from` to `to` using the\n allowance mechanism. `value` is then deducted from the caller's\n allowance.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event."},"functionSelector":"23b872dd","implemented":false,"kind":"function","modifiers":[],"name":"transferFrom","nameLocation":"3179:12:53","parameters":{"id":27479,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27474,"mutability":"mutable","name":"from","nameLocation":"3200:4:53","nodeType":"VariableDeclaration","scope":27483,"src":"3192:12:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27473,"name":"address","nodeType":"ElementaryTypeName","src":"3192:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27476,"mutability":"mutable","name":"to","nameLocation":"3214:2:53","nodeType":"VariableDeclaration","scope":27483,"src":"3206:10:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27475,"name":"address","nodeType":"ElementaryTypeName","src":"3206:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27478,"mutability":"mutable","name":"value","nameLocation":"3226:5:53","nodeType":"VariableDeclaration","scope":27483,"src":"3218:13:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27477,"name":"uint256","nodeType":"ElementaryTypeName","src":"3218:7:53","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3191:41:53"},"returnParameters":{"id":27482,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27481,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27483,"src":"3251:4:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":27480,"name":"bool","nodeType":"ElementaryTypeName","src":"3251:4:53","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3250:6:53"},"scope":27484,"stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[{"baseName":{"id":27406,"name":"IERC20Events","nameLocations":["327:12:53"],"nodeType":"IdentifierPath","referencedDeclaration":27547,"src":"327:12:53"},"id":27407,"nodeType":"InheritanceSpecifier","src":"327:12:53"},{"baseName":{"id":27408,"name":"IERC20Errors","nameLocations":["341:12:53"],"nodeType":"IdentifierPath","referencedDeclaration":27526,"src":"341:12:53"},"id":27409,"nodeType":"InheritanceSpecifier","src":"341:12:53"}],"canonicalName":"IERC20","contractDependencies":[],"contractKind":"interface","documentation":{"id":27405,"nodeType":"StructuredDocumentation","src":"236:70:53","text":" @dev Interface of the ERC20 standard as defined in the EIP."},"fullyImplemented":false,"linearizedBaseContracts":[27484,27526,27547],"name":"IERC20","nameLocation":"317:6:53","scope":27485,"usedErrors":[27496,27501,27506,27515,27520,27525],"usedEvents":[27537,27546]}],"license":"MIT"},"id":53}