Skip to content

Commit

Permalink
feat: announcement banner on deposit/withdraw screens
Browse files Browse the repository at this point in the history
  • Loading branch information
kylehoang92 committed Dec 18, 2024
1 parent 889f7fb commit 184f8df
Show file tree
Hide file tree
Showing 6 changed files with 140 additions and 12 deletions.
23 changes: 15 additions & 8 deletions .github/markets/pr_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Each json file under the [configs](../../configs) folder correspond to their res
|`wswth_contract` |`string` |false |wSWTH ERC-20 contract. |
|`market_banners` |`MarketBanner[]` |true |market banner configs. |
| `native_token_contracts_map` | `object` | false | Map of token denoms to their respective contract addresses on the native chain. | |
| `native_depositor_contracts_map` | `object` | false | Map of axelar connection ids to their respective native depositor contract addresses
| `native_depositor_contracts_map` | `object` | false | Map of axelar connection ids to their respective native depositor contract addresses
|`market_promo` |`MarketPromo` |false |Map of Objects that contains market promo parameters for each market |If the `market_promo` property is omitted, no promo will be shown. The key of each entry is the ids of the market with existing promo. |
|`spot_pool_config` |`SpotPoolConfig` |false |Object that contains the config parameters for the [Spot Pools](https://app.dem.exchange/pools/spot) page on Demex |

Expand Down Expand Up @@ -94,19 +94,19 @@ Each json file under the [configs](../../configs) folder correspond to their res
|---|---|---|---|---|
|`perp_pool_id` |`string` |true |Perp pool id where the banner will be shown. |Perp pool id **MUST** match one of the existing perp pool ids from the PerpPool PoolInfoAll RPC call.<br /><br /> To view the values of PoolInfoAll RPC call, simply run `yarn get-perp-pool-ids [network]` on the command line. Sample for mainnet: `yarn get-perp-pool-ids mainnet` |
|`show_from` |`string` |false |The date and time when the perp pool banner is scheduled to begin displaying. |If not provided, the banner will be shown immediately.<br /><br /> This field **MUST** follow the valid ISO 8601 format <br /> e.g. *2024-01-23T09:00+00:00* (23 Jan 2024, 9am UTC) |
|`show_until` |`string` |false |The date and time when the perp pool banner is scheduled to stop displaying. |If not provided, the banner will continue to display indefinitely.<br /><br /> This field **MUST** follow the valid ISO 8601 format <br /> e.g. *2024-01-23T09:00+00:00* (23 Jan 2024, 9am UTC) |
|`title` |`string` |true |The title shown on the perp pool banner. |
|`show_until` |`string` |false |The date and time when the perp pool banner is scheduled to stop displaying. |If not provided, the banner will continue to display indefinitely.<br /><br /> This field **MUST** follow the valid ISO 8601 format <br /> e.g. *2024-01-23T09:00+00:00* (23 Jan 2024, 9am UTC) |
|`title` |`string` |true |The title shown on the perp pool banner. |
|`removed_markets` |`string` |false |The message describing markets being removed, shown below the perp-pool banner title. | e.g. "BTCETH Perp will be removed on 6 Mar, 09:00AM UTC". If the field is omitted, no message describing markets being removed will be shown. |
|`added_markets` |`string` |false |The message describing markets being added, shown below the markets being removed (if any). | e.g. "ATOM Perp & SOL Perp will be added on 8 Mar, 12:00AM UTC". If the field is omitted, no message describing markets being added will be shown. |
|`subtext` |`string` |false |The subtext shown on the perp pool banner (below the removed and added market descriptions). |
|`added_markets` |`string` |false |The message describing markets being added, shown below the markets being removed (if any). | e.g. "ATOM Perp & SOL Perp will be added on 8 Mar, 12:00AM UTC". If the field is omitted, no message describing markets being added will be shown. |
|`subtext` |`string` |false |The subtext shown on the perp pool banner (below the removed and added market descriptions). |

## MarketBanner
|Field |Type |Required |Description |Notes |
|---|---|---|---|---|
|`market_id` |`string` |true |Market id where the banner will be shown. |Market id **MUST** match one of the existing market ids from the Market MarketAll RPC call.<br /><br /> To view the values of MarketAll RPC call, simply run `yarn get-market-ids [network]` on the command line. Sample for mainnet: `yarn get-market-ids mainnet` |
|`show_from` |`string` |false |The date and time when the market banner is scheduled to begin displaying. |If not provided, the banner will be shown immediately.<br /><br /> This field **MUST** follow the valid ISO 8601 format <br /> e.g. *2024-01-23T09:00+00:00* (23 Jan 2024, 9am UTC) |
|`show_until` |`string` |false |The date and time when the market banner is scheduled to stop displaying. |If not provided, the banner will continue to display indefinitely.<br /><br /> This field **MUST** follow the valid ISO 8601 format <br /> e.g. *2024-01-23T09:00+00:00* (23 Jan 2024, 9am UTC) |
|`content` |`string` |true |The content shown on the market banner. |
|`show_until` |`string` |false |The date and time when the market banner is scheduled to stop displaying. |If not provided, the banner will continue to display indefinitely.<br /><br /> This field **MUST** follow the valid ISO 8601 format <br /> e.g. *2024-01-23T09:00+00:00* (23 Jan 2024, 9am UTC) |
|`content` |`string` |true |The content shown on the market banner. |
|`hideable` |`boolean` |false |Indicates if user can hide the banner by clicking on the close button |If set to `false`, the close button will not be rendered on the banner, and user will not be able to dismiss the banner. |

## MarketPromo Data Structure
Expand All @@ -119,4 +119,11 @@ Each json file under the [configs](../../configs) folder correspond to their res
## SpotPoolConfig Data Structure
|Field |Type |Required |Description |Notes |
|---|---|---|---|---|
|`show_apr_tooltip` |`boolean` |true |Indicates whether or not to show the Annual Percentage Returns (APR) tooltip on [Spot Pools](https://app.dem.exchange/pools/spot) page |
|`show_apr_tooltip` |`boolean` |true |Indicates whether or not to show the Annual Percentage Returns (APR) tooltip on [Spot Pools](https://app.dem.exchange/pools/spot) page |

## TransferBanner Data Structure
|Field |Type |Required |Description |Notes |
|---|---|---|---|---|
|`no_longer_supported_tokens` |`array` |false |List of tokens are no longer supported |
|`temporary_disabled_transfer_tokens` |`TransferBanner` |false |List of tokens for which deposits and withdrawals have been temporarily disabled |
|`temporary_disabled_bridges` |`TransferBanner` |false |List of bridges for which deposits and withdrawals have been temporarily disabled |
55 changes: 55 additions & 0 deletions config.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,61 @@
"description": "Indicates whether or not to show APR tooltip on Spot Pools page"
}
}
},
"transfer_banner": {
"type": "object",
"description": "Config parameters to show banner for deposit and withdraw screens",
"properties": {
"no_longer_supported_tokens": {
"type": "array",
"description": "List of tokens are no longer supported",
"items": {
"type": "string"
}
},
"temporary_disabled_transfer_tokens": {
"type": "object",
"description": "List of tokens for which deposits and withdrawals have been temporarily disabled",
"patternProperties": {
".*": {
"type": "object",
"required": [
"start",
"end"
],
"properties": {
"start": {
"$ref": "#/$defs/start"
},
"end": {
"$ref": "#/$defs/end"
}
}
}
}
},
"temporary_disabled_bridges": {
"type": "object",
"description": "List of bridges for which deposits and withdrawals have been temporarily disabled",
"patternProperties": {
".*": {
"type": "object",
"required": [
"start",
"end"
],
"properties": {
"start": {
"$ref": "#/$defs/start"
},
"end": {
"$ref": "#/$defs/end"
}
}
}
}
}
}
}
}
}
5 changes: 5 additions & 0 deletions configs/devnet.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,10 @@
],
"spot_pool_config": {
"show_apr_tooltip": false
},
"transfer_banner": {
"no_longer_supported_tokens": [],
"temporary_disabled_transfer_tokens": {},
"temporary_disabled_bridges": {}
}
}
9 changes: 7 additions & 2 deletions configs/mainnet.json
Original file line number Diff line number Diff line change
Expand Up @@ -500,5 +500,10 @@
"label_denom": "brdg/a02afc2c1edf77cc023eefa25fc036c184612faf9365cda9c1daa3b1675ebf8f",
"target_denom": "brdg/a02afc2c1edf77cc023eefa25fc036c184612faf9365cda9c1daa3b1675ebf8f"
}
]
}
],
"transfer_banner": {
"no_longer_supported_tokens": [],
"temporary_disabled_transfer_tokens": {},
"temporary_disabled_bridges": {}
}
}
5 changes: 5 additions & 0 deletions configs/testnet.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,10 @@
},
"spot_pool_config": {
"show_apr_tooltip": false
},
"transfer_banner": {
"no_longer_supported_tokens": [],
"temporary_disabled_transfer_tokens": {},
"temporary_disabled_bridges": {}
}
}
55 changes: 53 additions & 2 deletions scripts/check_configs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ interface ConfigJSON {
market_banners?: MarketBanner[];
market_promo?: {[marketId: string]: MarketPromo};
spot_pool_config?: SpotPoolConfig;
transfer_banner?: TransferBanner;
}

