o1js
Version:
TypeScript framework for zk-SNARKs and zkApps
214 lines (192 loc) • 5.58 kB
text/typescript
/**
* This module holds the global Mina instance and its interface.
*/
import { Field } from '../../provable/wrapped.js';
import { UInt64, UInt32 } from '../../provable/int.js';
import { PublicKey } from '../../provable/crypto/signature.js';
import type { EventActionFilterOptions } from '././../../mina/v1/graphql.js';
import type { NetworkId } from '../../../mina-signer/src/types.js';
import type { Account } from './account.js';
import type { NetworkValue } from './precondition.js';
import type * as Fetch from './fetch.js';
import type { TransactionPromise, PendingTransactionPromise, Transaction } from './transaction.js';
export {
Mina,
FeePayerSpec,
ActionStates,
NetworkConstants,
defaultNetworkConstants,
activeInstance,
setActiveInstance,
ZkappStateLength,
currentSlot,
getAccount,
hasAccount,
getBalance,
getNetworkId,
getNetworkConstants,
getNetworkState,
fetchEvents,
fetchActions,
getActions,
getProofsEnabled,
};
const defaultAccountCreationFee = 1_000_000_000;
const defaultNetworkConstants: NetworkConstants = {
genesisTimestamp: UInt64.from(0),
slotTime: UInt64.from(3 * 60 * 1000),
accountCreationFee: UInt64.from(defaultAccountCreationFee),
};
const ZkappStateLength = 8;
/**
* Allows you to specify information about the fee payer account and the transaction.
*/
type FeePayerSpec =
| PublicKey
| {
sender: PublicKey;
fee?: number | string | UInt64;
memo?: string;
nonce?: number;
}
| undefined;
type ActionStates = {
fromActionState?: Field;
endActionState?: Field;
};
type NetworkConstants = {
genesisTimestamp: UInt64;
/**
* Duration of 1 slot in millisecondw
*/
slotTime: UInt64;
accountCreationFee: UInt64;
};
type Mina = {
transaction(sender: FeePayerSpec, f: () => Promise<void>): TransactionPromise<false, false>;
currentSlot(): UInt32;
hasAccount(publicKey: PublicKey, tokenId?: Field): boolean;
getAccount(publicKey: PublicKey, tokenId?: Field): Account;
getNetworkState(): NetworkValue;
getNetworkConstants(): NetworkConstants;
sendTransaction(transaction: Transaction<boolean, boolean>): PendingTransactionPromise;
fetchEvents: (
publicKey: PublicKey,
tokenId?: Field,
filterOptions?: EventActionFilterOptions,
headers?: HeadersInit
) => ReturnType<typeof Fetch.fetchEvents>;
fetchActions: (
publicKey: PublicKey,
actionStates?: ActionStates,
tokenId?: Field,
from?: number,
to?: number,
headers?: HeadersInit
) => ReturnType<typeof Fetch.fetchActions>;
getActions: (
publicKey: PublicKey,
actionStates?: ActionStates,
tokenId?: Field
) => { hash: string; actions: string[][] }[];
proofsEnabled: boolean;
getNetworkId(): NetworkId;
};
let activeInstance: Mina = {
getNetworkConstants: () => defaultNetworkConstants,
currentSlot: noActiveInstance,
hasAccount: noActiveInstance,
getAccount: noActiveInstance,
getNetworkState: noActiveInstance,
sendTransaction: noActiveInstance,
transaction: noActiveInstance,
fetchEvents: noActiveInstance,
fetchActions: noActiveInstance,
getActions: noActiveInstance,
proofsEnabled: true,
getNetworkId: () => 'devnet',
};
/**
* Set the currently used Mina instance.
*/
function setActiveInstance(m: Mina) {
activeInstance = m;
}
function noActiveInstance(): never {
throw Error('Must call Mina.setActiveInstance first');
}
/**
* @return The current slot number, according to the active Mina instance.
*/
function currentSlot(): UInt32 {
return activeInstance.currentSlot();
}
/**
* @return The account data associated to the given public key.
*/
function getAccount(publicKey: PublicKey, tokenId?: Field): Account {
return activeInstance.getAccount(publicKey, tokenId);
}
/**
* Checks if an account exists within the ledger.
*/
function hasAccount(publicKey: PublicKey, tokenId?: Field): boolean {
return activeInstance.hasAccount(publicKey, tokenId);
}
/**
* @return The current Mina network ID.
*/
function getNetworkId() {
return activeInstance.getNetworkId();
}
/**
* @return Data associated with the current Mina network constants.
*/
function getNetworkConstants() {
return activeInstance.getNetworkConstants();
}
/**
* @return Data associated with the current state of the Mina network.
*/
function getNetworkState() {
return activeInstance.getNetworkState();
}
/**
* @return The balance associated to the given public key.
*/
function getBalance(publicKey: PublicKey, tokenId?: Field) {
return activeInstance.getAccount(publicKey, tokenId).balance;
}
/**
* @return A list of emitted events associated to the given public key.
*/
async function fetchEvents(
publicKey: PublicKey,
tokenId: Field,
filterOptions: EventActionFilterOptions = {},
headers?: HeadersInit
) {
return await activeInstance.fetchEvents(publicKey, tokenId, filterOptions, headers);
}
/**
* @return A list of emitted sequencing actions associated to the given public key.
*/
async function fetchActions(
publicKey: PublicKey,
actionStates?: ActionStates,
tokenId?: Field,
from?: number,
to?: number,
headers?: HeadersInit
) {
return await activeInstance.fetchActions(publicKey, actionStates, tokenId, from, to, headers);
}
/**
* @return A list of emitted sequencing actions associated to the given public key.
*/
function getActions(publicKey: PublicKey, actionStates?: ActionStates, tokenId?: Field) {
return activeInstance.getActions(publicKey, actionStates, tokenId);
}
function getProofsEnabled() {
return activeInstance.proofsEnabled;
}