Skip to content

Commit

Permalink
Merge branch 'staging' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
CarlosQ96 authored Jan 22, 2024
2 parents 297bf38 + 86084a7 commit 4cfa455
Show file tree
Hide file tree
Showing 33 changed files with 944 additions and 297 deletions.
4 changes: 3 additions & 1 deletion .github/workflows/develop-pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,9 @@ jobs:
CELO_ALFAJORES_SCAN_API_KEY: ${{ secrets.CELO_ALFAJORES_SCAN_API_KEY }}
MORDOR_ETC_TESTNET: ${{ secrets.MORDOR_ETC_TESTNET }}
ETC_NODE_HTTP_URL: ${{ secrets.ETC_NODE_HTTP_URL }}
SOLANA_NODE_RPC_URL: ${{ secrets.SOLANA_NODE_RPC_URL }}
SOLANA_TEST_NODE_RPC_URL: ${{ secrets.SOLANA_TEST_NODE_RPC_URL }}
SOLANA_DEVNET_NODE_RPC_URL: ${{ secrets.SOLANA_DEVNET_NODE_RPC_URL }}
SOLANA_MAINNET_NODE_RPC_URL: ${{ secrets.SOLANA_MAINNET_NODE_RPC_URL }}

publish:
needs: test
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/master-pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,9 @@ jobs:
CELO_ALFAJORES_SCAN_API_KEY: ${{ secrets.CELO_ALFAJORES_SCAN_API_KEY }}
MORDOR_ETC_TESTNET: ${{ secrets.MORDOR_ETC_TESTNET }}
ETC_NODE_HTTP_URL: ${{ secrets.ETC_NODE_HTTP_URL }}
SOLANA_NODE_RPC_URL: ${{ secrets.SOLANA_NODE_RPC_URL }}
SOLANA_TEST_NODE_RPC_URL: ${{ secrets.SOLANA_TEST_NODE_RPC_URL }}
SOLANA_DEVNET_NODE_RPC_URL: ${{ secrets.SOLANA_DEVNET_NODE_RPC_URL }}
SOLANA_MAINNET_NODE_RPC_URL: ${{ secrets.SOLANA_MAINNET_NODE_RPC_URL }}

publish:
needs: test
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/staging-pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,9 @@ jobs:
MORDOR_ETC_TESTNET: ${{ secrets.MORDOR_ETC_TESTNET }}
ETC_NODE_HTTP_URL: ${{ secrets.ETC_NODE_HTTP_URL }}
DROP_DATABASE: ${{ secrets.DROP_DATABASE }}
SOLANA_NODE_RPC_URL: ${{ secrets.SOLANA_NODE_RPC_URL }}
SOLANA_TEST_NODE_RPC_URL: ${{ secrets.SOLANA_TEST_NODE_RPC_URL }}
SOLANA_DEVNET_NODE_RPC_URL: ${{ secrets.SOLANA_DEVNET_NODE_RPC_URL }}
SOLANA_MAINNET_NODE_RPC_URL: ${{ secrets.SOLANA_MAINNET_NODE_RPC_URL }}

publish:
needs: test
Expand Down
2 changes: 1 addition & 1 deletion config/example.env
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,6 @@ DISABLE_SERVER_RATE_LIMITER=false

DISABLE_SERVER_CORS=false

SOLANA_NODE_RPC_URL=
SOLANA_MAINNET_NODE_RPC_URL=
SOLANA_DEVNET_NODE_RPC_URL=
SOLANA_TEST_NODE_RPC_URL=
Expand All @@ -244,4 +243,5 @@ LOST_DONATIONS_TX_HASHES=
LOST_DONATIONS_QF_ROUND=
LOST_DONATIONS_NETWORK_ID=

SOLANA_CHAIN_ID=103
DISABLE_NOTIFICATION_CENTER=
5 changes: 3 additions & 2 deletions config/test.env
Original file line number Diff line number Diff line change
Expand Up @@ -195,15 +195,16 @@ MATCHING_FUND_DONATIONS_FROM_ADDRESS=0x6e8873085530406995170Da467010565968C7C62
# Rate Limit config
DISABLE_SERVER_RATE_LIMITER=false
DISABLE_SERVER_CORS=false
SOLANA_NODE_RPC_URL=

