From c4c17710cedd032a67e61c4d2f35d2fbfacac865 Mon Sep 17 00:00:00 2001 From: Jake Hartnell Date: Mon, 8 Jan 2024 21:35:04 -0800 Subject: [PATCH] More integration tests and fixes, update schema --- .../cw20-token/schema/raw/execute.json | 519 ------------------ .../cw20-token/schema/raw/instantiate.json | 196 ------- .../external/cw20-token/schema/raw/query.json | 226 -------- .../schema/raw/response_to_all_accounts.json | 16 - .../raw/response_to_all_allowances.json | 101 ---- .../response_to_all_spender_allowances.json | 101 ---- .../schema/raw/response_to_allowance.json | 82 --- .../schema/raw/response_to_balance.json | 20 - .../schema/raw/response_to_download_logo.json | 25 - .../schema/raw/response_to_hooks.json | 17 - .../raw/response_to_marketing_info.json | 74 --- .../schema/raw/response_to_minter.json | 31 -- .../schema/raw/response_to_token_info.json | 34 -- .../schema/cw-admin-factory.json | 69 --- .../schema/dao-cw20-transfer-rules.json | 279 ++++++++++ .../dao-cw20-transfer-rules/src/contract.rs | 6 +- .../dao-cw20-transfer-rules/src/error.rs | 2 +- .../dao-cw20-transfer-rules/src/tests.rs | 180 ++++-- 18 files changed, 430 insertions(+), 1548 deletions(-) delete mode 100644 contracts/external/cw20-token/schema/raw/execute.json delete mode 100644 contracts/external/cw20-token/schema/raw/instantiate.json delete mode 100644 contracts/external/cw20-token/schema/raw/query.json delete mode 100644 contracts/external/cw20-token/schema/raw/response_to_all_accounts.json delete mode 100644 contracts/external/cw20-token/schema/raw/response_to_all_allowances.json delete mode 100644 contracts/external/cw20-token/schema/raw/response_to_all_spender_allowances.json delete mode 100644 contracts/external/cw20-token/schema/raw/response_to_allowance.json delete mode 100644 contracts/external/cw20-token/schema/raw/response_to_balance.json delete mode 100644 contracts/external/cw20-token/schema/raw/response_to_download_logo.json delete mode 100644 contracts/external/cw20-token/schema/raw/response_to_hooks.json delete mode 100644 contracts/external/cw20-token/schema/raw/response_to_marketing_info.json delete mode 100644 contracts/external/cw20-token/schema/raw/response_to_minter.json delete mode 100644 contracts/external/cw20-token/schema/raw/response_to_token_info.json delete mode 100644 contracts/external/dao-cw20-transfer-rules/schema/cw-admin-factory.json create mode 100644 contracts/external/dao-cw20-transfer-rules/schema/dao-cw20-transfer-rules.json diff --git a/contracts/external/cw20-token/schema/raw/execute.json b/contracts/external/cw20-token/schema/raw/execute.json deleted file mode 100644 index ede771967..000000000 --- a/contracts/external/cw20-token/schema/raw/execute.json +++ /dev/null @@ -1,519 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", - "oneOf": [ - { - "description": "Transfer is a base message to move tokens to another account without triggering actions", - "type": "object", - "required": [ - "transfer" - ], - "properties": { - "transfer": { - "type": "object", - "required": [ - "amount", - "recipient" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "recipient": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Burn is a base message to destroy tokens forever", - "type": "object", - "required": [ - "burn" - ], - "properties": { - "burn": { - "type": "object", - "required": [ - "amount" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Send is a base message to transfer tokens to a contract and trigger an action on the receiving contract.", - "type": "object", - "required": [ - "send" - ], - "properties": { - "send": { - "type": "object", - "required": [ - "amount", - "contract", - "msg" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "contract": { - "type": "string" - }, - "msg": { - "$ref": "#/definitions/Binary" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Only with \"approval\" extension. Allows spender to access an additional amount tokens from the owner's (env.sender) account. If expires is Some(), overwrites current allowance expiration with this one.", - "type": "object", - "required": [ - "increase_allowance" - ], - "properties": { - "increase_allowance": { - "type": "object", - "required": [ - "amount", - "spender" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "expires": { - "anyOf": [ - { - "$ref": "#/definitions/Expiration" - }, - { - "type": "null" - } - ] - }, - "spender": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Only with \"approval\" extension. Lowers the spender's access of tokens from the owner's (env.sender) account by amount. If expires is Some(), overwrites current allowance expiration with this one.", - "type": "object", - "required": [ - "decrease_allowance" - ], - "properties": { - "decrease_allowance": { - "type": "object", - "required": [ - "amount", - "spender" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "expires": { - "anyOf": [ - { - "$ref": "#/definitions/Expiration" - }, - { - "type": "null" - } - ] - }, - "spender": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Only with \"approval\" extension. Transfers amount tokens from owner -> recipient if `env.sender` has sufficient pre-approval.", - "type": "object", - "required": [ - "transfer_from" - ], - "properties": { - "transfer_from": { - "type": "object", - "required": [ - "amount", - "owner", - "recipient" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "owner": { - "type": "string" - }, - "recipient": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Only with \"approval\" extension. Sends amount tokens from owner -> contract if `env.sender` has sufficient pre-approval.", - "type": "object", - "required": [ - "send_from" - ], - "properties": { - "send_from": { - "type": "object", - "required": [ - "amount", - "contract", - "msg", - "owner" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "contract": { - "type": "string" - }, - "msg": { - "$ref": "#/definitions/Binary" - }, - "owner": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Only with \"approval\" extension. Destroys tokens forever", - "type": "object", - "required": [ - "burn_from" - ], - "properties": { - "burn_from": { - "type": "object", - "required": [ - "amount", - "owner" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "owner": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Only with the \"mintable\" extension. If authorized, creates amount new tokens and adds to the recipient balance.", - "type": "object", - "required": [ - "mint" - ], - "properties": { - "mint": { - "type": "object", - "required": [ - "amount", - "recipient" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "recipient": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Only with the \"mintable\" extension. The current minter may set a new minter. Setting the minter to None will remove the token's minter forever.", - "type": "object", - "required": [ - "update_minter" - ], - "properties": { - "update_minter": { - "type": "object", - "properties": { - "new_minter": { - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Only with the \"marketing\" extension. If authorized, updates marketing metadata. Setting None/null for any of these will leave it unchanged. Setting Some(\"\") will clear this field on the contract storage", - "type": "object", - "required": [ - "update_marketing" - ], - "properties": { - "update_marketing": { - "type": "object", - "properties": { - "description": { - "description": "A longer description of the token and it's utility. Designed for tooltips or such", - "type": [ - "string", - "null" - ] - }, - "marketing": { - "description": "The address (if any) who can update this data structure", - "type": [ - "string", - "null" - ] - }, - "project": { - "description": "A URL pointing to the project behind this token.", - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "If set as the \"marketing\" role on the contract, upload a new URL, SVG, or PNG for the token", - "type": "object", - "required": [ - "upload_logo" - ], - "properties": { - "upload_logo": { - "$ref": "#/definitions/Logo" - } - }, - "additionalProperties": false - }, - { - "description": "Adds a hook which is called on transfer / send events. Only callable by the minter.", - "type": "object", - "required": [ - "add_hook" - ], - "properties": { - "add_hook": { - "type": "object", - "required": [ - "addr" - ], - "properties": { - "addr": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Removes a hook which is called on transfer / send events. Only callable by the minter.", - "type": "object", - "required": [ - "remove_hook" - ], - "properties": { - "remove_hook": { - "type": "object", - "required": [ - "addr" - ], - "properties": { - "addr": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - ], - "definitions": { - "Binary": { - "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", - "type": "string" - }, - "EmbeddedLogo": { - "description": "This is used to store the logo on the blockchain in an accepted format. Enforce maximum size of 5KB on all variants.", - "oneOf": [ - { - "description": "Store the Logo as an SVG file. The content must conform to the spec at https://en.wikipedia.org/wiki/Scalable_Vector_Graphics (The contract should do some light-weight sanity-check validation)", - "type": "object", - "required": [ - "svg" - ], - "properties": { - "svg": { - "$ref": "#/definitions/Binary" - } - }, - "additionalProperties": false - }, - { - "description": "Store the Logo as a PNG file. This will likely only support up to 64x64 or so within the 5KB limit.", - "type": "object", - "required": [ - "png" - ], - "properties": { - "png": { - "$ref": "#/definitions/Binary" - } - }, - "additionalProperties": false - } - ] - }, - "Expiration": { - "description": "Expiration represents a point in time when some event happens. It can compare with a BlockInfo and will return is_expired() == true once the condition is hit (and for every block in the future)", - "oneOf": [ - { - "description": "AtHeight will expire when `env.block.height` >= height", - "type": "object", - "required": [ - "at_height" - ], - "properties": { - "at_height": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - }, - "additionalProperties": false - }, - { - "description": "AtTime will expire when `env.block.time` >= time", - "type": "object", - "required": [ - "at_time" - ], - "properties": { - "at_time": { - "$ref": "#/definitions/Timestamp" - } - }, - "additionalProperties": false - }, - { - "description": "Never will never expire. Used to express the empty variant", - "type": "object", - "required": [ - "never" - ], - "properties": { - "never": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - } - ] - }, - "Logo": { - "description": "This is used for uploading logo data, or setting it in InstantiateData", - "oneOf": [ - { - "description": "A reference to an externally hosted logo. Must be a valid HTTP or HTTPS URL.", - "type": "object", - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string" - } - }, - "additionalProperties": false - }, - { - "description": "Logo content stored on the blockchain. Enforce maximum size of 5KB on all variants", - "type": "object", - "required": [ - "embedded" - ], - "properties": { - "embedded": { - "$ref": "#/definitions/EmbeddedLogo" - } - }, - "additionalProperties": false - } - ] - }, - "Timestamp": { - "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", - "allOf": [ - { - "$ref": "#/definitions/Uint64" - } - ] - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - }, - "Uint64": { - "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/external/cw20-token/schema/raw/instantiate.json b/contracts/external/cw20-token/schema/raw/instantiate.json deleted file mode 100644 index 4a5407359..000000000 --- a/contracts/external/cw20-token/schema/raw/instantiate.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "InstantiateMsg", - "type": "object", - "required": [ - "decimals", - "initial_balances", - "name", - "symbol" - ], - "properties": { - "decimals": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "initial_balances": { - "type": "array", - "items": { - "$ref": "#/definitions/Cw20Coin" - } - }, - "marketing": { - "anyOf": [ - { - "$ref": "#/definitions/InstantiateMarketingInfo" - }, - { - "type": "null" - } - ] - }, - "mint": { - "anyOf": [ - { - "$ref": "#/definitions/MinterResponse" - }, - { - "type": "null" - } - ] - }, - "name": { - "type": "string" - }, - "symbol": { - "type": "string" - } - }, - "additionalProperties": false, - "definitions": { - "Binary": { - "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", - "type": "string" - }, - "Cw20Coin": { - "type": "object", - "required": [ - "address", - "amount" - ], - "properties": { - "address": { - "type": "string" - }, - "amount": { - "$ref": "#/definitions/Uint128" - } - }, - "additionalProperties": false - }, - "EmbeddedLogo": { - "description": "This is used to store the logo on the blockchain in an accepted format. Enforce maximum size of 5KB on all variants.", - "oneOf": [ - { - "description": "Store the Logo as an SVG file. The content must conform to the spec at https://en.wikipedia.org/wiki/Scalable_Vector_Graphics (The contract should do some light-weight sanity-check validation)", - "type": "object", - "required": [ - "svg" - ], - "properties": { - "svg": { - "$ref": "#/definitions/Binary" - } - }, - "additionalProperties": false - }, - { - "description": "Store the Logo as a PNG file. This will likely only support up to 64x64 or so within the 5KB limit.", - "type": "object", - "required": [ - "png" - ], - "properties": { - "png": { - "$ref": "#/definitions/Binary" - } - }, - "additionalProperties": false - } - ] - }, - "InstantiateMarketingInfo": { - "type": "object", - "properties": { - "description": { - "type": [ - "string", - "null" - ] - }, - "logo": { - "anyOf": [ - { - "$ref": "#/definitions/Logo" - }, - { - "type": "null" - } - ] - }, - "marketing": { - "type": [ - "string", - "null" - ] - }, - "project": { - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false - }, - "Logo": { - "description": "This is used for uploading logo data, or setting it in InstantiateData", - "oneOf": [ - { - "description": "A reference to an externally hosted logo. Must be a valid HTTP or HTTPS URL.", - "type": "object", - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string" - } - }, - "additionalProperties": false - }, - { - "description": "Logo content stored on the blockchain. Enforce maximum size of 5KB on all variants", - "type": "object", - "required": [ - "embedded" - ], - "properties": { - "embedded": { - "$ref": "#/definitions/EmbeddedLogo" - } - }, - "additionalProperties": false - } - ] - }, - "MinterResponse": { - "type": "object", - "required": [ - "minter" - ], - "properties": { - "cap": { - "description": "cap is a hard cap on total supply that can be achieved by minting. Note that this refers to total_supply. If None, there is unlimited cap.", - "anyOf": [ - { - "$ref": "#/definitions/Uint128" - }, - { - "type": "null" - } - ] - }, - "minter": { - "type": "string" - } - }, - "additionalProperties": false - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/external/cw20-token/schema/raw/query.json b/contracts/external/cw20-token/schema/raw/query.json deleted file mode 100644 index dfb3d4678..000000000 --- a/contracts/external/cw20-token/schema/raw/query.json +++ /dev/null @@ -1,226 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryMsg", - "oneOf": [ - { - "description": "Returns the current balance of the given address, 0 if unset.", - "type": "object", - "required": [ - "balance" - ], - "properties": { - "balance": { - "type": "object", - "required": [ - "address" - ], - "properties": { - "address": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Returns metadata on the contract - name, decimals, supply, etc.", - "type": "object", - "required": [ - "token_info" - ], - "properties": { - "token_info": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Only with \"mintable\" extension. Returns who can mint and the hard cap on maximum tokens after minting.", - "type": "object", - "required": [ - "minter" - ], - "properties": { - "minter": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Only with \"allowance\" extension. Returns how much spender can use from owner account, 0 if unset.", - "type": "object", - "required": [ - "allowance" - ], - "properties": { - "allowance": { - "type": "object", - "required": [ - "owner", - "spender" - ], - "properties": { - "owner": { - "type": "string" - }, - "spender": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Only with \"enumerable\" extension (and \"allowances\") Returns all allowances this owner has approved. Supports pagination.", - "type": "object", - "required": [ - "all_allowances" - ], - "properties": { - "all_allowances": { - "type": "object", - "required": [ - "owner" - ], - "properties": { - "limit": { - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - }, - "owner": { - "type": "string" - }, - "start_after": { - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Only with \"enumerable\" extension (and \"allowances\") Returns all allowances this spender has been granted. Supports pagination.", - "type": "object", - "required": [ - "all_spender_allowances" - ], - "properties": { - "all_spender_allowances": { - "type": "object", - "required": [ - "spender" - ], - "properties": { - "limit": { - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - }, - "spender": { - "type": "string" - }, - "start_after": { - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Only with \"enumerable\" extension Returns all accounts that have balances. Supports pagination.", - "type": "object", - "required": [ - "all_accounts" - ], - "properties": { - "all_accounts": { - "type": "object", - "properties": { - "limit": { - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - }, - "start_after": { - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Only with \"marketing\" extension Returns more metadata on the contract to display in the client: - description, logo, project url, etc.", - "type": "object", - "required": [ - "marketing_info" - ], - "properties": { - "marketing_info": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Only with \"marketing\" extension Downloads the embedded logo data (if stored on chain). Errors if no logo data is stored for this contract.", - "type": "object", - "required": [ - "download_logo" - ], - "properties": { - "download_logo": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "description": "Shows all registered transfer / send hooks.", - "type": "object", - "required": [ - "hooks" - ], - "properties": { - "hooks": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - } - ] -} diff --git a/contracts/external/cw20-token/schema/raw/response_to_all_accounts.json b/contracts/external/cw20-token/schema/raw/response_to_all_accounts.json deleted file mode 100644 index cea50fba4..000000000 --- a/contracts/external/cw20-token/schema/raw/response_to_all_accounts.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "AllAccountsResponse", - "type": "object", - "required": [ - "accounts" - ], - "properties": { - "accounts": { - "type": "array", - "items": { - "type": "string" - } - } - } -} diff --git a/contracts/external/cw20-token/schema/raw/response_to_all_allowances.json b/contracts/external/cw20-token/schema/raw/response_to_all_allowances.json deleted file mode 100644 index 012872250..000000000 --- a/contracts/external/cw20-token/schema/raw/response_to_all_allowances.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "AllAllowancesResponse", - "type": "object", - "required": [ - "allowances" - ], - "properties": { - "allowances": { - "type": "array", - "items": { - "$ref": "#/definitions/AllowanceInfo" - } - } - }, - "definitions": { - "AllowanceInfo": { - "type": "object", - "required": [ - "allowance", - "expires", - "spender" - ], - "properties": { - "allowance": { - "$ref": "#/definitions/Uint128" - }, - "expires": { - "$ref": "#/definitions/Expiration" - }, - "spender": { - "type": "string" - } - }, - "additionalProperties": false - }, - "Expiration": { - "description": "Expiration represents a point in time when some event happens. It can compare with a BlockInfo and will return is_expired() == true once the condition is hit (and for every block in the future)", - "oneOf": [ - { - "description": "AtHeight will expire when `env.block.height` >= height", - "type": "object", - "required": [ - "at_height" - ], - "properties": { - "at_height": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - }, - "additionalProperties": false - }, - { - "description": "AtTime will expire when `env.block.time` >= time", - "type": "object", - "required": [ - "at_time" - ], - "properties": { - "at_time": { - "$ref": "#/definitions/Timestamp" - } - }, - "additionalProperties": false - }, - { - "description": "Never will never expire. Used to express the empty variant", - "type": "object", - "required": [ - "never" - ], - "properties": { - "never": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - } - ] - }, - "Timestamp": { - "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", - "allOf": [ - { - "$ref": "#/definitions/Uint64" - } - ] - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - }, - "Uint64": { - "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/external/cw20-token/schema/raw/response_to_all_spender_allowances.json b/contracts/external/cw20-token/schema/raw/response_to_all_spender_allowances.json deleted file mode 100644 index f682c7bcc..000000000 --- a/contracts/external/cw20-token/schema/raw/response_to_all_spender_allowances.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "AllSpenderAllowancesResponse", - "type": "object", - "required": [ - "allowances" - ], - "properties": { - "allowances": { - "type": "array", - "items": { - "$ref": "#/definitions/SpenderAllowanceInfo" - } - } - }, - "definitions": { - "Expiration": { - "description": "Expiration represents a point in time when some event happens. It can compare with a BlockInfo and will return is_expired() == true once the condition is hit (and for every block in the future)", - "oneOf": [ - { - "description": "AtHeight will expire when `env.block.height` >= height", - "type": "object", - "required": [ - "at_height" - ], - "properties": { - "at_height": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - }, - "additionalProperties": false - }, - { - "description": "AtTime will expire when `env.block.time` >= time", - "type": "object", - "required": [ - "at_time" - ], - "properties": { - "at_time": { - "$ref": "#/definitions/Timestamp" - } - }, - "additionalProperties": false - }, - { - "description": "Never will never expire. Used to express the empty variant", - "type": "object", - "required": [ - "never" - ], - "properties": { - "never": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - } - ] - }, - "SpenderAllowanceInfo": { - "type": "object", - "required": [ - "allowance", - "expires", - "owner" - ], - "properties": { - "allowance": { - "$ref": "#/definitions/Uint128" - }, - "expires": { - "$ref": "#/definitions/Expiration" - }, - "owner": { - "type": "string" - } - }, - "additionalProperties": false - }, - "Timestamp": { - "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", - "allOf": [ - { - "$ref": "#/definitions/Uint64" - } - ] - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - }, - "Uint64": { - "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/external/cw20-token/schema/raw/response_to_allowance.json b/contracts/external/cw20-token/schema/raw/response_to_allowance.json deleted file mode 100644 index dbaf97db7..000000000 --- a/contracts/external/cw20-token/schema/raw/response_to_allowance.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "AllowanceResponse", - "type": "object", - "required": [ - "allowance", - "expires" - ], - "properties": { - "allowance": { - "$ref": "#/definitions/Uint128" - }, - "expires": { - "$ref": "#/definitions/Expiration" - } - }, - "definitions": { - "Expiration": { - "description": "Expiration represents a point in time when some event happens. It can compare with a BlockInfo and will return is_expired() == true once the condition is hit (and for every block in the future)", - "oneOf": [ - { - "description": "AtHeight will expire when `env.block.height` >= height", - "type": "object", - "required": [ - "at_height" - ], - "properties": { - "at_height": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - }, - "additionalProperties": false - }, - { - "description": "AtTime will expire when `env.block.time` >= time", - "type": "object", - "required": [ - "at_time" - ], - "properties": { - "at_time": { - "$ref": "#/definitions/Timestamp" - } - }, - "additionalProperties": false - }, - { - "description": "Never will never expire. Used to express the empty variant", - "type": "object", - "required": [ - "never" - ], - "properties": { - "never": { - "type": "object", - "additionalProperties": false - } - }, - "additionalProperties": false - } - ] - }, - "Timestamp": { - "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", - "allOf": [ - { - "$ref": "#/definitions/Uint64" - } - ] - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - }, - "Uint64": { - "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/external/cw20-token/schema/raw/response_to_balance.json b/contracts/external/cw20-token/schema/raw/response_to_balance.json deleted file mode 100644 index 7dcf4d4a5..000000000 --- a/contracts/external/cw20-token/schema/raw/response_to_balance.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "BalanceResponse", - "type": "object", - "required": [ - "balance" - ], - "properties": { - "balance": { - "$ref": "#/definitions/Uint128" - } - }, - "additionalProperties": false, - "definitions": { - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/external/cw20-token/schema/raw/response_to_download_logo.json b/contracts/external/cw20-token/schema/raw/response_to_download_logo.json deleted file mode 100644 index c5aa32b92..000000000 --- a/contracts/external/cw20-token/schema/raw/response_to_download_logo.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "DownloadLogoResponse", - "description": "When we download an embedded logo, we get this response type. We expect a SPA to be able to accept this info and display it.", - "type": "object", - "required": [ - "data", - "mime_type" - ], - "properties": { - "data": { - "$ref": "#/definitions/Binary" - }, - "mime_type": { - "type": "string" - } - }, - "additionalProperties": false, - "definitions": { - "Binary": { - "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", - "type": "string" - } - } -} diff --git a/contracts/external/cw20-token/schema/raw/response_to_hooks.json b/contracts/external/cw20-token/schema/raw/response_to_hooks.json deleted file mode 100644 index 6d4652440..000000000 --- a/contracts/external/cw20-token/schema/raw/response_to_hooks.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "HooksResponse", - "type": "object", - "required": [ - "hooks" - ], - "properties": { - "hooks": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false -} diff --git a/contracts/external/cw20-token/schema/raw/response_to_marketing_info.json b/contracts/external/cw20-token/schema/raw/response_to_marketing_info.json deleted file mode 100644 index c36ee5f9c..000000000 --- a/contracts/external/cw20-token/schema/raw/response_to_marketing_info.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "MarketingInfoResponse", - "type": "object", - "properties": { - "description": { - "description": "A longer description of the token and it's utility. Designed for tooltips or such", - "type": [ - "string", - "null" - ] - }, - "logo": { - "description": "A link to the logo, or a comment there is an on-chain logo stored", - "anyOf": [ - { - "$ref": "#/definitions/LogoInfo" - }, - { - "type": "null" - } - ] - }, - "marketing": { - "description": "The address (if any) who can update this data structure", - "anyOf": [ - { - "$ref": "#/definitions/Addr" - }, - { - "type": "null" - } - ] - }, - "project": { - "description": "A URL pointing to the project behind this token.", - "type": [ - "string", - "null" - ] - } - }, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "LogoInfo": { - "description": "This is used to display logo info, provide a link or inform there is one that can be downloaded from the blockchain itself", - "oneOf": [ - { - "description": "A reference to an externally hosted logo. Must be a valid HTTP or HTTPS URL.", - "type": "object", - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string" - } - }, - "additionalProperties": false - }, - { - "description": "There is an embedded logo on the chain, make another call to download it.", - "type": "string", - "enum": [ - "embedded" - ] - } - ] - } - } -} diff --git a/contracts/external/cw20-token/schema/raw/response_to_minter.json b/contracts/external/cw20-token/schema/raw/response_to_minter.json deleted file mode 100644 index eaf971892..000000000 --- a/contracts/external/cw20-token/schema/raw/response_to_minter.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "MinterResponse", - "type": "object", - "required": [ - "minter" - ], - "properties": { - "cap": { - "description": "cap is a hard cap on total supply that can be achieved by minting. Note that this refers to total_supply. If None, there is unlimited cap.", - "anyOf": [ - { - "$ref": "#/definitions/Uint128" - }, - { - "type": "null" - } - ] - }, - "minter": { - "type": "string" - } - }, - "additionalProperties": false, - "definitions": { - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/external/cw20-token/schema/raw/response_to_token_info.json b/contracts/external/cw20-token/schema/raw/response_to_token_info.json deleted file mode 100644 index 0e84d125f..000000000 --- a/contracts/external/cw20-token/schema/raw/response_to_token_info.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "TokenInfoResponse", - "type": "object", - "required": [ - "decimals", - "name", - "symbol", - "total_supply" - ], - "properties": { - "decimals": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "name": { - "type": "string" - }, - "symbol": { - "type": "string" - }, - "total_supply": { - "$ref": "#/definitions/Uint128" - } - }, - "additionalProperties": false, - "definitions": { - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/external/dao-cw20-transfer-rules/schema/cw-admin-factory.json b/contracts/external/dao-cw20-transfer-rules/schema/cw-admin-factory.json deleted file mode 100644 index 629d84216..000000000 --- a/contracts/external/dao-cw20-transfer-rules/schema/cw-admin-factory.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "contract_name": "cw-admin-factory", - "contract_version": "2.3.0", - "idl_version": "1.0.0", - "instantiate": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "InstantiateMsg", - "type": "object", - "additionalProperties": false - }, - "execute": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", - "oneOf": [ - { - "description": "Instantiates the target contract with the provided instantiate message and code id and updates the contract's admin to be itself.", - "type": "object", - "required": [ - "instantiate_contract_with_self_admin" - ], - "properties": { - "instantiate_contract_with_self_admin": { - "type": "object", - "required": [ - "code_id", - "instantiate_msg", - "label" - ], - "properties": { - "code_id": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "instantiate_msg": { - "$ref": "#/definitions/Binary" - }, - "label": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - ], - "definitions": { - "Binary": { - "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", - "type": "string" - } - } - }, - "query": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryMsg", - "type": "string", - "enum": [] - }, - "migrate": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "MigrateMsg", - "type": "object", - "additionalProperties": false - }, - "sudo": null, - "responses": {} -} diff --git a/contracts/external/dao-cw20-transfer-rules/schema/dao-cw20-transfer-rules.json b/contracts/external/dao-cw20-transfer-rules/schema/dao-cw20-transfer-rules.json new file mode 100644 index 000000000..1e149c3df --- /dev/null +++ b/contracts/external/dao-cw20-transfer-rules/schema/dao-cw20-transfer-rules.json @@ -0,0 +1,279 @@ +{ + "contract_name": "dao-cw20-transfer-rules", + "contract_version": "2.4.0", + "idl_version": "1.0.0", + "instantiate": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "required": [ + "dao" + ], + "properties": { + "allowlist": { + "type": [ + "array", + "null" + ], + "items": { + "type": "string" + } + }, + "dao": { + "type": "string" + } + }, + "additionalProperties": false + }, + "execute": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "type": "object", + "required": [ + "cw20_hook" + ], + "properties": { + "cw20_hook": { + "$ref": "#/definitions/Cw20HookMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_allowlist" + ], + "properties": { + "update_allowlist": { + "type": "object", + "required": [ + "add", + "remove" + ], + "properties": { + "add": { + "type": "array", + "items": { + "type": "string" + } + }, + "remove": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + }, + "Cw20HookMsg": { + "oneOf": [ + { + "type": "object", + "required": [ + "transfer" + ], + "properties": { + "transfer": { + "type": "object", + "required": [ + "amount", + "recipient", + "sender" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "recipient": { + "type": "string" + }, + "sender": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "send" + ], + "properties": { + "send": { + "type": "object", + "required": [ + "amount", + "contract", + "msg", + "sender" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "contract": { + "type": "string" + }, + "msg": { + "$ref": "#/definitions/Binary" + }, + "sender": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } + }, + "query": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "QueryMsg", + "oneOf": [ + { + "description": "Returns the paginated list of addresses on the allowlist.", + "type": "object", + "required": [ + "allowlist" + ], + "properties": { + "allowlist": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Returns the DAO address", + "type": "object", + "required": [ + "dao" + ], + "properties": { + "dao": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Returns the DAO voting module address", + "type": "object", + "required": [ + "dao_voting_power_module" + ], + "properties": { + "dao_voting_power_module": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Returns whether an address is allowed to recieve tokens", + "type": "object", + "required": [ + "is_allowed" + ], + "properties": { + "is_allowed": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + "migrate": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "MigrateMsg", + "type": "object", + "additionalProperties": false + }, + "sudo": null, + "responses": { + "allowlist": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Array_of_Addr", + "type": "array", + "items": { + "$ref": "#/definitions/Addr" + }, + "definitions": { + "Addr": { + "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", + "type": "string" + } + } + }, + "dao": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Addr", + "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", + "type": "string" + }, + "dao_voting_power_module": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Addr", + "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", + "type": "string" + }, + "is_allowed": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Boolean", + "type": "boolean" + } + } +} diff --git a/contracts/external/dao-cw20-transfer-rules/src/contract.rs b/contracts/external/dao-cw20-transfer-rules/src/contract.rs index b2bab12aa..efa877990 100644 --- a/contracts/external/dao-cw20-transfer-rules/src/contract.rs +++ b/contracts/external/dao-cw20-transfer-rules/src/contract.rs @@ -74,8 +74,6 @@ pub fn execute_check_transfer( _info: MessageInfo, msg: Cw20HookMsg, ) -> Result { - // TODO check this comes from the correct cw20 contract? - let (recipient, sender) = match msg { Cw20HookMsg::Transfer { recipient, sender, .. @@ -94,8 +92,8 @@ pub fn execute_check_transfer( let dao = DAO.load(deps.storage)?; let dao_voting_module = DAO_VOTING_MODULE.load(deps.storage)?; - // Check if sender is the DAO, if so it's allowed to transfer - if dao == sender { + // Check if sender or recipient is the DAO, if so it's allowed to transfer + if dao == sender || dao == recipient { return Ok(Response::default()); } diff --git a/contracts/external/dao-cw20-transfer-rules/src/error.rs b/contracts/external/dao-cw20-transfer-rules/src/error.rs index ccad92ef3..6292b983f 100644 --- a/contracts/external/dao-cw20-transfer-rules/src/error.rs +++ b/contracts/external/dao-cw20-transfer-rules/src/error.rs @@ -2,7 +2,7 @@ use cosmwasm_std::StdError; use cw_ownable::OwnershipError; use thiserror::Error; -#[derive(Error, Debug)] +#[derive(Error, Debug, PartialEq)] pub enum ContractError { #[error("{0}")] Std(#[from] StdError), diff --git a/contracts/external/dao-cw20-transfer-rules/src/tests.rs b/contracts/external/dao-cw20-transfer-rules/src/tests.rs index 442f51398..09abcd612 100644 --- a/contracts/external/dao-cw20-transfer-rules/src/tests.rs +++ b/contracts/external/dao-cw20-transfer-rules/src/tests.rs @@ -17,7 +17,10 @@ use dao_voting::{ threshold::Threshold, }; -use crate::msg::{ExecuteMsg, InstantiateMsg}; +use crate::{ + msg::{ExecuteMsg, InstantiateMsg}, + ContractError, +}; fn dao_cw20_transfer_rules_contract() -> Box> { let contract = ContractWrapper::new( @@ -44,8 +47,7 @@ const ALLOWED: &str = "allowed"; const OWNER: &str = "owner"; const RANDOM: &str = "random"; -// TODO refactor for cw20-stake? -fn setup_cw20_dao(app: &mut App) -> Addr { +fn setup_cw20_dao(app: &mut App) -> (Addr, Addr, Addr, Addr) { let cw20_code_id = app.store_code(cw20_contract()); let dao_dao_core_id = app.store_code(dao_dao_contract()); let prop_single_id = app.store_code(proposal_single_contract()); @@ -170,7 +172,10 @@ fn setup_cw20_dao(app: &mut App) -> Addr { // Get DAO cw20 token addr let cw20_addr: Addr = app .wrap() - .query_wasm_smart(voting_module_addr, &VotingQueryMsg::TokenContract {}) + .query_wasm_smart( + voting_module_addr.clone(), + &VotingQueryMsg::TokenContract {}, + ) .unwrap(); // Stake tokens in the DAO @@ -191,43 +196,29 @@ fn setup_cw20_dao(app: &mut App) -> Addr { // Update the block so staked balances take effect app.update_block(next_block); - dao_addr + (dao_addr, voting_module_addr, cw20_addr, staking_addr) } -// TODO test with cw20 send #[test] -pub fn test() { +pub fn test_transfer_rules() { let mut app = App::default(); - let dao_addr = setup_cw20_dao(&mut app); + let (dao_addr, _, cw20_addr, _) = setup_cw20_dao(&mut app); let dao_cw20_transfer_rules_code_id = app.store_code(dao_cw20_transfer_rules_contract()); - let instantiate = InstantiateMsg { - dao: dao_addr.to_string(), - allowlist: None, - }; let transfer_rules_addr = app .instantiate_contract( dao_cw20_transfer_rules_code_id, Addr::unchecked("owner"), - &instantiate, + &InstantiateMsg { + dao: dao_addr.to_string(), + allowlist: None, + }, &[], "dao-cw20-transfer-rules", None, ) .unwrap(); - // Get DAO voting module addr - let voting_module_addr: Addr = app - .wrap() - .query_wasm_smart(dao_addr.clone(), &DaoQueryMsg::VotingModule {}) - .unwrap(); - - // Get DAO cw20 token addr - let cw20_addr: Addr = app - .wrap() - .query_wasm_smart(voting_module_addr, &VotingQueryMsg::TokenContract {}) - .unwrap(); - // Can't add hook if not owner / minter app.execute_contract( Addr::unchecked(RANDOM), @@ -251,7 +242,7 @@ pub fn test() { .unwrap(); // Now that hook is added, members can't transfer to non-members - let _err = app + let err: ContractError = app .execute_contract( Addr::unchecked(ADDR1), cw20_addr.clone(), @@ -261,9 +252,10 @@ pub fn test() { }, &[], ) - .unwrap_err(); - // println!("{:?}", err); - // assert_eq!(err, cw20_token::ContractError::Unauthorized {}); + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::Unauthorized {}); // Members can transfer to members app.execute_contract( @@ -278,7 +270,7 @@ pub fn test() { .unwrap(); // Non-owner can't update allowlist - let _err = app + let err: ContractError = app .execute_contract( Addr::unchecked(ADDR1), transfer_rules_addr.clone(), @@ -288,8 +280,13 @@ pub fn test() { }, &[], ) - .unwrap_err(); - // println!("{:?}", err); + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!( + err, + ContractError::Ownable(cw_ownable::OwnershipError::NotOwner) + ); // Add a new address to the allowlist app.execute_contract( @@ -339,3 +336,122 @@ pub fn test() { ) .unwrap(); } + +#[test] +pub fn test_send_rules() { + let mut app = App::default(); + let (dao_addr, _, cw20_addr, staking_addr) = setup_cw20_dao(&mut app); + let dao_cw20_transfer_rules_code_id = app.store_code(dao_cw20_transfer_rules_contract()); + + let transfer_rules_addr = app + .instantiate_contract( + dao_cw20_transfer_rules_code_id, + Addr::unchecked("owner"), + &InstantiateMsg { + dao: dao_addr.to_string(), + allowlist: None, + }, + &[], + "dao-cw20-transfer-rules", + None, + ) + .unwrap(); + + // Can't add hook if not owner / minter + app.execute_contract( + Addr::unchecked(RANDOM), + cw20_addr.clone(), + &dao_cw20::Cw20ExecuteMsg::AddHook { + addr: transfer_rules_addr.to_string(), + }, + &[], + ) + .unwrap_err(); + + // Add hook to the cw20 contract + app.execute_contract( + dao_addr.clone(), + cw20_addr.clone(), + &dao_cw20::Cw20ExecuteMsg::AddHook { + addr: transfer_rules_addr.to_string(), + }, + &[], + ) + .unwrap(); + + // Now that hook is added, members can't send to non-members or non-allowlisted contracts + // Including the staking contract. + let err: ContractError = app + .execute_contract( + Addr::unchecked(ADDR1.to_string()), + cw20_addr.clone(), + &cw20_token::msg::ExecuteMsg::Send { + contract: staking_addr.to_string(), + amount: Uint128::new(50_000), + msg: to_json_binary(&cw20_stake::msg::ReceiveMsg::Stake {}).unwrap(), + }, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::Unauthorized {}); + + // Members can send to the DAO contract + app.execute_contract( + Addr::unchecked(ADDR1.to_string()), + cw20_addr.clone(), + &cw20_token::msg::ExecuteMsg::Send { + contract: dao_addr.to_string(), + amount: Uint128::new(5000), + msg: to_json_binary(&Empty {}).unwrap(), + }, + &[], + ) + .unwrap(); + + // Add staking contract to the allowlist + app.execute_contract( + dao_addr.clone(), + transfer_rules_addr.clone(), + &ExecuteMsg::UpdateAllowlist { + add: vec![staking_addr.clone().to_string()], + remove: vec![], + }, + &[], + ) + .unwrap(); + + // Members can now send to the staking contract + app.execute_contract( + Addr::unchecked(ADDR1.to_string()), + cw20_addr.clone(), + &cw20_token::msg::ExecuteMsg::Send { + contract: staking_addr.to_string(), + amount: Uint128::new(50_000), + msg: to_json_binary(&cw20_stake::msg::ReceiveMsg::Stake {}).unwrap(), + }, + &[], + ) + .unwrap(); +} + +#[test] +pub fn test_instantiate_invalid_dao_fails() { + let mut app = App::default(); + let (_, _, cw20_addr, _) = setup_cw20_dao(&mut app); + let dao_cw20_transfer_rules_code_id = app.store_code(dao_cw20_transfer_rules_contract()); + + app.instantiate_contract( + dao_cw20_transfer_rules_code_id, + Addr::unchecked("owner"), + &InstantiateMsg { + dao: cw20_addr.to_string(), + allowlist: None, + }, + &[], + "dao-cw20-transfer-rules", + None, + ) + .unwrap_err(); +}