interface InvalidEntry {
Expand Down Expand Up @@ -132,6 +133,22 @@ interface SpotPoolConfig {
show_apr_tooltip: boolean;
}

interface TransferBanner {
no_longer_supported_tokens: [],
temporary_disabled_transfer_tokens: {
[denom: string]: {
start: string,
end: string
}
},
temporary_disabled_bridges: {
[bridgeAddress: string]: {
start: string,
end: string
}
}
}

type OutcomeMap = { [key in CarbonSDK.Network]: boolean }; // true = success, false = failure

const outcomeMap: OutcomeMap = {
Expand Down Expand Up @@ -201,7 +218,7 @@ function joinEntriesIntoStr(entriesArr: string[]): string {
: entriesArr[0];
}

// check list of markets to ensure that it does not have blacklisted markets
// check list of markets to ensure that it does not have blacklisted markets
function checkBlacklistedMarkets(marketData: string[], blacklistedMarkets: string[]): InvalidEntry {
let overlappingMarkets: string[] = [];
marketData.forEach(market => {
Expand Down Expand Up @@ -420,6 +437,35 @@ function isValidMarketPromo(marketPromo: {[marketId: string]: MarketPromo}, netw
return true;
}

function isValidTransferBanner(transferBanner: TransferBanner, network: CarbonSDK.Network): boolean {
const { temporary_disabled_transfer_tokens, temporary_disabled_bridges } = transferBanner;
if (Object.keys(temporary_disabled_transfer_tokens).length > 0) {
Object.keys(temporary_disabled_transfer_tokens).map((key) => {
const { start, end } = temporary_disabled_transfer_tokens[key];
const startTime = new Date(start);
const endTime = new Date(end);
if (endTime < startTime) {
console.error(`ERROR: ${network}.json has invalid end time (${end}) is before start time (${start}) for token denom ${key}.`);
return false;
}
});
}

if (Object.keys(temporary_disabled_bridges).length > 0) {
Object.keys(temporary_disabled_bridges).map((key) => {
const { start, end } = temporary_disabled_bridges[key];
const startTime = new Date(start);
const endTime = new Date(end);
if (endTime < startTime) {
console.error(`ERROR: ${network}.json has invalid end time (${end}) is before start time (${start}) for bridge address ${key}.`);
return false;
}
});
}

return true
}

async function main() {
for (const net of myArgs) {
let network: CarbonSDK.Network;
Expand Down Expand Up @@ -752,7 +798,7 @@ async function main() {
if(jsonData.market_promo && !isValidMarketPromo(jsonData.market_promo, network, marketIds)) {
outcomeMap[network] = false;
}

// check for spot pool config
if (jsonData.spot_pool_config) {
const spotPoolConfig = jsonData.spot_pool_config
Expand All @@ -775,6 +821,11 @@ async function main() {
const isDemexTradingLeagueConfigValid = isValidDemexTradingLeagueConfig(jsonData.demex_trading_league_config, network, marketIds, jsonData.blacklisted_markets, perpPoolIds, tokenSymbols)
if (!isDemexTradingLeagueConfigValid) outcomeMap[network] = false;
}

// transfer banner check
if (jsonData.transfer_banner && !isValidTransferBanner(jsonData.transfer_banner, network)) {
outcomeMap[network] = false;
}
}
}
const outcomeArr = Object.values(outcomeMap);
Expand Down

0 comments on commit 184f8df

Please sign in to comment.