Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat: Web Provider RPC 🗣️ #111

Closed
wants to merge 211 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
211 commits
Select commit Hold shift + click to select a range
3ca6f6e
chore(web provider): `mina_accounts` example
teddyjfpender Dec 22, 2023
4627dd1
chore(web-provider): mock chrome
teddyjfpender Dec 22, 2023
80f39eb
feat(provider): `mina_sign` rpc method
teddyjfpender Dec 23, 2023
4b33b32
feat(provider): `sign` rpcs, `mina_getBalance`
teddyjfpender Dec 23, 2023
eb28998
Merge branch 'main' into feat/web-provider
teddyjfpender Dec 23, 2023
1021f98
feat(provider): error handling & clean up 🚀
teddyjfpender Dec 23, 2023
3f49516
feat(provider): chainId 🪪
teddyjfpender Dec 23, 2023
f27f3f6
chore(provider): add POC `chainChanged`
teddyjfpender Dec 23, 2023
38dca0f
chore!(provider): refactor for multi-chain ⛓️
teddyjfpender Dec 24, 2023
b9bf2d2
Merge branch 'main' into feat/web-provider
teddyjfpender Dec 26, 2023
2cddc6e
feat(wen-provider): POC universal provider 🪐✨
teddyjfpender Dec 28, 2023
7711c18
chore(web-provider): update readme
teddyjfpender Dec 28, 2023
9b1c7f3
fix(mina-graphql): add healthCheck
teddyjfpender Dec 28, 2023
22512d9
feat(workflow): local-network poc
teddyjfpender Dec 26, 2023
e2b553e
feat(account provider): local-network test & yml
teddyjfpender Dec 26, 2023
dc9283d
fix(workflow): change NODE_URL
teddyjfpender Dec 26, 2023
72b362e
chore(workflow): add cli graphql request
teddyjfpender Dec 26, 2023
9518628
fix(account provider): health check query
teddyjfpender Dec 26, 2023
1ff24b3
fix(account provider): health check logic adjust
teddyjfpender Dec 27, 2023
d29c450
fix(account provider): health check logic change
teddyjfpender Dec 27, 2023
0e12e64
fix(account provider): shape of health check type
teddyjfpender Dec 27, 2023
a086405
fix(account provider): parse response
teddyjfpender Dec 27, 2023
ad8ad00
chore(account provider):add logs
teddyjfpender Dec 27, 2023
fb9152b
feat(account provider): handle proxy and not
teddyjfpender Dec 27, 2023
887e23f
chore(account provider): add `Accept` header
teddyjfpender Dec 27, 2023
953d02f
fix(query & workflow): updates
teddyjfpender Dec 27, 2023
4f61816
chore(workflow): remove test call in workflow
teddyjfpender Dec 27, 2023
bca6717
chore(account provider): add graphql error policy
teddyjfpender Dec 27, 2023
2d975db
fix(account provider): ignore error policy
teddyjfpender Dec 27, 2023
f774d50
fix(account provider): `rawRequest<AccountData>`
teddyjfpender Dec 27, 2023
42126a7
fix(account query): remove deprecated field
teddyjfpender Dec 27, 2023
f693da1
fix(node provider test): change to health check
teddyjfpender Dec 27, 2023
5e9ceb8
chore(query): rollback change
teddyjfpender Dec 27, 2023
e63b702
chore(package-ci): change node url
teddyjfpender Dec 27, 2023
a583de2
fix: add `/graphql`
teddyjfpender Dec 27, 2023
381e6d5
fix: NODE_URL in CI
teddyjfpender Dec 27, 2023
6236936
fix(mnemonic): fix click behavior
mrcnk Dec 27, 2023
9c8191e
fix(mnemonic): adjust select handler
mrcnk Dec 27, 2023
5f81dfa
feat(wallet): add dead simple analytics
mrcnk Dec 27, 2023
afb4b95
fix(wallet): make sure restart wallet deletes everything possible
mrcnk Dec 27, 2023
f18d39b
fix(wallet): fix restart flow
mrcnk Dec 28, 2023
777c92f
fix(graphql provider): add bigint serialization
teddyjfpender Dec 28, 2023
c58ec01
feat(graphql provider): add custom fetch
teddyjfpender Dec 28, 2023
e7b3855
chore(lint)
teddyjfpender Dec 28, 2023
7831d74
fix(wallet): skip failing local network test for now
mrcnk Dec 28, 2023
504130b
chore(wallet): adjust extension ci run rules
mrcnk Dec 28, 2023
c11231b
chore(wallet): add wallet restart e2e spec
mrcnk Dec 28, 2023
bc98bae
chore(wallet): remove netlifty from readme
mrcnk Dec 28, 2023
a46330d
chore(wallet): update packages in readme
mrcnk Dec 28, 2023
5bc7ac9
chore(wallet): remove expect from wallet restart spec
mrcnk Dec 28, 2023
5d47604
fix(temp)
teddyjfpender Dec 28, 2023
9d68000
fix(remove temp)
teddyjfpender Dec 28, 2023
03d254b
fix(node provider test): change to health check
teddyjfpender Dec 27, 2023
82049e2
chore(wallet): add turbowatch and configure for extension
mrcnk Dec 28, 2023
7f0dd2c
chore(mina-graphql): use GraphQLClient
teddyjfpender Dec 29, 2023
ee1288b
chore(mina-graphql): remove `$@` from `scripts`
teddyjfpender Dec 29, 2023
43fd5a9
fix(multi-chain-core): fix failing test
teddyjfpender Dec 29, 2023
6c26c85
chore(mina-graphql): configurable network URLs
teddyjfpender Dec 29, 2023
1e28f08
fix(workflow): port `8282`
teddyjfpender Dec 29, 2023
c704f46
fix(workflow): log out fetched env variables
teddyjfpender Dec 29, 2023
1eec261
chore: add logs
teddyjfpender Dec 29, 2023
9c02f87
fix(workflow): improve step to get env vars
teddyjfpender Dec 29, 2023
f4a1743
chore: more ci debugging
teddyjfpender Dec 29, 2023
bb3f10f
chore: even more debugging
teddyjfpender Dec 29, 2023
133f52e
chore(workflow): only run account provider
teddyjfpender Dec 29, 2023
fe708ee
chore(mina-graphql): replace json-bigint
teddyjfpender Dec 29, 2023
d085126
fix(lock file): update
teddyjfpender Dec 29, 2023
1a6a0e6
fix(mina-graphql): revert to JSONbig
teddyjfpender Dec 30, 2023
af6ae7a
chore(mina-graphql): remove `superjson` dep
teddyjfpender Dec 30, 2023
9c3730a
feat(mina-graphql): improve 500 error handling
teddyjfpender Jan 2, 2024
fc700a2
chore(mina-graphql): remove unused test
teddyjfpender Jan 4, 2024
90c87a2
chore(app): bump node and resolve schrodinger error build
mrcnk Jan 3, 2024
228b6de
chore(app): rebuild pnpm lock
mrcnk Jan 3, 2024
9e616f3
chore(web-provider): mock chrome
teddyjfpender Dec 22, 2023
aacd562
feat(provider): `mina_sign` rpc method
teddyjfpender Dec 23, 2023
8b50a47
feat(provider): chainId 🪪
teddyjfpender Dec 23, 2023
e4c103f
fix(mina-graphql): add healthCheck
teddyjfpender Dec 28, 2023
c0fc1c5
fix:merge conflicts
teddyjfpender Jan 5, 2024
baa5eee
fix: merging conflict error fix
teddyjfpender Jan 5, 2024
99b70b2
feat(web-provider): add mina network switching & chain ids
teddyjfpender Jan 5, 2024
6f6bbf6
feat(web-provider); add `accountsChanged` draft event emitter method
teddyjfpender Jan 5, 2024
5b44f13
feat(web-provider): `Unauthorized: 4100` Error
teddyjfpender Jan 6, 2024
daf824f
chore(web-provider): update readme
teddyjfpender Jan 6, 2024
8dcf090
feat(workflow): local-network poc
teddyjfpender Dec 26, 2023
b150688
feat(account provider): local-network test & yml
teddyjfpender Dec 26, 2023
8e9b752
fix(workflow): change NODE_URL
teddyjfpender Dec 26, 2023
e68e966
chore(workflow): add cli graphql request
teddyjfpender Dec 26, 2023
08fdb9a
fix(account provider): health check query
teddyjfpender Dec 26, 2023
00a6734
fix(account provider): health check logic adjust
teddyjfpender Dec 27, 2023
a53bf2c
fix(account provider): health check logic change
teddyjfpender Dec 27, 2023
e5c201c
fix(account provider): shape of health check type
teddyjfpender Dec 27, 2023
dffadbe
fix(account provider): parse response
teddyjfpender Dec 27, 2023
7356ea3
chore(account provider):add logs
teddyjfpender Dec 27, 2023
5e22fa8
feat(account provider): handle proxy and not
teddyjfpender Dec 27, 2023
c815f54
chore(account provider): add `Accept` header
teddyjfpender Dec 27, 2023
849ccce
fix(query & workflow): updates
teddyjfpender Dec 27, 2023
0f603c0
chore(workflow): remove test call in workflow
teddyjfpender Dec 27, 2023
81a3eba
chore(account provider): add graphql error policy
teddyjfpender Dec 27, 2023
3e34579
fix(account provider): ignore error policy
teddyjfpender Dec 27, 2023
01aa930
fix(account provider): `rawRequest<AccountData>`
teddyjfpender Dec 27, 2023
bb831f1
fix(account query): remove deprecated field
teddyjfpender Dec 27, 2023
1c4ff86
fix(node provider test): change to health check
teddyjfpender Dec 27, 2023
e40e2db
chore(query): rollback change
teddyjfpender Dec 27, 2023
9e3d1e8
chore(package-ci): change node url
teddyjfpender Dec 27, 2023
8bb5994
fix: add `/graphql`
teddyjfpender Dec 27, 2023
436f889
fix: NODE_URL in CI
teddyjfpender Dec 27, 2023
8cae1a5
fix(mnemonic): fix click behavior
mrcnk Dec 27, 2023
782a099
fix(mnemonic): adjust select handler
mrcnk Dec 27, 2023
354bc56
feat(wallet): add dead simple analytics
mrcnk Dec 27, 2023
d896c64
fix(wallet): make sure restart wallet deletes everything possible
mrcnk Dec 27, 2023
abb4455
fix(wallet): fix restart flow
mrcnk Dec 28, 2023
a78cc13
fix(graphql provider): add bigint serialization
teddyjfpender Dec 28, 2023
dd39f05
feat(graphql provider): add custom fetch
teddyjfpender Dec 28, 2023
0e40955
chore(lint)
teddyjfpender Dec 28, 2023
dab13c3
fix(wallet): skip failing local network test for now
mrcnk Dec 28, 2023
2952ae0
chore(wallet): add wallet restart e2e spec
mrcnk Dec 28, 2023
d3a63f9
chore(wallet): remove expect from wallet restart spec
mrcnk Dec 28, 2023
2d08719
chore(wallet): add turbowatch and configure for extension
mrcnk Dec 28, 2023
f19b506
chore(mina-graphql): use GraphQLClient
teddyjfpender Dec 29, 2023
97af12e
chore(mina-graphql): remove `$@` from `scripts`
teddyjfpender Dec 29, 2023
43b742e
chore(mina-graphql): configurable network URLs
teddyjfpender Dec 29, 2023
8b81161
fix(workflow): port `8282`
teddyjfpender Dec 29, 2023
ff76e44
fix(workflow): log out fetched env variables
teddyjfpender Dec 29, 2023
644d948
chore: add logs
teddyjfpender Dec 29, 2023
ca1d683
fix(workflow): improve step to get env vars
teddyjfpender Dec 29, 2023
492f19a
chore: more ci debugging
teddyjfpender Dec 29, 2023
0acde1e
chore: even more debugging
teddyjfpender Dec 29, 2023
9316f5d
chore(workflow): only run account provider
teddyjfpender Dec 29, 2023
e1457b4
chore(mina-graphql): replace json-bigint
teddyjfpender Dec 29, 2023
66f29ea
fix(lock file): update
teddyjfpender Dec 29, 2023
ed1eac2
fix(mina-graphql): revert to JSONbig
teddyjfpender Dec 30, 2023
6f0e09a
chore(mina-graphql): remove `superjson` dep
teddyjfpender Dec 30, 2023
aef528d
feat(key-management): add eth derivation & signing
teddyjfpender Dec 31, 2023
e4adfce
feat(mina-graphql): improve 500 error handling
teddyjfpender Jan 2, 2024
f044d0c
chore(mina-graphql): remove unused test
teddyjfpender Jan 4, 2024
cc49332
chore(app): rebuild pnpm lock
mrcnk Jan 3, 2024
ca1de48
fix(lock file): update
teddyjfpender Jan 6, 2024
5bbc370
feat(key-management): add `createNullifier` to signing operations
teddyjfpender Jan 6, 2024
e5a8fbc
chore(key-management): remove old tests
teddyjfpender Jan 6, 2024
e513c27
chore(app): rebuild pnpm lock
mrcnk Jan 3, 2024
555aa9f
chore(app): rebuild pnpm lock
mrcnk Jan 3, 2024
2884e5e
fix(pnpm-lock): rebuild
teddyjfpender Jan 6, 2024
9849d62
feat(workflow): local-network poc
teddyjfpender Dec 26, 2023
44dc85f
feat(account provider): local-network test & yml
teddyjfpender Dec 26, 2023
4fc97a9
fix(workflow): change NODE_URL
teddyjfpender Dec 26, 2023
6709038
chore(workflow): add cli graphql request
teddyjfpender Dec 26, 2023
1eae067
fix(account provider): health check query
teddyjfpender Dec 26, 2023
41a81ae
fix(account provider): health check logic adjust
teddyjfpender Dec 27, 2023
4106ff8
fix(account provider): health check logic change
teddyjfpender Dec 27, 2023
9c5741f
fix(account provider): shape of health check type
teddyjfpender Dec 27, 2023
ea950c4
fix(account provider): parse response
teddyjfpender Dec 27, 2023
2d2cd32
chore(account provider):add logs
teddyjfpender Dec 27, 2023
194f6bb
feat(account provider): handle proxy and not
teddyjfpender Dec 27, 2023
e83c879
chore(account provider): add `Accept` header
teddyjfpender Dec 27, 2023
53a7c67
fix(query & workflow): updates
teddyjfpender Dec 27, 2023
a3d90f8
chore(workflow): remove test call in workflow
teddyjfpender Dec 27, 2023
a435d76
chore(account provider): add graphql error policy
teddyjfpender Dec 27, 2023
839ac08
fix(account provider): ignore error policy
teddyjfpender Dec 27, 2023
e3f157c
fix(account provider): `rawRequest<AccountData>`
teddyjfpender Dec 27, 2023
54b6655
fix(account query): remove deprecated field
teddyjfpender Dec 27, 2023
2db2868
fix(node provider test): change to health check
teddyjfpender Dec 27, 2023
bf3d6fc
chore(query): rollback change
teddyjfpender Dec 27, 2023
deacf7f
chore(package-ci): change node url
teddyjfpender Dec 27, 2023
09db075
fix: add `/graphql`
teddyjfpender Dec 27, 2023
09a3946
fix: NODE_URL in CI
teddyjfpender Dec 27, 2023
f833f9d
fix(mnemonic): fix click behavior
mrcnk Dec 27, 2023
7afad00
fix(mnemonic): adjust select handler
mrcnk Dec 27, 2023
cca7680
feat(wallet): add dead simple analytics
mrcnk Dec 27, 2023
16f3da1
fix(wallet): make sure restart wallet deletes everything possible
mrcnk Dec 27, 2023
ce83a51
fix(wallet): fix restart flow
mrcnk Dec 28, 2023
079e738
fix(graphql provider): add bigint serialization
teddyjfpender Dec 28, 2023
fe049c7
feat(graphql provider): add custom fetch
teddyjfpender Dec 28, 2023
cdab7c7
chore(lint)
teddyjfpender Dec 28, 2023
421eb31
fix(wallet): skip failing local network test for now
mrcnk Dec 28, 2023
3aaa409
chore(wallet): add wallet restart e2e spec
mrcnk Dec 28, 2023
7880eef
chore(wallet): remove expect from wallet restart spec
mrcnk Dec 28, 2023
43cd4da
chore(wallet): add turbowatch and configure for extension
mrcnk Dec 28, 2023
e329f3e
chore(mina-graphql): use GraphQLClient
teddyjfpender Dec 29, 2023
dbd78d5
chore(mina-graphql): remove `$@` from `scripts`
teddyjfpender Dec 29, 2023
b1ceb2f
chore(mina-graphql): configurable network URLs
teddyjfpender Dec 29, 2023
e52ffe0
fix(workflow): port `8282`
teddyjfpender Dec 29, 2023
e5a57eb
fix(workflow): log out fetched env variables
teddyjfpender Dec 29, 2023
e7209d5
chore: add logs
teddyjfpender Dec 29, 2023
1289289
fix(workflow): improve step to get env vars
teddyjfpender Dec 29, 2023
ef249ee
chore: more ci debugging
teddyjfpender Dec 29, 2023
e5c652e
chore: even more debugging
teddyjfpender Dec 29, 2023
00f8836
chore(workflow): only run account provider
teddyjfpender Dec 29, 2023
bf96665
chore(mina-graphql): replace json-bigint
teddyjfpender Dec 29, 2023
5854178
fix(lock file): update
teddyjfpender Dec 29, 2023
14af5d3
fix(mina-graphql): revert to JSONbig
teddyjfpender Dec 30, 2023
02b6ebe
chore(mina-graphql): remove `superjson` dep
teddyjfpender Dec 30, 2023
a8efa1c
feat(key-management): add eth derivation & signing
teddyjfpender Dec 31, 2023
2c84155
feat(mina-graphql): improve 500 error handling
teddyjfpender Jan 2, 2024
5aa3d63
chore(mina-graphql): remove unused test
teddyjfpender Jan 4, 2024
d577ffc
chore(app): rebuild pnpm lock
mrcnk Jan 3, 2024
a5e266b
fix(lock file): update
teddyjfpender Jan 6, 2024
a455cff
feat(key-management): add `createNullifier` to signing operations
teddyjfpender Jan 6, 2024
fbb025d
chore(app): rebuild pnpm lock
mrcnk Jan 3, 2024
45222fb
feat(mina-graphql): improve 500 error handling
teddyjfpender Jan 2, 2024
072452c
chore(mina-graphql): remove unused test
teddyjfpender Jan 4, 2024
842187c
chore(app): rebuild pnpm lock
mrcnk Jan 3, 2024
baa9051
fix(pnpm-lock): rebuild
teddyjfpender Jan 6, 2024
eff0959
fix: lock file & rebase artifacts
teddyjfpender Jan 7, 2024
5aa0a80
chore(mina-core): export nullifier
teddyjfpender Jan 7, 2024
99bf5a2
Merge branch 'main' into feat/web-provider
teddyjfpender Jan 7, 2024
b1f5654
fix: build
teddyjfpender Jan 7, 2024
d38e2a4
chore(web-provider): clean up package
teddyjfpender Jan 7, 2024
c8a28fc
fix(web-provider): test imports
teddyjfpender Jan 7, 2024
b14b0b5
chore: change test paths
teddyjfpender Jan 7, 2024
7a6b07e
chore: debug tests in CI
teddyjfpender Jan 7, 2024
9f29dc4
chore(web-provider): change vitest config
teddyjfpender Jan 7, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/key-management/src/chains/Mina/signingOperations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@ export async function MinaSigningOperations<T extends MinaSignablePayload>(
// in the object deanonimize the user. We should only return what the zkApp needs
return minaClient.createNullifier(payload.messageNullifier, privateKey)
} else {
throw new Error('Unsupported payload type.')
throw new Error(`Unsupported payload type of ${payload}.`)
}
} catch (err) {
const errorMessage = errors.getRealErrorMsg(err) || 'Signing action failed.'
throw new Error(errorMessage)
throw new Error(`Error during Mina signing operations: ${errorMessage}`)
}
}
1 change: 1 addition & 0 deletions packages/mina-core/src/Mina/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export * from './Block'
export * from './Fields'
export * from './Message'
export * from './Networks'
export * from './Nullifier'
export * from './Pagination'
export * from './Transaction'
export * from './ZkApp'
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './types'
16 changes: 16 additions & 0 deletions packages/mina-core/src/Providers/DaemonStatusProvider/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Provider } from '../..'

