update ido-pool & anchor versions and implement account loading

This commit is contained in:
Maximilian Schneider 2021-07-02 01:18:25 +02:00
parent 1dacb41361
commit 1d58b37d24
9 changed files with 163 additions and 97 deletions

View File

@ -20,6 +20,7 @@ export interface EndpointInfo {
url: string
websocket: string
programId: string
poolKey: string
}
export interface WalletContextValues {

View File

@ -103,6 +103,7 @@ const ContributionModal = () => {
useEffect(() => {
if (submitting) {
// TODO: add submission here
const submitTimer = setTimeout(() => {
setSubmitted(true)
setSubmitting(false)

View File

@ -102,9 +102,12 @@ export default function useWallet() {
'...' +
wallet.publicKey.toString().substr(-5),
})
//await actions.fetchWalletTokenAccounts()
//await actions.fetchWalletMints()
await actions.fetchPool()
await actions.fetchVault()
await Promise.all([
actions.fetchWalletTokenAccounts(),
actions.fetchVaultMint(),
])
})
wallet.on('disconnect', () => {
setWalletStore((state) => {
@ -128,8 +131,7 @@ export default function useWallet() {
}, [wallet, setWalletStore])
useInterval(async () => {
//await actions.fetchWalletTokenAccounts()
//await actions.fetchWalletMints()
await actions.fetchVault()
}, 20 * SECONDS)
return { connected, wallet }

View File

@ -54,6 +54,11 @@
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
}
],
"args": [
@ -341,52 +346,57 @@
],
"errors": [
{
"code": 100,
"name": "InitTime",
"code": 300,
"name": "IdoFuture",
"msg": "IDO must start in the future"
},
{
"code": 301,
"name": "SeqTimes",
"msg": "IDO times are non-sequential"
},
{
"code": 101,
"code": 302,
"name": "StartIdoTime",
"msg": "IDO has not started"
},
{
"code": 102,
"code": 303,
"name": "EndDepositsTime",
"msg": "Deposits period has ended"
},
{
"code": 103,
"code": 304,
"name": "EndIdoTime",
"msg": "IDO has ended"
},
{
"code": 104,
"code": 305,
"name": "IdoNotOver",
"msg": "IDO has not finished yet"
},
{
"code": 105,
"code": 306,
"name": "LowUsdc",
"msg": "Insufficient USDC"
},
{
"code": 106,
"code": 307,
"name": "LowRedeemable",
"msg": "Insufficient redeemable tokens"
},
{
"code": 107,
"code": 308,
"name": "UsdcNotEqRedeem",
"msg": "USDC total and redeemable total don't match"
},
{
"code": 108,
"code": 309,
"name": "InvalidNonce",
"msg": "Given nonce is invalid"
}
],
"metadata": {
"address": "4vZP5tE6sjKrSSuFwSxvmx76kc99BCVUeDo1dYT5tXAF"
"address": "5JTPKQJPkvrMzfDyEHX6EiaEYbR5QxXDkNQ66BoadgUn"
}
}
}

View File

@ -25,7 +25,7 @@
"@emotion/styled": "^11.3.0",
"@headlessui/react": "^1.0.0",
"@heroicons/react": "^1.0.1",
"@project-serum/anchor": "^0.4.5",
"@project-serum/anchor": "^0.10.0",
"@project-serum/sol-wallet-adapter": "^0.2.0",
"@solana/spl-token": "^0.1.3",
"@solana/web3.js": "^1.5.0",

View File

@ -14,6 +14,7 @@ import {
ProgramAccount,
TokenAccount,
MintAccount,
getTokenAccount,
} from '../utils/tokens'
export const ENDPOINTS: EndpointInfo[] = [
@ -22,20 +23,43 @@ export const ENDPOINTS: EndpointInfo[] = [
url: 'https://api.mainnet-beta.solana.com/',
websocket: 'https://api.mainnet-beta.solana.com/',
programId: '',
poolKey: '',
},
{
name: 'devnet',
url: 'https://devnet.solana.com',
websocket: 'https://devnet.solana.com',
programId: 'E5s3D6B3PJinuB9kb3dicxfi3qUNLUGX6hoPawhbqagt',
poolKey: '',
},
{
name: 'localnet',
url: 'http://localhost:8899',
websocket: 'http://localhost:8899',
programId: 'FF8zcQ1aEmyXeBt99hohoyYprgpEVmWsRK44qta3emno',
poolKey: '8gswb9g1JdYEVj662KXr9p6p9SMgR77NryyqvWn9GPXJ',
},
]
const CLUSTER = 'devnet'
const CLUSTER = 'localnet'
const ENDPOINT = ENDPOINTS.find((e) => e.name === CLUSTER)
const DEFAULT_CONNECTION = new Connection(ENDPOINT.url, 'recent')
const WEBSOCKET_CONNECTION = new Connection(ENDPOINT.websocket, 'recent')
const PROGRAM_ID = new PublicKey(ENDPOINT.programId)
const POOL_PK = new PublicKey(ENDPOINT.poolKey)
interface PoolAccount {
distributionAuthority: PublicKey
endDepositsTs: anchor.BN
endIdoTs: anchor.BN
nonce: number
numIdoTokens: anchor.BN
poolUsdc: PublicKey
poolWatermelon: PublicKey
redeemableMint: PublicKey
startIdoTs: anchor.BN
watermelonMint: PublicKey
}
interface WalletStore extends State {
connected: boolean
@ -50,7 +74,8 @@ interface WalletStore extends State {
providerUrl: string
tokenAccounts: ProgramAccount<TokenAccount>[]
mints: { [pubkey: string]: MintAccount }
pool: anchor.web3.Account | undefined
pool: PoolAccount | undefined
vault: TokenAccount | undefined
set: (x: any) => void
actions: any
}
@ -68,8 +93,35 @@ const useWalletStore = create<WalletStore>((set, get) => ({
providerUrl: null,
tokenAccounts: [],
mints: {},
pool: null,
pool: undefined,
vault: undefined,
actions: {
async fetchPool() {
const connection = get().connection.current
const connected = get().connected
const wallet = get().current
const programId = get().connection.programId
console.log('fetchPool', connected, poolIdl)
if (connection && connected) {
const provider = new anchor.Provider(
connection,
wallet,
anchor.Provider.defaultOptions()
)
const program = new anchor.Program(poolIdl, programId, provider)
console.log(program)
const pool = (await program.account.poolAccount.fetch(
POOL_PK
)) as PoolAccount
console.log(pool)
set((state) => {
state.pool = pool
})
}
},
async fetchWalletTokenAccounts() {
const connection = get().connection.current
const connected = get().connected
@ -92,48 +144,34 @@ const useWalletStore = create<WalletStore>((set, get) => ({
})
}
},
async fetchWalletMints() {
async fetchVault() {
const connection = get().connection.current
const connected = get().connected
const tokenAccounts = get().tokenAccounts
const pool = get().pool
const set = get().set
if (connected) {
const fetchMints = tokenAccounts.map((a) =>
getMint(connection, a.account.mint)
)
const mintResults = await Promise.all(fetchMints)
if (!pool) return
const newMints: { [pubkey: string]: MintAccount } = {}
mintResults.forEach(
(m) => (newMints[m.publicKey.toBase58()] = m.account)
)
const { account: vault } = await getTokenAccount(
connection,
pool.poolUsdc
)
console.log('fetchVault', vault)
set((state) => {
state.mints = newMints
})
} else {
set((state) => {
state.mints = {}
})
}
set((state) => {
state.vault = vault
})
},
async fetchPool() {
async fetchVaultMint() {
const connection = get().connection.current
const connected = get().connected
const wallet = get().current
const programId = get().connection.programId
const vault = get().vault
const set = get().set
console.log('fetchPool', connected, poolIdl)
if (connection && connected) {
const provider = new anchor.Provider(
connection,
wallet,
anchor.Provider.defaultOptions()
)
const program = new anchor.Program(poolIdl, programId, provider)
console.log(program)
}
const { account: mint } = await getMint(connection, vault.mint)
console.log('fetchVaultMint', mint)
set((state) => {
state.mints[vault.mint.toBase58()] = mint
})
},
},
set: (fn) => set(produce(fn)),

View File

@ -9,14 +9,16 @@ function fixedPointToNumber(value: BN, decimals: number) {
}
export function getUsdcBalance() {
const { tokenAccounts, mints } = useWalletStore((state) => state)
const { tokenAccounts, mints, vault } = useWalletStore((state) => state)
if (!vault) return 0
const calculateBalance = (a) => {
const mint = mints[a.account?.mint?.toBase58()]
return mint ? fixedPointToNumber(a.account.amount, mint.decimals) : 0
}
const usdcAddress = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
const usdcAddress = vault.mint.toBase58()
const usdcAccount = tokenAccounts.filter(
(a) => a.account.mint.toBase58() === usdcAddress

View File

@ -42,6 +42,19 @@ export async function getMint(
}
}
export async function getTokenAccount(
connection: Connection,
publicKey: PublicKey
): Promise<ProgramAccount<TokenAccount>> {
const result = await connection.getAccountInfo(publicKey)
const data = Buffer.from(result.data)
const account = parseTokenAccountData(publicKey, data)
return {
publicKey,
account,
}
}
// copied from @solana/spl-token
const TOKEN_PROGRAM_ID = new PublicKey(

View File

@ -704,17 +704,13 @@
version "0.14.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/context-base/-/context-base-0.14.0.tgz#c67fc20a4d891447ca1a855d7d70fa79a3533001"
"@project-serum/anchor@^0.4.5":
version "0.4.5"
resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.4.5.tgz#6c52b5722a3133d5f1df793bfbc1af5c07b0316d"
integrity sha512-LxcV8yZae/sOBPZULDlVGqsIyFkjhmJKi2kx1id9EybECX5QqYQTMS69ozdH2e+5VEDjw0dCfRqBCMJ97ylmmQ==
"@project-serum/anchor@^0.10.0":
version "0.10.0"
resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.10.0.tgz#e08396b7bb3cc94b279d45ac38595118dffdd617"
integrity sha512-FWw3bQy1otINPq40uOTX0h8eE3drnespaq9Xkwpy3UXj6i46xuLjsWC+x9hp76EN4pC174POeNPvB0aivatswg==
dependencies:
"@project-serum/borsh" "^0.1.1"
"@solana/web3.js" "^1.2.0"
"@types/bn.js" "^4.11.6"
"@types/bs58" "^4.0.1"
"@types/crypto-hash" "^1.1.2"
"@types/pako" "^1.0.1"
"@project-serum/borsh" "^0.2.2"
"@solana/web3.js" "^1.17.0"
base64-js "^1.5.1"
bn.js "^5.1.2"
bs58 "^4.0.1"
@ -726,11 +722,12 @@
js-sha256 "^0.9.0"
pako "^2.0.3"
snake-case "^3.0.4"
toml "^3.0.0"
"@project-serum/borsh@^0.1.1":
version "0.1.1"
resolved "https://registry.yarnpkg.com/@project-serum/borsh/-/borsh-0.1.1.tgz#a810aad74e4b458fbd1ab63188f175bee765a8af"
integrity sha512-bzCea8KTyc7CNkcMn0V2HW/FdU9pnJUcVRrwLqvJkYeo+mhkXE4AxxWErN3q+UxhEm8ypGIX1OYTKJaTJvj5cQ==
"@project-serum/borsh@^0.2.2":
version "0.2.2"
resolved "https://registry.yarnpkg.com/@project-serum/borsh/-/borsh-0.2.2.tgz#63e558f2d6eb6ab79086bf499dea94da3182498f"
integrity sha512-Ms+aWmGVW6bWd3b0+MWwoaYig2QD0F90h0uhr7AzY3dpCb5e2S6RsRW02vFTfa085pY2VLB7nTZNbFECQ1liTg==
dependencies:
bn.js "^5.1.2"
buffer-layout "^1.2.0"
@ -765,13 +762,14 @@
buffer-layout "^1.2.0"
dotenv "8.2.0"
"@solana/web3.js@^1.2.0":
version "1.9.0"
resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.9.0.tgz#1676215a2e89e2cb6e4694c5970c3c7c8ac12a19"
integrity sha512-wal/itYezfH7ePMoBL6mtSa+J2jTkd7bOwlaen2jeJA+aHmQaLfP+XpI27Y+hPmSRChmHggVgl+/ayX4LX8sZg==
"@solana/web3.js@^1.17.0":
version "1.20.0"
resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.20.0.tgz#9a1855a239c96c5b946bdbe4cc5e3768ee3b2a77"
integrity sha512-s/hmbeC7h0QeMKDHl5HTJbY4NSrT3IK1oGerNwdmFfnbs9ygtBbXo1MXaeYVDcNazsthKgiYE+unNd+cpVH8HA==
dependencies:
"@babel/runtime" "^7.12.5"
bn.js "^5.0.0"
borsh "^0.4.0"
bs58 "^4.0.1"
buffer "6.0.1"
buffer-layout "^1.2.0"
@ -855,33 +853,19 @@
dependencies:
"@babel/types" "^7.3.0"
"@types/bn.js@^4.11.6":
"@types/bn.js@^4.11.5":
version "4.11.6"
resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c"
integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==
dependencies:
"@types/node" "*"
"@types/bs58@^4.0.1":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@types/bs58/-/bs58-4.0.1.tgz#3d51222aab067786d3bc3740a84a7f5a0effaa37"
integrity sha512-yfAgiWgVLjFCmRv8zAcOIHywYATEwiTVccTLnRp6UxTNavT55M9d/uhK3T03St/+8/z/wW+CRjGKUNmEqoHHCA==
dependencies:
base-x "^3.0.6"
"@types/connect@^3.4.33":
version "3.4.34"
resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901"
dependencies:
"@types/node" "*"
"@types/crypto-hash@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@types/crypto-hash/-/crypto-hash-1.1.2.tgz#5a993deb0e6ba7c42f86eaa65d9bf563378f4569"
integrity sha512-sOmi+4Go2XKodLV4+lfP+5QMQ+6ZYqRJhK8D/n6xsxIUvlerEulmU9S4Lo02pXCH3qPBeJXEy+g8ZERktDJLSg==
dependencies:
crypto-hash "*"
"@types/express-serve-static-core@^4.17.9":
version "4.17.19"
resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz#00acfc1632e729acac4f1530e9e16f6dd1508a1d"
@ -939,11 +923,6 @@
version "2.4.0"
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
"@types/pako@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@types/pako/-/pako-1.0.1.tgz#33b237f3c9aff44d0f82fe63acffa4a365ef4a61"
integrity sha512-GdZbRSJ3Cv5fiwT6I0SQ3ckeN2PWNqxd26W9Z2fCK1tGrrasGy4puvNFtnddqH9UJFMQYXxEuuB7B8UK+LLwSg==
"@types/parse-json@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
@ -1399,7 +1378,7 @@ balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
base-x@^3.0.2, base-x@^3.0.6:
base-x@^3.0.2:
version "3.0.8"
resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d"
dependencies:
@ -1443,6 +1422,16 @@ bn.js@^5.0.0, bn.js@^5.1.0, bn.js@^5.1.1, bn.js@^5.1.2:
version "5.2.0"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
borsh@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.4.0.tgz#9dd6defe741627f1315eac2a73df61421f6ddb9f"
integrity sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g==
dependencies:
"@types/bn.js" "^4.11.5"
bn.js "^5.0.0"
bs58 "^4.0.0"
text-encoding-utf-8 "^1.0.2"
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@ -1554,7 +1543,7 @@ browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.3, browserslist@^
escalade "^3.1.1"
node-releases "^1.1.71"
bs58@^4.0.1:
bs58@^4.0.0, bs58@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
dependencies:
@ -1976,7 +1965,7 @@ crypto-browserify@3.12.0, crypto-browserify@^3.11.0:
randombytes "^2.0.0"
randomfill "^1.0.3"
crypto-hash@*, crypto-hash@^1.2.2, crypto-hash@^1.3.0:
crypto-hash@^1.2.2, crypto-hash@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247"
@ -6112,6 +6101,11 @@ test-exclude@^6.0.0:
glob "^7.1.4"
minimatch "^3.0.4"
text-encoding-utf-8@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13"
integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
@ -6178,6 +6172,11 @@ toidentifier@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
toml@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee"
integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==
tough-cookie@^2.3.3, tough-cookie@~2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"