SOLANA_MAINNET_NODE_RPC_URL=
SOLANA_DEVNET_NODE_RPC_URL=
SOLANA_TEST_NODE_RPC_URL=

SOLANA_CHAIN_ID=103

ENABLE_IMPORT_LOST_DONATIONS=false
IMPORT_LOST_DONATIONS_CRONJOB_EXPRESSION=
LOST_DONATIONS_TX_HASHES=0xb017677647418e1a35e59715f8e4e549d0e449d67faf5c73ed20e6d3ce67fb49
LOST_DONATIONS_TX_HASHES=0x4012421fbc2cecc85804f3b98bdd31bef04589dbac8292deca33e699868af01f,0x067e91368272dc73bc715a21a2af863a333cde20f410189fa53bceaa9cb8c86b
LOST_DONATIONS_QF_ROUND=
LOST_DONATIONS_NETWORK_ID=10

Expand Down
32 changes: 20 additions & 12 deletions migration/1703044586989-addSolanaToken.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,28 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
import { NETWORK_IDS } from '../src/provider';
import { Token } from '../src/entities/token';
import seedTokens from './data/seedTokens';
import { ChainType } from '../src/types/network';
import { SOLANA_SYSTEM_PROGRAM } from '../src/utils/networks';
import { ENVIRONMENTS } from '../src/utils/utils';
import { MigrationInterface, QueryRunner } from 'typeorm';
import { NETWORK_IDS } from '../src/provider';
import { Token } from '../src/entities/token';