export interface DaemonStatus {
daemonStatus: {
chainId: string
}
}

export interface DaemonStatusProvider extends Provider {
/**
* Gets the daemon status.
*
* @returns {DaemonStatus} - An object with daemon status information
*/
getDaemonStatus: () => Promise<DaemonStatus>
}
2 changes: 2 additions & 0 deletions packages/mina-core/src/Providers/UnifiedProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
TransactionsByAddressesArgs,
TransactionsByIdsArgs
} from './ChainHistoryProvider'
import { DaemonStatus } from './DaemonStatusProvider'
import { TxStatus, TxStatusArgs } from './TxStatusProvider'
import { SubmitTxArgs, SubmitTxResult } from './TxSubmitProvider'

Expand All @@ -20,6 +21,7 @@ export interface UnifiedMinaProviderType {
getAccountInfo(args: AccountInfoArgs): Promise<AccountInfo | undefined>
getTransactionStatus(args: TxStatusArgs): Promise<TxStatus | undefined>
submitTransaction(args: SubmitTxArgs): Promise<SubmitTxResult | undefined>
getDaemonStatus(): Promise<DaemonStatus | undefined>

// Methods related to ProviderArchive
getTransactions(
Expand Down
1 change: 1 addition & 0 deletions packages/mina-core/src/Providers/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export * from './AccountInfoProvider'
export * from './ChainHistoryProvider'
export * from './DaemonStatusProvider'
export * from './Provider'
export * from './TxStatusProvider'
export * from './TxSubmitProvider'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import {
DaemonStatus,
DaemonStatusProvider,
HealthCheckResponse,
HealthCheckResponseData
} from '@palladxyz/mina-core'
import { gql, request } from 'graphql-request'

import { getDaemonStatus, healthCheckQuery } from './queries'

export class DaemonStatusGraphQLProvider implements DaemonStatusProvider {
private minaGql: string | null

constructor(minaGql: string) {
this.minaGql = minaGql
}

public async destroy(): Promise<void> {
console.log('Destroying DaemonStatusGraphQLProvider...')
this.minaGql = null
}

async changeNetwork(minaGql: string): Promise<void> {
this.minaGql = minaGql
}

async healthCheck(): Promise<HealthCheckResponse> {
console.log('Initiating health check...')
const query = gql`
${healthCheckQuery}
`
try {
console.log('Sending request for health check...')
const data = (await request(
this.minaGql as string,
query
)) as HealthCheckResponseData
console.log('Received response for health check:', data)

if (data && data.__schema && data.__schema.types.length > 0) {
return { ok: true }
} else {
throw new Error('Invalid schema response')
}
} catch (error: unknown) {
console.error('Error in healthCheck:', error)
let errorMessage = 'Unknown error'
if (error instanceof Error) {
errorMessage = error.message
}
return { ok: false, message: errorMessage }
}
}

async getDaemonStatus(): Promise<DaemonStatus> {
console.log('Initiating getDaemonStatus')
const query = gql`
${getDaemonStatus}
`
try {
console.log('Sending request for daemon status...')
const data = (await request(
this.minaGql as string,
query,
{}
)) as DaemonStatus
console.log('Received response for daemon status:', data)

if (!data || !data.daemonStatus || !data.daemonStatus.chainId) {
throw new Error('Invalid daemon status data response')
}
return data
} catch (error: unknown) {
// this can fail if the node is not available
// perform health check to see if the node is available
const healthCheckResponse = await this.healthCheck()
if (!healthCheckResponse.ok) {
throw new Error('Node is not available')
}
console.error('Error in getDaemonStatus:', error)
return {
daemonStatus: {
chainId: 'N/A'
}
}
}
}
}
1 change: 1 addition & 0 deletions packages/mina-graphql/src/Providers/DaemonStatus/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './DaemonStatusProvider'
17 changes: 17 additions & 0 deletions packages/mina-graphql/src/Providers/DaemonStatus/queries.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
export const healthCheckQuery = `
{
__schema {
types {
name
}
}
}
`

export const getDaemonStatus = `
query {
daemonStatus {
chainId
}
}
`
1 change: 1 addition & 0 deletions packages/mina-graphql/src/Providers/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export * from './AccountInfo'
export * from './ChainHistory'
export * from './DaemonStatus'
export * from './provider'
export * from './providerArchive'
export * from './TxStatus'
Expand Down
10 changes: 9 additions & 1 deletion packages/mina-graphql/src/Providers/provider.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import {
AccountInfo,
AccountInfoArgs,
DaemonStatus,
HealthCheckResponse,
SubmitTxArgs,
SubmitTxResult,
TxStatus,
TxStatusArgs
} from '@palladxyz/mina-core'
import { HealthCheckResponse } from '@palladxyz/mina-core'

import { AccountInfoGraphQLProvider } from './AccountInfo'
import { DaemonStatusGraphQLProvider } from './DaemonStatus'
import { TxStatusGraphQLProvider } from './TxStatus'
import { TxSubmitGraphQLProvider } from './TxSubmit'
import { ProviderNode } from './types'
Expand All @@ -17,12 +19,14 @@ export class MinaProvider implements ProviderNode {
private accountInfoProvider: AccountInfoGraphQLProvider | null
private txSubmitProvider: TxSubmitGraphQLProvider | null
private txStatusProvider: TxStatusGraphQLProvider | null
private daemonStatusProvider: DaemonStatusGraphQLProvider | null
public providerUrl: string

constructor(nodeUrl: string) {
this.accountInfoProvider = new AccountInfoGraphQLProvider(nodeUrl)
this.txSubmitProvider = new TxSubmitGraphQLProvider(nodeUrl)
this.txStatusProvider = new TxStatusGraphQLProvider(nodeUrl)
this.daemonStatusProvider = new DaemonStatusGraphQLProvider(nodeUrl)
this.providerUrl = nodeUrl
}

Expand Down Expand Up @@ -67,6 +71,10 @@ export class MinaProvider implements ProviderNode {
return this.txSubmitProvider?.submitTx(args)
}

public async getDaemonStatus(): Promise<DaemonStatus | undefined> {
return this.daemonStatusProvider?.getDaemonStatus()
}

public async healthCheck(): Promise<HealthCheckResponse | undefined> {
return this.accountInfoProvider?.healthCheck()
}
Expand Down
3 changes: 3 additions & 0 deletions packages/mina-graphql/src/Providers/types.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {
AccountInfo,
AccountInfoArgs,
DaemonStatus,
Mina,
SubmitTxArgs,
SubmitTxResult,
Expand Down Expand Up @@ -35,6 +36,8 @@ export interface ProviderNode {
getTransactionStatus(args: TxStatusArgs): Promise<TxStatus | undefined>

submitTransaction(args: SubmitTxArgs): Promise<SubmitTxResult | undefined>

getDaemonStatus(): Promise<DaemonStatus | undefined>
}

/**
Expand Down
5 changes: 5 additions & 0 deletions packages/mina-graphql/src/Providers/unifiedProvider.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {
AccountInfo,
AccountInfoArgs,
DaemonStatus,
Mina,
SubmitTxArgs,
SubmitTxResult,
Expand Down Expand Up @@ -60,6 +61,10 @@ export class UnifiedMinaProvider implements ProviderNode, ProviderArchive {
return this.nodeProvider.submitTransaction(args)
}

public async getDaemonStatus(): Promise<DaemonStatus | undefined> {
return this.nodeProvider.getDaemonStatus()
}

// Methods related to MinaArchiveProvider
public async getTransactions(
args: TransactionsByAddressesArgs
Expand Down
18 changes: 18 additions & 0 deletions packages/mina-graphql/test/Providers/DaemonStatusProvider.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { DaemonStatusGraphQLProvider } from '../../src/Providers/DaemonStatus'

const minaExplorerGql = 'https://proxy.devnet.minaexplorer.com/'

describe('DaemonStatusGraphQLProvider', () => {
test('getDaemonStatus', async () => {
const provider = new DaemonStatusGraphQLProvider(minaExplorerGql)
const health = await provider.healthCheck()
console.log('Health check:', health)
if (!health) {
throw new Error('Health check failed')
}
const response = await provider.getDaemonStatus()
console.log('Response:', response)

expect(response).not.toBe({ daemonSatus: { chainId: 'N/A' } })
})
})
19 changes: 19 additions & 0 deletions packages/multi-chain-core/src/Multichain/Provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,25 @@ export class MultiChainProvider {
throw new Error('Provider not initialized in Multichain getAccountInfo.')
}

public async getChainId(): Promise<string | undefined> {
if (
this.network === Mina.Networks.MAINNET ||
this.network === Mina.Networks.DEVNET ||
this.network === Mina.Networks.BERKELEY ||
this.network === Mina.Networks.TESTWORLD
) {
return await this.specificProvider?.getDaemonStatus().then((status) => {
if (status && status.daemonStatus && status.daemonStatus.chainId) {
return status.daemonStatus.chainId
}
throw new Error(
'Invalid daemon status data response in Multichain getChainId.'
)
})
}
throw new Error('Provider not initialized in Multichain getChainId.')
}

public async getTransactionStatus(
args: MultiChainTransactionStatusArgs
): Promise<MultiChainTransactionStatus | undefined> {
Expand Down
14 changes: 12 additions & 2 deletions packages/multi-chain-core/test/Multichain/Provider.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,29 @@ import { Mina } from '@palladxyz/mina-core'
import { MultiChainProvider } from '../../src/Multichain/Provider'

describe('MultiChainProvider', () => {
it('should create a mina provider and query the network', async () => {
const provider = new MultiChainProvider(
let provider: MultiChainProvider

beforeAll(() => {
provider = new MultiChainProvider(
{
nodeUrl: 'https://proxy.berkeley.minaexplorer.com/',
archiveUrl: 'https://berkeley.graphql.minaexplorer.com'
},
Mina.Networks.BERKELEY
)
})

it('should create a mina provider and query the network', async () => {
const accountInfo = await provider.getAccountInfo({
publicKey: 'B62qs2mR2g7LB27P36MhxN5jnsnjS8t6azttZfCnAToVpCmTtRVT2nt'
})

expect(accountInfo).toBeDefined()
})

it('should get the chainId', async () => {
const chainId = await provider.getChainId()

expect(chainId).not.toBe({ daemonSatus: { chainId: 'N/A' } })
})
})
8 changes: 8 additions & 0 deletions packages/vault/src/lib/Network/NetworkManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,14 @@ class NetworkManager<Networks extends Multichain.MultiChainNetworks> {
}
}

public async refreshChainIds(): Promise<void> {
await this.providerManager.refreshChainIds()
}

public getAvailableChainIds(): string[] {
return this.providerManager.getAvailableChainIds()
}

public getActiveProvider(): Multichain.MultiChainProvider | null {
return this.providerManager.getProvider(this.activeNetwork)
}
Expand Down
17 changes: 17 additions & 0 deletions packages/vault/src/lib/Provider/ProviderManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export class ProviderManager<Networks extends Multichain.MultiChainNetworks> {
> = {} as Partial<
Record<Multichain.MultiChainNetworks, Multichain.MultiChainProvider | null>
>
public availableChainIds: string[] = []

/**
* Creates a new instance of ProviderManager.
Expand All @@ -42,6 +43,22 @@ export class ProviderManager<Networks extends Multichain.MultiChainNetworks> {
}
}

async refreshChainIds() {
for (const network in this.providers) {
const provider = this.providers[network as Networks]
this.availableChainIds.push((await provider?.getChainId()) || '')
}
}

/**
* Get the available chain ids.
* @returns The available chain ids.
*/

getAvailableChainIds(): string[] {
return this.availableChainIds
}

/**
* Get the Provider for a given network.
* @param network - The target network.
Expand Down
2 changes: 2 additions & 0 deletions packages/vault/src/vault/vaultState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ export type GlobalVaultActions = {
network: Networks,
derivedCredential: GroupedCredentials
) => Promise<void>
getChainId: () => Promise<string | undefined>
getChainIds: () => Promise<string[] | undefined>
getCurrentNetwork: () => Networks
switchNetwork: (network: Multichain.MultiChainNetworks) => Promise<void>
getCredentials: (query: SearchQuery, props: string[]) => StoredCredential[]
Expand Down
Loading
Loading