export class addSolanaToken1703044586989 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.manager.save(
Token,
seedTokens.filter(
async up(queryRunner: QueryRunner): Promise<void> {
let tokensData;
if (process.env.ENVIRONMENT === ENVIRONMENTS.PRODUCTION) {
tokensData = seedTokens.filter(
token =>
token.address === SOLANA_SYSTEM_PROGRAM &&
token.chainType === ChainType.SOLANA,
),
);
token.networkId === NETWORK_IDS.SOLANA_MAINNET &&
token.address === SOLANA_SYSTEM_PROGRAM,
);
} else {
tokensData = seedTokens.filter(
token =>
token.networkId === NETWORK_IDS.SOLANA_DEVNET &&
token.address === SOLANA_SYSTEM_PROGRAM,
);
}
await queryRunner.manager.save(Token, tokensData);
const tokens = await queryRunner.query(
`SELECT * FROM token WHERE "chainType" = $1 AND "address" = $2`,
[ChainType.SOLANA, SOLANA_SYSTEM_PROGRAM],
Expand All @@ -33,7 +41,7 @@ export class addSolanaToken1703044586989 implements MigrationInterface {
);
}

public async down(queryRunner: QueryRunner): Promise<void> {
async down(queryRunner: QueryRunner): Promise<void> {
const tokens = await queryRunner.query(
`SELECT * FROM token WHERE "chainType" = $1 AND "address" = $2`,
[ChainType.SOLANA, SOLANA_SYSTEM_PROGRAM],
Expand Down
62 changes: 62 additions & 0 deletions migration/1704487070444-addSolanaSplTokens.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
import { Token } from '../src/entities/token';
import seedTokens from './data/seedTokens';
import { NETWORK_IDS } from '../src/provider';
import { ChainType } from '../src/types/network';
import { SOLANA_SYSTEM_PROGRAM } from '../src/utils/networks';
import { ENVIRONMENTS } from '../src/utils/utils';

export class addSolanaSplTokens1704487070444 implements MigrationInterface {
async up(queryRunner: QueryRunner): Promise<void> {
let tokensData;
if (process.env.ENVIRONMENT === ENVIRONMENTS.PRODUCTION) {
tokensData = seedTokens.filter(
token =>
token.networkId === NETWORK_IDS.SOLANA_MAINNET &&
token.address !== SOLANA_SYSTEM_PROGRAM,
);
} else {
tokensData = seedTokens.filter(
token =>
token.networkId === NETWORK_IDS.SOLANA_DEVNET &&
token.address !== SOLANA_SYSTEM_PROGRAM,
);
}
await queryRunner.manager.save(Token, tokensData);
const tokens = await queryRunner.query(
`SELECT * FROM token WHERE "chainType" = $1 AND "address" != $2`,
[ChainType.SOLANA, SOLANA_SYSTEM_PROGRAM],
);
const givethOrganization = (
await queryRunner.query(`SELECT * FROM organization
WHERE label='giveth'`)
)[0];
const traceOrganization = (
await queryRunner.query(`SELECT * FROM organization
WHERE label='trace'`)
)[0];

for (const token of tokens) {
await queryRunner.query(
`INSERT INTO organization_tokens_token ("tokenId", "organizationId") VALUES ($1, $2), ($1, $3)`,
[token.id, givethOrganization.id, traceOrganization.id],
);
}
}

async down(queryRunner: QueryRunner): Promise<void> {
const tokens = await queryRunner.query(
`SELECT * FROM token WHERE "chainType" = $1 AND "address" != $2`,
[ChainType.SOLANA, SOLANA_SYSTEM_PROGRAM],
);
await queryRunner.query(
`DELETE FROM organization_tokens_token WHERE "tokenId" IN (${tokens
.map(token => token.id)
.join(',')})`,
);
await queryRunner.query(
`DELETE FROM token WHERE "chainType" = $1 AND "address" != $2`,
[ChainType.SOLANA, SOLANA_SYSTEM_PROGRAM],
);
}
}
108 changes: 106 additions & 2 deletions migration/data/seedTokens.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1262,13 +1262,117 @@ const seedTokens: ITokenData[] = [
decimals: 18,
networkId: NETWORK_IDS.MORDOR_ETC_TESTNET,
},
// TODO: Add solana token
// SOLANA mainnet
{
name: 'Solana native token',
symbol: 'SOL',
address: SOLANA_SYSTEM_PROGRAM,
decimals: 9,
networkId: NETWORK_IDS.SOLANA,
networkId: NETWORK_IDS.SOLANA_MAINNET,
chainType: ChainType.SOLANA,
coingeckoId: COINGECKO_TOKEN_IDS.SOLANA,
},
{
name: 'Marinade staked SOL',
symbol: 'mSOL',
address: 'mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So',
decimals: 9,
networkId: NETWORK_IDS.SOLANA_MAINNET,
chainType: ChainType.SOLANA,
coingeckoId: COINGECKO_TOKEN_IDS.MSOL,
},
{
name: 'USDC',
symbol: 'USDC',
address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
decimals: 6,
networkId: NETWORK_IDS.SOLANA_MAINNET,
chainType: ChainType.SOLANA,
coingeckoId: COINGECKO_TOKEN_IDS.USDC,
},
{
name: 'Tether',
symbol: 'USDCT',
address: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',
decimals: 6,
networkId: NETWORK_IDS.SOLANA_MAINNET,
chainType: ChainType.SOLANA,
coingeckoId: COINGECKO_TOKEN_IDS.USDT,
},
{
name: 'Raydium',
symbol: 'RAY',
address: '4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R',
decimals: 6,
networkId: NETWORK_IDS.SOLANA_MAINNET,
chainType: ChainType.SOLANA,
coingeckoId: COINGECKO_TOKEN_IDS.RAY,
},
{
name: 'BlazeStake Staked SOL',
symbol: 'BSOL',
address: 'bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1',
decimals: 9,
networkId: NETWORK_IDS.SOLANA_MAINNET,
chainType: ChainType.SOLANA,
coingeckoId: COINGECKO_TOKEN_IDS.BSOL,
},
{
name: 'Audius (Wormhole)',
symbol: 'AUDIO',
address: '9LzCMqDgTKYz9Drzqnpgee3SGa89up3a247ypMj2xrqM',
decimals: 8,
networkId: NETWORK_IDS.SOLANA_MAINNET,
chainType: ChainType.SOLANA,
coingeckoId: COINGECKO_TOKEN_IDS.AUDIO,
},
{
name: 'Mango',
symbol: 'MANGO',
address: 'MangoCzJ36AjZyKwVj3VnYU4GTonjfVEnJmvvWaxLac',
decimals: 6,
networkId: NETWORK_IDS.SOLANA_MAINNET,
chainType: ChainType.SOLANA,
coingeckoId: COINGECKO_TOKEN_IDS.MANGO,
},
{
name: 'Coin98',
symbol: 'C98',
address: 'C98A4nkJXhpVZNAZdHUA95RpTF3T4whtQubL3YobiUX9',
decimals: 6,
networkId: NETWORK_IDS.SOLANA_MAINNET,
chainType: ChainType.SOLANA,
coingeckoId: COINGECKO_TOKEN_IDS.C98,
},

// SOLANA devnet
{
name: 'Solana native token',
symbol: 'SOL',
address: SOLANA_SYSTEM_PROGRAM,
decimals: 9,
networkId: NETWORK_IDS.SOLANA_DEVNET,
chainType: ChainType.SOLANA,
coingeckoId: COINGECKO_TOKEN_IDS.SOLANA,
},

{
// Mohammad has deployed it on solana devnet, so you can get some tokens from him
name: 'Test SPL token',
symbol: 'TEST-SPL-TOKEN',
address: 'BrEahxkTrCKfjVy36pLD2gvVoMCUMEb1PinrAFtvJqPX',
decimals: 9,
networkId: NETWORK_IDS.SOLANA_DEVNET,
chainType: ChainType.SOLANA,
},

// SOLANA testnet
{
name: 'Solana native token',
symbol: 'SOL',
address: SOLANA_SYSTEM_PROGRAM,
decimals: 9,
networkId: NETWORK_IDS.SOLANA_TESTNET,
chainType: ChainType.SOLANA,
coingeckoId: COINGECKO_TOKEN_IDS.SOLANA,
},
Expand Down
8 changes: 8 additions & 0 deletions src/adapters/price/CoingeckoPriceAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@ const coingeckoCacheExpirationInSeconds =

export const COINGECKO_TOKEN_IDS = {
SOLANA: 'solana',
MSOL: 'msol',
USDC: 'usd-coin',
USDT: 'tether',
RAY: 'raydium',
BSOL: 'blazestake-staked-sol',
AUDIO: 'audius-wormhole',
MANGO: 'mango-markets',
C98: 'coin98',
};

export class CoingeckoPriceAdapter implements PriceAdapterInterface {
Expand Down
48 changes: 27 additions & 21 deletions src/adapters/price/MonoswapPriceAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,36 @@ import {
} from './PriceAdapterInterface';
import { CHAIN_ID } from '@giveth/monoswap/dist/src/sdk/sdkFactory';
import { getMonoSwapTokenPrices } from '../../services/donationService';
import { logger } from '../../utils/logger';

export class MonoswapPriceAdapter implements PriceAdapterInterface {
async getTokenPrice(params: GetTokenPriceParams): Promise<number> {
let baseTokens: string[];
switch (params.networkId) {
case CHAIN_ID.XDAI:
baseTokens = ['WXDAI', 'WETH'];
break;
case CHAIN_ID.POLYGON:
baseTokens = ['USDC', 'MATIC'];
break;
case CHAIN_ID.CELO:
case CHAIN_ID.ALFAJORES:
baseTokens = ['cUSD', 'CELO'];
break;
default:
baseTokens = ['USDT', 'ETH'];
break;
try {
let baseTokens: string[];
switch (params.networkId) {
case CHAIN_ID.XDAI:
baseTokens = ['WXDAI', 'WETH'];
break;
case CHAIN_ID.POLYGON:
baseTokens = ['USDC', 'MATIC'];
break;
case CHAIN_ID.CELO:
case CHAIN_ID.ALFAJORES:
baseTokens = ['cUSD', 'CELO'];
break;
default:
baseTokens = ['USDT', 'ETH'];
break;
}
const tokenPrices = await getMonoSwapTokenPrices(
params.symbol,
baseTokens,
params.networkId,
);
return Number(tokenPrices[0]);
} catch (e) {
logger.error('Error in MonoswapPriceAdapter', e);
throw e;
}
const tokenPrices = await getMonoSwapTokenPrices(
params.symbol,
baseTokens,
params.networkId,
);
return Number(tokenPrices[0]);
}
}
6 changes: 5 additions & 1 deletion src/provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@ export const NETWORK_IDS = {
CELO_ALFAJORES: 44787,
ETC: 61,
MORDOR_ETC_TESTNET: 63,
SOLANA: 0,

// https://docs.particle.network/developers/other-services/node-service/solana-api
SOLANA_MAINNET: 101,
SOLANA_TESTNET: 102,
SOLANA_DEVNET: 103,
};

export const NETWORKS_IDS_TO_NAME = {
Expand Down
Loading

0 comments on commit 4cfa455

Please sign in to comment.