diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 5902baa299..ecb6b566be 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -319,7 +319,7 @@ jobs: needs: [Prepare] timeout-minutes: 45 runs-on: ubuntu-latest - if: github.event.pull_request.base.ref != 'develop' + if: github.event.pull_request.base.ref == 'develop' services: mina-local-network: image: o1labs/mina-local-network:master-latest-lightnet @@ -355,7 +355,7 @@ jobs: needs: [Prepare] timeout-minutes: 45 runs-on: ubuntu-latest - if: github.event.pull_request.base.ref != 'develop' + if: github.event.pull_request.base.ref == 'main' services: mina-local-network: image: o1labs/mina-local-network:compatible-latest-lightnet @@ -421,4 +421,39 @@ jobs: - name: Use shared steps for live testing jobs uses: ./.github/actions/live-tests-shared with: - mina-branch-name: develop \ No newline at end of file + mina-branch-name: develop + mesa: + needs: [Prepare] + timeout-minutes: 45 + runs-on: ubuntu-latest + if: github.event.pull_request.base.ref == 'develop-3.0' + services: + mina-local-network: + image: o1labs/mina-local-network:mesa-latest-lightnet + env: + NETWORK_TYPE: 'single-node' + PROOF_LEVEL: 'none' + ports: + - 3085:3085 + - 5432:5432 + - 8080:8080 + - 8181:8181 + - 8282:8282 + volumes: + - /tmp:/root/logs + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + repository: ${{ inputs.target_repo || github.repository }} + ref: ${{ inputs.target_ref || github.ref }} + - name: build + uses: ./.github/actions/build + with: + repository: ${{ inputs.target_repo || github.repository }} + ref: ${{ inputs.target_ref || github.ref }} + proof_systems_commit: ${{ inputs.proof_systems_commit }} + - name: Use shared steps for live testing jobs + uses: ./.github/actions/live-tests-shared + with: + mina-branch-name: mesa \ No newline at end of file diff --git a/.github/workflows/pull_requests.yml b/.github/workflows/pull_requests.yml index 05efb5335f..d8bec680d1 100644 --- a/.github/workflows/pull_requests.yml +++ b/.github/workflows/pull_requests.yml @@ -4,6 +4,8 @@ on: types: [assigned, opened, synchronize, reopened, labeled, unlabeled] branches: - main + - develop + - develop-3.0 jobs: Check-Changelog: name: Check Changelog Action diff --git a/.github/workflows/push_main.yml b/.github/workflows/push_main.yml index b47476d438..23563cb8bc 100644 --- a/.github/workflows/push_main.yml +++ b/.github/workflows/push_main.yml @@ -6,9 +6,8 @@ on: - completed branches: - main - - v1 - - v2 - - v3 + - develop + - develop-3.0 concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/CHANGELOG.md b/CHANGELOG.md index acb233c134..d6acaadda8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,12 @@ This project adheres to ## [Unreleased](https://github.com/o1-labs/o1js/compare/c2e51a84...HEAD) +### Changed + +- `Transaction.setFeePerSnarkCost` has been removed, since "snark cost" has been + removed in `mina`, replaced with `MAX_ZKAPP_SEGMENT_PER_TRANSACTION`, + simplifying calculations. Instead, use `setFeePerAccountUpdate`. + ### Fixed - Fixed an edge case that prevented the cache from being generated and read diff --git a/npmDepsHash b/npmDepsHash index 3f845bab0a..9913cba85a 100644 --- a/npmDepsHash +++ b/npmDepsHash @@ -1 +1 @@ -sha256-8CQBNNFXIromQdOyvdjGQIb1RNdZfevXPcu89uv0C94= +sha256-oIzUIF4Rtgjx3rPh7W4XrnldUYtVINX3cxcxdVfH/Ng= diff --git a/package-lock.json b/package-lock.json index b8860a12c0..b8e6cd4188 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "typescript": "^5.4.5" }, "engines": { - "node": ">=18.14.0" + "node": ">=22.19.5" } }, "node_modules/@ampproject/remapping": { diff --git a/src/lib/mina/v1/constants.ts b/src/lib/mina/v1/constants.ts index 9e221097b7..7ee2e3fda1 100644 --- a/src/lib/mina/v1/constants.ts +++ b/src/lib/mina/v1/constants.ts @@ -10,7 +10,7 @@ export namespace TransactionLimits { } export namespace ZkappConstants { - export const MAX_ZKAPP_STATE_FIELDS = 8 as const; + export const MAX_ZKAPP_STATE_FIELDS = 32 as const; export const ACCOUNT_ACTION_STATE_BUFFER_SIZE = 5 as const; export const ACCOUNT_CREATION_FEE = 1000000000n as const; } diff --git a/src/lib/mina/v1/local-blockchain.ts b/src/lib/mina/v1/local-blockchain.ts index 270f9e25d5..cd4437bb2c 100644 --- a/src/lib/mina/v1/local-blockchain.ts +++ b/src/lib/mina/v1/local-blockchain.ts @@ -261,7 +261,7 @@ async function LocalBlockchain({ proofsEnabled = true, enforceTransactionLimits errors, transaction: txn.transaction, setFee: txn.setFee, - setFeePerSnarkCost: txn.setFeePerSnarkCost, + setFeePerAccountUpdate: txn.setFeePerAccountUpdate, hash, toJSON: txn.toJSON, toPretty: txn.toPretty, diff --git a/src/lib/mina/v1/mina-instance.ts b/src/lib/mina/v1/mina-instance.ts index bbad6e5bb3..d491748176 100644 --- a/src/lib/mina/v1/mina-instance.ts +++ b/src/lib/mina/v1/mina-instance.ts @@ -1,36 +1,35 @@ /** * This module holds the global Mina instance and its interface. */ -import { Field } from '../../provable/wrapped.js'; -import { UInt64, UInt32 } from '../../provable/int.js'; +import type { NetworkId } from '../../../mina-signer/src/types.js'; import { PublicKey } from '../../provable/crypto/signature.js'; +import { UInt32, UInt64 } from '../../provable/int.js'; +import { Field } from '../../provable/wrapped.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'; +import type { NetworkValue } from './precondition.js'; +import type { PendingTransactionPromise, Transaction, TransactionPromise } from './transaction.js'; export { - Mina, - FeePayerSpec, ActionStates, + FeePayerSpec, + Mina, NetworkConstants, - defaultNetworkConstants, activeInstance, - setActiveInstance, - ZkappStateLength, currentSlot, + defaultNetworkConstants, + fetchActions, + fetchEvents, getAccount, - hasAccount, + getActions, getBalance, - getNetworkId, getNetworkConstants, + getNetworkId, getNetworkState, - fetchEvents, - fetchActions, - getActions, getProofsEnabled, + hasAccount, + setActiveInstance, }; const defaultAccountCreationFee = 1_000_000_000; @@ -40,8 +39,6 @@ const defaultNetworkConstants: NetworkConstants = { accountCreationFee: UInt64.from(defaultAccountCreationFee), }; -const ZkappStateLength = 8; - /** * Allows you to specify information about the fee payer account and the transaction. */ diff --git a/src/lib/mina/v1/mina.network.unit-test.ts b/src/lib/mina/v1/mina.network.unit-test.ts index a34e165275..3da9951b15 100644 --- a/src/lib/mina/v1/mina.network.unit-test.ts +++ b/src/lib/mina/v1/mina.network.unit-test.ts @@ -1,6 +1,7 @@ -import { UInt64, Mina, AccountUpdate, PublicKey, Field, TokenId, PrivateKey } from 'o1js'; -import { describe, it, before, beforeEach, afterEach } from 'node:test'; import { expect } from 'expect'; +import { afterEach, before, beforeEach, describe, it } from 'node:test'; +import { AccountUpdate, Field, Mina, PrivateKey, PublicKey, TokenId, UInt64 } from 'o1js'; +import { TransactionLimits } from './constants.js'; const defaultNetwork = Mina.Network({ networkId: 'testnet', @@ -69,7 +70,11 @@ describe('Test default network', () => { it('More than limit account update', async () => { let txn = await Mina.transaction(async () => { - for (let index = 0; index < 12; index++) { + for ( + let index = 0; + index < TransactionLimits.MAX_ZKAPP_SEGMENT_PER_TRANSACTION + 1; + index++ + ) { const accountUpdateBob = AccountUpdate.create(bobAccount, Field.from(index)); accountUpdateBob.account.balance.requireEquals(UInt64.zero); accountUpdateBob.balance.addInPlace(UInt64.one); @@ -114,7 +119,11 @@ describe('Test enforced network', () => { it('More than limit account update', async () => { let txn = await Mina.transaction(async () => { - for (let index = 0; index < 12; index++) { + for ( + let index = 0; + index < TransactionLimits.MAX_ZKAPP_SEGMENT_PER_TRANSACTION + 1; + index++ + ) { const accountUpdateBob = AccountUpdate.create(bobAccount, Field.from(index)); accountUpdateBob.account.balance.requireEquals(UInt64.zero); accountUpdateBob.balance.addInPlace(UInt64.one); @@ -159,7 +168,11 @@ describe('Test unlimited network', () => { it('More than limit account update', async () => { let txn = await Mina.transaction(async () => { - for (let index = 0; index < 12; index++) { + for ( + let index = 0; + index < TransactionLimits.MAX_ZKAPP_SEGMENT_PER_TRANSACTION + 1; + index++ + ) { const accountUpdateBob = AccountUpdate.create(bobAccount, Field.from(index)); accountUpdateBob.account.balance.requireEquals(UInt64.zero); accountUpdateBob.balance.addInPlace(UInt64.one); @@ -252,7 +265,11 @@ describe('Test network with headers', () => { it('More than limit account update', async () => { let txn = await Mina.transaction(async () => { - for (let index = 0; index < 12; index++) { + for ( + let index = 0; + index < TransactionLimits.MAX_ZKAPP_SEGMENT_PER_TRANSACTION + 1; + index++ + ) { const accountUpdateBob = AccountUpdate.create(bobAccount, Field.from(index)); accountUpdateBob.account.balance.requireEquals(UInt64.zero); accountUpdateBob.balance.addInPlace(UInt64.one); diff --git a/src/lib/mina/v1/mina.ts b/src/lib/mina/v1/mina.ts index ecfe5fb144..8d24891c68 100644 --- a/src/lib/mina/v1/mina.ts +++ b/src/lib/mina/v1/mina.ts @@ -1,90 +1,90 @@ import { Test } from '../../../bindings.js'; -import { Field } from '../../provable/wrapped.js'; -import { UInt64 } from '../../provable/int.js'; -import { PublicKey } from '../../provable/crypto/signature.js'; -import { TokenId, Authorization } from './account-update.js'; -import * as Fetch from './fetch.js'; -import { humanizeErrors, invalidTransactionError } from './errors.js'; import { Types } from '../../../bindings/mina-transaction/v1/types.js'; -import { Account } from './account.js'; import { NetworkId } from '../../../mina-signer/src/types.js'; -import { currentTransaction } from './transaction-context.js'; +import { PublicKey } from '../../provable/crypto/signature.js'; +import { UInt64 } from '../../provable/int.js'; +import { Field } from '../../provable/wrapped.js'; +import { Authorization, TokenId } from './account-update.js'; +import { Account } from './account.js'; +import { humanizeErrors, invalidTransactionError } from './errors.js'; +import * as Fetch from './fetch.js'; +import { type EventActionFilterOptions } from './graphql.js'; +import { LocalBlockchain, TestPublicKey } from './local-blockchain.js'; import { - type FeePayerSpec, - type ActionStates, - type NetworkConstants, - activeInstance, - setActiveInstance, Mina, - defaultNetworkConstants, + activeInstance, currentSlot, + defaultNetworkConstants, + fetchActions, + fetchEvents, getAccount, - hasAccount, + getActions, getBalance, - getNetworkId, getNetworkConstants, + getNetworkId, getNetworkState, - fetchEvents, - fetchActions, - getActions, getProofsEnabled, + hasAccount, + setActiveInstance, + type ActionStates, + type FeePayerSpec, + type NetworkConstants, } from './mina-instance.js'; -import { type EventActionFilterOptions } from './graphql.js'; +import { currentTransaction } from './transaction-context.js'; +import { + defaultNetworkState, + filterGroups, + reportGetAccountError, + verifyTransactionLimits, +} from './transaction-validation.js'; import { Transaction, - type PendingTransaction, - type IncludedTransaction, - type RejectedTransaction, - type PendingTransactionStatus, - type PendingTransactionPromise, + createIncludedTransaction, + createRejectedTransaction, createTransaction, + toPendingTransactionPromise, toTransactionPromise, transaction, - createRejectedTransaction, - createIncludedTransaction, - toPendingTransactionPromise, + type IncludedTransaction, + type PendingTransaction, + type PendingTransactionPromise, + type PendingTransactionStatus, + type RejectedTransaction, } from './transaction.js'; -import { - reportGetAccountError, - verifyTransactionLimits, - defaultNetworkState, - filterGroups, -} from './transaction-validation.js'; -import { LocalBlockchain, TestPublicKey } from './local-blockchain.js'; export { + ActionStates, + FeePayerSpec, LocalBlockchain, Network, - currentTransaction, - Transaction, - type PendingTransaction, - type IncludedTransaction, - type RejectedTransaction, - type PendingTransactionStatus, - type PendingTransactionPromise, TestPublicKey, + Transaction, activeInstance, - setActiveInstance, - transaction, - sender, currentSlot, + currentTransaction, + faucet, + fetchActions, + fetchEvents, + // for internal testing only + filterGroups, getAccount, - hasAccount, + getActions, getBalance, - getNetworkId, getNetworkConstants, + getNetworkId, getNetworkState, - fetchEvents, - fetchActions, - getActions, - FeePayerSpec, - ActionStates, - faucet, - waitForFunding, getProofsEnabled, - // for internal testing only - filterGroups, + hasAccount, + sender, + setActiveInstance, + transaction, + waitForFunding, + type IncludedTransaction, type NetworkConstants, + type PendingTransaction, + type PendingTransactionPromise, + type PendingTransactionStatus, + type RejectedTransaction, }; // patch active instance so that we can still create basic transactions without giving Mina network details @@ -254,7 +254,7 @@ function Network( errors: updatedErrors, transaction: txn.transaction, setFee: txn.setFee, - setFeePerSnarkCost: txn.setFeePerSnarkCost, + setFeePerAccountUpdate: txn.setFeePerAccountUpdate, hash, toJSON: txn.toJSON, toPretty: txn.toPretty, diff --git a/src/lib/mina/v1/precondition.ts b/src/lib/mina/v1/precondition.ts index c05729ac98..f4420432d5 100644 --- a/src/lib/mina/v1/precondition.ts +++ b/src/lib/mina/v1/precondition.ts @@ -1,37 +1,36 @@ -import { Bool, Field } from '../../provable/wrapped.js'; -import { circuitValueEquals, cloneCircuitValue } from '../../provable/types/struct.js'; -import { Provable } from '../../provable/provable.js'; -import { activeInstance as Mina } from './mina-instance.js'; -import type { AccountUpdate } from './account-update.js'; -import { Int64, UInt32, UInt64 } from '../../provable/int.js'; -import { Layout } from '../../../bindings/mina-transaction/gen/v1/transaction.js'; import { jsLayout } from '../../../bindings/mina-transaction/gen/v1/js-layout.js'; -import { emptyReceiptChainHash, TokenSymbol } from '../../provable/crypto/poseidon.js'; -import { PublicKey } from '../../provable/crypto/signature.js'; +import { Layout } from '../../../bindings/mina-transaction/gen/v1/transaction.js'; import { ActionState, Actions, ZkappUri, } from '../../../bindings/mina-transaction/v1/transaction-leaves.js'; import type { Types } from '../../../bindings/mina-transaction/v1/types.js'; -import type { Permissions } from './account-update.js'; -import { ZkappStateLength } from './mina-instance.js'; +import { TokenSymbol, emptyReceiptChainHash } from '../../provable/crypto/poseidon.js'; +import { PublicKey } from '../../provable/crypto/signature.js'; +import { Int64, UInt32, UInt64 } from '../../provable/int.js'; +import { Provable } from '../../provable/provable.js'; +import { circuitValueEquals, cloneCircuitValue } from '../../provable/types/struct.js'; +import { Bool, Field } from '../../provable/wrapped.js'; import { assertInternal } from '../../util/errors.js'; +import type { AccountUpdate, Permissions } from './account-update.js'; +import { ZkappConstants } from './constants.js'; +import { activeInstance as Mina } from './mina-instance.js'; export { - preconditions, Account, - Network, + AccountValue, + ClosedInterval, CurrentSlot, + Network, + NetworkValue, + OrIgnore, + Preconditions, assertPreconditionInvariants, cleanPreconditionsCache, ensureConsistentPrecondition, - AccountValue, - NetworkValue, getAccountPreconditions, - Preconditions, - OrIgnore, - ClosedInterval, + preconditions, }; type AccountUpdateBody = Types.AccountUpdate['body']; @@ -104,7 +103,7 @@ type AccountPrecondition = Preconditions['account']; const AccountPrecondition = { ignoreAll(): AccountPrecondition { let appState: Array> = []; - for (let i = 0; i < ZkappStateLength; ++i) { + for (let i = 0; i < ZkappConstants.MAX_ZKAPP_STATE_FIELDS; ++i) { appState.push(ignore(Field(0))); } return { diff --git a/src/lib/mina/v1/state.ts b/src/lib/mina/v1/state.ts index 71d99a942f..00a985bdea 100644 --- a/src/lib/mina/v1/state.ts +++ b/src/lib/mina/v1/state.ts @@ -1,24 +1,24 @@ -import { FlexibleProvablePure } from '../../provable/types/struct.js'; -import { AccountUpdate, TokenId } from './account-update.js'; import { PublicKey } from '../../provable/crypto/signature.js'; -import * as Mina from './mina.js'; -import { fetchAccount, networkConfig } from './fetch.js'; -import { SmartContract } from './zkapp.js'; -import { Account } from './account.js'; import { Provable } from '../../provable/provable.js'; -import { Field } from '../../provable/wrapped.js'; import { ProvablePure, ProvableType, ProvableTypePure, } from '../../provable/types/provable-intf.js'; +import { FlexibleProvablePure } from '../../provable/types/struct.js'; +import { Bool, Field } from '../../provable/wrapped.js'; +import { AccountUpdate, TokenId } from './account-update.js'; +import { Account } from './account.js'; +import { ZkappConstants } from './constants.js'; +import { fetchAccount, networkConfig } from './fetch.js'; +import * as Mina from './mina.js'; import { ensureConsistentPrecondition } from './precondition.js'; -import { Bool } from '../../provable/wrapped.js'; +import { SmartContract } from './zkapp.js'; // external API -export { State, state, declareState }; +export { State, declareState, state }; // internal API -export { assertStatePrecondition, cleanStatePrecondition, getLayout, InternalStateType }; +export { InternalStateType, assertStatePrecondition, cleanStatePrecondition, getLayout }; /** * Gettable and settable state that can be checked for equality. @@ -399,9 +399,9 @@ function getLayout(scClass: typeof SmartContract) { layout.set(key, { offset, length }); offset += length; }); - if (offset > 8) { + if (offset > ZkappConstants.MAX_ZKAPP_STATE_FIELDS) { throw Error( - `Found ${offset} on-chain state field elements on ${scClass.name}. Currently, only a total of 8 field elements of state are supported.` + `Found ${offset} on-chain state field elements on ${scClass.name}. Currently, only a total of 32 field elements of state are supported.` ); } } diff --git a/src/lib/mina/v1/transaction-validation.ts b/src/lib/mina/v1/transaction-validation.ts index 6cdb2e10d5..3fc75c2664 100644 --- a/src/lib/mina/v1/transaction-validation.ts +++ b/src/lib/mina/v1/transaction-validation.ts @@ -29,7 +29,7 @@ export { getEvents as getTotalTimeRequired, reportGetAccountError, verifyAccountUpdate, - verifyTransactionLimits + verifyTransactionLimits, }; function reportGetAccountError(publicKey: string, tokenId: string) { @@ -106,7 +106,7 @@ function getEvents(accountUpdates: AccountUpdate[]) { }); let authTypes = filterGroups(authKinds); - return { eventElements, authTypes }; + return { eventElements, authTypes, totalAccountUpdates: accountUpdates.length }; } function countEventElements({ data }: Events) { diff --git a/src/lib/mina/v1/transaction.test.ts b/src/lib/mina/v1/transaction.test.ts index 12f057abc2..3c5fda822c 100644 --- a/src/lib/mina/v1/transaction.test.ts +++ b/src/lib/mina/v1/transaction.test.ts @@ -1,4 +1,4 @@ -import { UInt64, SmartContract, Mina, AccountUpdate, method, Transaction } from 'o1js'; +import { AccountUpdate, Mina, SmartContract, Transaction, UInt64, method } from 'o1js'; class MyContract extends SmartContract { @method async shouldMakeCompileThrow() { @@ -49,7 +49,7 @@ describe('transactions', () => { }); let nonce = tx.transaction.feePayer.body.nonce; let promise = tx.sign([feePayer.key, contractAccount.key]); - let new_fee = promise.setFeePerSnarkCost(42.7); + let new_fee = promise.setFeePerAccountUpdate(42); await new_fee.sign([feePayer.key, contractAccount.key]); await new_fee.send(); // check that tx was applied, by checking nonce was incremented diff --git a/src/lib/mina/v1/transaction.ts b/src/lib/mina/v1/transaction.ts index be8e97defb..0feb9a1c83 100644 --- a/src/lib/mina/v1/transaction.ts +++ b/src/lib/mina/v1/transaction.ts @@ -1,47 +1,46 @@ +import { Types } from '../../../bindings/mina-transaction/v1/types.js'; +import { Proof } from '../../proof-system/proof.js'; +import { Empty } from '../../proof-system/zkprogram.js'; +import { PrivateKey, PublicKey } from '../../provable/crypto/signature.js'; +import { UInt32, UInt64 } from '../../provable/int.js'; +import { Provable } from '../../provable/provable.js'; +import { Field } from '../../provable/wrapped.js'; +import { assertPromise } from '../../util/assert.js'; import { - ZkappCommand, AccountUpdate, - ZkappPublicInput, AccountUpdateLayout, FeePayerUnsigned, - addMissingSignatures, TokenId, + ZkappCommand, + ZkappPublicInput, addMissingProofs, + addMissingSignatures, } from './account-update.js'; -import { Field } from '../../provable/wrapped.js'; -import { PrivateKey, PublicKey } from '../../provable/crypto/signature.js'; -import { UInt32, UInt64 } from '../../provable/int.js'; -import { Empty } from '../../proof-system/zkprogram.js'; -import { Proof } from '../../proof-system/proof.js'; -import { currentTransaction } from './transaction-context.js'; -import { Provable } from '../../provable/provable.js'; -import { assertPreconditionInvariants } from './precondition.js'; import { Account } from './account.js'; -import { type FeePayerSpec, activeInstance } from './mina-instance.js'; import * as Fetch from './fetch.js'; -import { type SendZkAppResponse, sendZkappQuery } from './graphql.js'; -import { type FetchMode } from './transaction-context.js'; -import { assertPromise } from '../../util/assert.js'; -import { Types } from '../../../bindings/mina-transaction/v1/types.js'; +import { sendZkappQuery, type SendZkAppResponse } from './graphql.js'; +import { activeInstance, type FeePayerSpec } from './mina-instance.js'; +import { assertPreconditionInvariants } from './precondition.js'; +import { currentTransaction, type FetchMode } from './transaction-context.js'; import { getTotalTimeRequired } from './transaction-validation.js'; export { Transaction, - type TransactionPromise, - type PendingTransaction, - type IncludedTransaction, - type RejectedTransaction, - type PendingTransactionPromise, - type PendingTransactionStatus, + createIncludedTransaction, + createRejectedTransaction, createTransaction, - toTransactionPromise, - toPendingTransactionPromise, - sendTransaction, - newTransaction, getAccount, + newTransaction, + sendTransaction, + toPendingTransactionPromise, + toTransactionPromise, transaction, - createRejectedTransaction, - createIncludedTransaction, + type IncludedTransaction, + type PendingTransaction, + type PendingTransactionPromise, + type PendingTransactionStatus, + type RejectedTransaction, + type TransactionPromise, }; type TransactionCommon = { @@ -142,9 +141,9 @@ type Transaction = TransactionCo */ setFee(newFee: UInt64): TransactionPromise; /** - * setFeePerSnarkCost behaves identically to {@link Transaction.setFee} but the fee is given per estimated cost of snarking the transition as given by {@link getTotalTimeRequired}. This is useful because it should reflect what snark workers would charge in times of network contention. + * setFeePerAccountUpdate behaves identically to {@link Transaction.setFee} but the fee is given per estimated cost of snarking the transition as given by {@link getTotalTimeRequired}. This is useful because it should reflect what snark workers would charge in times of network contention. */ - setFeePerSnarkCost(newFeePerSnarkCost: number): TransactionPromise; + setFeePerAccountUpdate(newFeePerAccountUpdate: number): TransactionPromise; } & (Proven extends false ? { /** @@ -281,9 +280,9 @@ type PendingTransaction = Pick; /** - * setFeePerSnarkCost is the same as {@link Transaction.setFeePerSnarkCost(newFeePerSnarkCost)} but for a {@link PendingTransaction}. + * setFeePerAccountUpdate is the same as {@link Transaction.setFeePerAccountUpdate(newFeePerAccountUpdate)} but for a {@link PendingTransaction}. */ - setFeePerSnarkCost(newFeePerSnarkCost: number): TransactionPromise; + setFeePerAccountUpdate(newFeePerAccountUpdate: number): TransactionPromise; }; /** @@ -560,9 +559,9 @@ function newTransaction(transaction: ZkappCommand, proofsEnabled?: boolean) { } return pendingTransaction; }, - setFeePerSnarkCost(newFeePerSnarkCost: number) { - let { totalTimeRequired } = getTotalTimeRequired(transaction.accountUpdates); - return this.setFee(new UInt64(Math.round(totalTimeRequired * newFeePerSnarkCost))); + setFeePerAccountUpdate(newFeePerAccountUpdate: number) { + let { totalAccountUpdates } = getTotalTimeRequired(transaction.accountUpdates); + return this.setFee(new UInt64(Math.round(totalAccountUpdates * newFeePerAccountUpdate))); }, setFee(newFee: UInt64) { return toTransactionPromise(async () => { diff --git a/src/lib/mina/v1/zkapp.ts b/src/lib/mina/v1/zkapp.ts index d6a34238ff..bc11e7e379 100644 --- a/src/lib/mina/v1/zkapp.ts +++ b/src/lib/mina/v1/zkapp.ts @@ -1,78 +1,78 @@ import 'reflect-metadata'; import { Gate, Pickles } from '../../../bindings.js'; -import { Field, Bool } from '../../provable/wrapped.js'; -import { - AccountUpdate, - Authorization, - Body, - Events, - Permissions, - TokenId, - ZkappCommand, - zkAppProver, - ZkappPublicInput, - LazyProof, - AccountUpdateForest, - AccountUpdateLayout, - AccountUpdateTree, -} from './account-update.js'; -import type { EventActionFilterOptions } from './graphql.js'; -import { - cloneCircuitValue, - FlexibleProvablePure, - InferProvable, -} from '../../provable/types/struct.js'; -import { Provable, getBlindingValue, memoizationContext } from '../../provable/provable.js'; import * as Encoding from '../../../bindings/lib/encoding.js'; +import { Cache } from '../../proof-system/cache.js'; +import { Proof, ProofClass } from '../../proof-system/proof.js'; +import { VerificationKey } from '../../proof-system/verification-key.js'; import { - HashInput, - Poseidon, - hashConstant, - isHashable, - packToFields, -} from '../../provable/crypto/poseidon.js'; -import { UInt32, UInt64 } from '../../provable/int.js'; -import * as Mina from './mina.js'; -import { assertPreconditionInvariants, cleanPreconditionsCache } from './precondition.js'; -import { + Empty, + MethodInterface, analyzeMethod, compileProgram, computeMaxProofsVerified, - Empty, - MethodInterface, sortMethodArguments, } from '../../proof-system/zkprogram.js'; -import { VerificationKey } from '../../proof-system/verification-key.js'; -import { Proof, ProofClass } from '../../proof-system/proof.js'; -import { PublicKey } from '../../provable/crypto/signature.js'; -import { - InternalStateType, - assertStatePrecondition, - cleanStatePrecondition, - getLayout, -} from './state.js'; import { inAnalyze, inCheckedComputation, inCompile, inProver, } from '../../provable/core/provable-context.js'; -import { Cache } from '../../proof-system/cache.js'; +import { + HashInput, + Poseidon, + hashConstant, + isHashable, + packToFields, +} from '../../provable/crypto/poseidon.js'; +import { PublicKey } from '../../provable/crypto/signature.js'; import { assert } from '../../provable/gadgets/common.js'; +import { UInt32, UInt64 } from '../../provable/int.js'; +import { Provable, getBlindingValue, memoizationContext } from '../../provable/provable.js'; +import { provable } from '../../provable/types/provable-derivers.js'; +import { ProvablePure, ProvableType } from '../../provable/types/provable-intf.js'; +import { + FlexibleProvablePure, + InferProvable, + cloneCircuitValue, +} from '../../provable/types/struct.js'; +import { Bool, Field } from '../../provable/wrapped.js'; +import { assertPromise } from '../../util/assert.js'; +import { + AccountUpdate, + AccountUpdateForest, + AccountUpdateLayout, + AccountUpdateTree, + Authorization, + Body, + Events, + LazyProof, + Permissions, + TokenId, + ZkappCommand, + ZkappPublicInput, + zkAppProver, +} from './account-update.js'; +import { Reducer, getReducer } from './actions/reducer.js'; +import { ZkappConstants } from './constants.js'; +import type { EventActionFilterOptions } from './graphql.js'; +import * as Mina from './mina.js'; +import { assertPreconditionInvariants, cleanPreconditionsCache } from './precondition.js'; import { SmartContractBase } from './smart-contract-base.js'; -import { ZkappStateLength } from './mina-instance.js'; import { SmartContractContext, accountUpdateLayout, smartContractContext, } from './smart-contract-context.js'; -import { assertPromise } from '../../util/assert.js'; -import { ProvablePure, ProvableType } from '../../provable/types/provable-intf.js'; -import { getReducer, Reducer } from './actions/reducer.js'; -import { provable } from '../../provable/types/provable-derivers.js'; +import { + InternalStateType, + assertStatePrecondition, + cleanStatePrecondition, + getLayout, +} from './state.js'; // external API -export { SmartContract, method, DeployArgs, declareMethods }; +export { DeployArgs, SmartContract, declareMethods, method }; const reservedPropNames = new Set(['_methods', '_']); type AsyncFunction = (...args: any) => Promise; @@ -771,7 +771,7 @@ super.init(); let accountUpdate = this.self; // set all state fields to 0 - for (let i = 0; i < ZkappStateLength; i++) { + for (let i = 0; i < ZkappConstants.MAX_ZKAPP_STATE_FIELDS; i++) { AccountUpdate.setValue(accountUpdate.body.update.appState[i], Field(0)); } diff --git a/src/lib/mina/v2/account-update.unit-test.ts b/src/lib/mina/v2/account-update.unit-test.ts index b4dd928a42..f84bea9671 100644 --- a/src/lib/mina/v2/account-update.unit-test.ts +++ b/src/lib/mina/v2/account-update.unit-test.ts @@ -1,15 +1,8 @@ -import { AccountUpdate, Authorized, GenericData } from './account-update.js'; -import { AccountId, AccountTiming } from './account.js'; -import { AccountUpdateAuthorizationKind } from './authorization.js'; -import { TokenId, Update } from './core.js'; -import { Precondition } from './preconditions.js'; -import { GenericStatePreconditions, GenericStateUpdates } from './state.js'; -import { AccountUpdate as V1AccountUpdateImpl } from '../v1/account-update.js'; -import { VerificationKey } from '../../proof-system/verification-key.js'; -import { Bool } from '../../provable/bool.js'; -import { Field } from '../../provable/field.js'; -import { UInt32, UInt64, Int64, Sign } from '../../provable/int.js'; -import { PrivateKey } from '../../provable/crypto/signature.js'; +import { expect } from 'expect'; +import { jsLayout as layoutV1 } from '../../../bindings/mina-transaction/gen/v1/js-layout.js'; +import * as ValuesV1 from '../../../bindings/mina-transaction/gen/v1/transaction-bigint.js'; +import * as JsonV1 from '../../../bindings/mina-transaction/gen/v1/transaction-json.js'; +import * as TypesV1 from '../../../bindings/mina-transaction/gen/v1/transaction.js'; import { Actions as V1Actions, Events as V1Events, @@ -17,26 +10,34 @@ import { TokenSymbol as V1TokenSymbol, ZkappUri as V1ZkappUri, } from '../../../bindings/mina-transaction/v1/transaction-leaves.js'; -import * as TypesV1 from '../../../bindings/mina-transaction/gen/v1/transaction.js'; -import * as ValuesV1 from '../../../bindings/mina-transaction/gen/v1/transaction-bigint.js'; -import * as JsonV1 from '../../../bindings/mina-transaction/gen/v1/transaction-json.js'; -import { jsLayout as layoutV1 } from '../../../bindings/mina-transaction/gen/v1/js-layout.js'; -import { expect } from 'expect'; +import { VerificationKey } from '../../proof-system/verification-key.js'; +import { Bool } from '../../provable/bool.js'; +import { PrivateKey } from '../../provable/crypto/signature.js'; +import { Field } from '../../provable/field.js'; +import { Int64, Sign, UInt32, UInt64 } from '../../provable/int.js'; +import { AccountUpdate as V1AccountUpdateImpl } from '../v1/account-update.js'; +import { AccountUpdate, Authorized, GenericData } from './account-update.js'; +import { AccountId, AccountTiming } from './account.js'; +import { AccountUpdateAuthorizationKind } from './authorization.js'; +import { TokenId, Update } from './core.js'; +import { Precondition } from './preconditions.js'; +import { GenericStatePreconditions, GenericStateUpdates } from './state.js'; +import { + Signature, + signFieldElement, + zkAppBodyPrefix, +} from '../../../mina-signer/src/signature.js'; import { ZkappConstants } from '../v1/constants.js'; import { testV1V2ClassEquivalence, testV1V2ValueEquivalence, testV2Encoding, } from './test/utils.js'; -import { - Signature, - signFieldElement, - zkAppBodyPrefix, -} from '../../../mina-signer/src/signature.js'; +import { protocolVersions } from '../../../bindings/crypto/constants.js'; import { Types } from '../../../bindings/mina-transaction/v1/types.js'; -import { packToFields, hashWithPrefix } from '../../../lib/provable/crypto/poseidon.js'; +import { hashWithPrefix, packToFields } from '../../../lib/provable/crypto/poseidon.js'; function testHashEquality(v1: TypesV1.AccountUpdate, v2: Authorized) { expect(TypesV1.AccountUpdate.toInput(v1)).toEqual(v2.toInput()); @@ -273,7 +274,7 @@ const v1AccountUpdate: TypesV1.AccountUpdate = { update: { appState: new Array(ZkappConstants.MAX_ZKAPP_STATE_FIELDS).fill({ isSome: new Bool(true), - value: new Field(8), + value: new Field(32), }), delegate: { isSome: new Bool(true), value: publicKey }, verificationKey: { @@ -291,7 +292,7 @@ const v1AccountUpdate: TypesV1.AccountUpdate = { setPermissions: V1Auth.Proof, setVerificationKey: { auth: V1Auth.Signature, - txnVersion: new UInt32(3), + txnVersion: new UInt32(protocolVersions.txnVersion), }, setZkappUri: V1Auth.Signature, editActionState: V1Auth.Proof, @@ -401,7 +402,9 @@ const v2AccountUpdate: Authorized = new Authorized( pushEvents: events, pushActions: actions, setState: new GenericStateUpdates( - new Array(ZkappConstants.MAX_ZKAPP_STATE_FIELDS).fill(Update.set(new Field(8))) + new Array(ZkappConstants.MAX_ZKAPP_STATE_FIELDS).fill( + Update.set(new Field(ZkappConstants.MAX_ZKAPP_STATE_FIELDS)) + ) ), setDelegate: publicKey, setVerificationKey: verificationKey, diff --git a/src/mina b/src/mina index a4462af0c8..25697d4a10 160000 --- a/src/mina +++ b/src/mina @@ -1 +1 @@ -Subproject commit a4462af0c86fe1229ff89a2b1477a809dee66789 +Subproject commit 25697d4a1083e280eea2964e501064f3ab2a49af diff --git a/tests/vk-regression/vk-regression.json b/tests/vk-regression/vk-regression.json index 6dcd3c8a41..7a295c989d 100644 --- a/tests/vk-regression/vk-regression.json +++ b/tests/vk-regression/vk-regression.json @@ -26,116 +26,116 @@ } }, "Voting_": { - "digest": "2d12b9235eac7fe8188447969463455160abb01ddd682efdd4147fe28fc8c608", + "digest": "3e9d12f7ba0d0cf88fb46d1342283cc9ad52df1b319373ca45b5206e2c6c7613", "methods": { "voterRegistration": { - "rows": 1184, - "digest": "9c062fcec57d40cb66449114c4d47492" + "rows": 2096, + "digest": "20a44c4c72802f22ccb611e759d1644e" }, "candidateRegistration": { - "rows": 1184, - "digest": "00a85f550b1e9992343b98337ee084e7" + "rows": 2096, + "digest": "8d5137ba06b15ecd4981c9de3835f13d" }, "approveRegistrations": { - "rows": 1158, - "digest": "a732d8dbfd1ce0f10e79dec743096b6a" + "rows": 2118, + "digest": "ee3bd2d5ec0501cf70830c4bc520f578" }, "vote": { - "rows": 1519, - "digest": "5049903802328e22481bb66e0d43c361" + "rows": 2479, + "digest": "cf5439b35fdf72c2c44ca1739d3b5827" }, "countVotes": { - "rows": 5780, - "digest": "ae311805b235c1fc4f2a6be2ab8e48bf" + "rows": 6068, + "digest": "620c8a9ebae2852247471a6c241f0fef" } }, "verificationKey": { - "data": "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", - "hash": "27437878864324066193541841357831764187914631255091374032582117784044469374822" + "data": "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", + "hash": "26395776692899780597043590144371322637314337400401653271692949608061456353203" } }, "Membership_": { - "digest": "2dcddd890f32e12d56469f8e1cf25706d9b7c83f12342ade821aff42f18f53e9", + "digest": "22ba41a10934cb1c22d578a53d2119546e297f74c62cbe71fd9701107ca479f", "methods": { "addEntry": { - "rows": 5522, - "digest": "d6f8fe5b934d1e70fabbf057f33feee5" + "rows": 6098, + "digest": "ef5628ff507886840acc772caa77876c" }, "isMember": { - "rows": 430, - "digest": "c77a92337b58bdee792dd60f826a4229" + "rows": 718, + "digest": "72670c241fb1bc707a756e2f98e650a7" }, "publish": { - "rows": 693, - "digest": "e8770d3ceb53359de268c6f7e7cf376a" + "rows": 981, + "digest": "1b29449c9bc8450a61072c7a79978358" } }, "verificationKey": { - "data": "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", - "hash": "23237763983687068954823895753644027624739762898150277419893699662082246025519" + "data": "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", + "hash": "26168398380578471808229298244103389692064700020353447248053929143953280523727" } }, "HelloWorld": { - "digest": "309ebdd97930d6c753207d62c84147fe540f62d1623a1251f1d0b4f5f8bd400d", + "digest": "20e2f574f6f7b84a60bdaa3144a771d05ef9fd7fce97ce2d33268c2b84563bfa", "methods": { "update": { - "rows": 475, - "digest": "f1ace9d626cb47fb5612579a1a608fc5" + "rows": 762, + "digest": "b49ee5bb440c205c7b3257317d2fa5a7" } }, "verificationKey": { - "data": "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", - "hash": "4671417744577823084023376770685664948710807365406389658915321449520576005042" + "data": "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", + "hash": "25090107158536559479414498061440058422877110211341631598842612497397618206528" } }, "TokenContract": { - "digest": "37ad5c458b0b9f5a44650d16fe16200b3fafff89af0c3b4d0ad57eda5df05d54", + "digest": "24e4970719219554e59b3cfb556e2154461a901b013ea7fc76011b3a8c1069", "methods": { "init": { - "rows": 654, - "digest": "ffd967e8be9e5e221c4d1c848751e7d6" + "rows": 1230, + "digest": "28f00d8f53a629248f61c50f847ace99" }, "init2": { - "rows": 651, - "digest": "9392237b6907f8d3d4a97d6102fa8749" + "rows": 1227, + "digest": "b0bfb90198ab35ea249cc779efb84be5" }, "approveBase": { - "rows": 6175, - "digest": "d94976313c552b9d141ce08a5944614f" + "rows": 9703, + "digest": "ffcbc183607fa2d8846bbd553001cbaa" } }, "verificationKey": { - "data": "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", - "hash": "2386312370598084297644392331299865994053077982449046510523145757144787156250" + "data": "AADnPH7zPue347Wo3oNt/8b3xHU8uVKkn5XNRRDPiY/KH7I1DN1b2gilH6Y4yyPwl6mp23vZt9MFl+QMJQBTvcAahS9xkBcfxRTAAMBHXhf8KDkK39AalVocKIrfWMV0MSShinj0bCxPCc10K0cya4Voy8fud4+hktDOuwjaAstpEJSbKRHMIki77xHmJWlFUYdkgPg30MU4Ta3ev/h+mcMWmofyhLSQqUbaV6hM95n3Y0Wcn2LRNxJP8TRwHndIcylleqPsGMh3P+A+N9c32N4kl29nreMJJdcUrCXK90GLPAFOB9mHIjKk9+9o3eZc3cGQ+jppXoN3zwO91DeT/GYvXqCZTAudLxIwuJU11UBThG5CKKABa9ulQ1bYGXj9Eydy0vPxfojDeFrnKMi9GKSjiSMzmOLbIw7Dt+g9ggjsHOKm4039zdOyAgYVvlUxrsxWoHR4L0925Cxcu8aWyQs2GTmVl73Fasa9dYaNrIkW0VZsPGp1l8+jAdEvbsPXrT+qFXBtHaN45PMWCyBx0TKaozETCmv0kA5KGTzesYQCECPQ8F2DM+oXz8xly+z9/Ypt/Zx9NvF7wute/1s6Q/QuAF8z6PLi0aorpubnsjYhxVUAzRbwtgFnwO5z/n8LfMg/rEGBRRHyPp22q3fgINofhGab/BwqheokFf9MW4IYnxlW9tFMt+wjpebqrgW1oGsxjsJ8VwDV6rUmjuk5yNWvHwdtZ1phyFP7kbyUnCpjITIk2rXgPyGdblvh9xcV+P4aEBXWMCQE5kfK476bQgrLeKJfQ45PZfgB688DGwaYAxWbcxBV822/aAsA55ijFY1Xf7S+DiytY4a/u0bellKMDUQqTOq9VwmbDv868zXscUwKpNVR3wy2En/q9M/HJJc4BZyuuQvlQSR59m0gL4hKHf5Dci/YVvM6ACHmg+5SxCr1pUNKbyy2lsIa5Ma40ZmsTpT4/lQczmGENQSQXA9bFibT0Q+Vj885p9heLOCCXyAujC4DhAdYmT1MQ7v4IxckhFB7NmmeolWhe0n5+pJGlKygYXLplpZTprs6/Q56xRUEyr56MRD+OEdy4v+40J6EwhYs7eoYm1J/NxGcX9R2CkWTMB33n/RWLDePqeJTPWwZ2SowNPt/+rZD3glK2v0H197KP9bZS7sEHqlv7js0uqn0qWjdN+RADRAEUMPKixv6l24QrqQAp0ebGEbpXqv21bhlr6dYBsculE2VU9SuGJ2g6yuuKf4+lfJ2V5TkIxFvlgw5cxTXNQ010JYug38++ZDV+MibXPzg+cODE5wfZ3jon5wVNkAiG642DzXzNj67x80zBWLdt3UKnFZs9dpa1fYpTjlJg8T+dnJJiKf2IvmvF8xyi1HAwAFyhDL2dn/w/pDE2Kl9QdpZpQYDEBQgCCkegsZszQ+2mjxU9pLXzz5GSoqz8jABW5Qo3abBAhvYKKaAs6NoRgeAD6SadFDbQmXaftE+Y1MVOtjnaZDUBdwahWiJMlkfZpxW1aubEc/GSX8WzCZ8h9HeakcRc7kcN0CR8kmfER3eiZ2JMbt5cQl/afNjwGGAmeXzTaR34AgFjiw/RlZJkhYm9jyf18M8yP94QGBMxd6Y6wrNvOmJHzEnp8aitJsDlZklm8LKbjumlSbLcbBokpIDhFBBKfwP2qsQX7eHLCZ/3mztoFKoIiYXgrHWG8m2SzIJ/ljn6Rg7AxIsPjzZyEw1eXAOC7A1FCT/757ygMsnk+rLlpDTBYLmhJtQdt61MQFDi5BuCmQ/PY9C/74/k4APl5htiNcCZty/1JElFwjuCQFjvAiMPUMyqp7/ALFapsTZqhSs1g6jd8uhuJoTNEqLDvKUUbs0kMvGy8BOG0YXNxmNccabGwBzxmijv6LF/Xinecl4aD8FCh6opY98TJnOHd3XSYL1DbLqmmc6CXEM+g5iDGnXr/CkI2Jy37OkF8X03jz4AH0Yj0+J63yH4IS+PrNpKZEXKh7PvXNaLGGKsFcKEi63/xKPKH0G4RzvFKbkp+IWqtIYjMiwIJMwzmfS1NLLXqqpFiD364eFcXINR2rrDKcoTUp1JkVZVfXfKwaRUPWSGFYIYMtwPh2w8ZfubAmXZFpyzstORhFyg9rtVAAy0lcDhQwWVlhFFkR2qbdoy0EFLBrfKqUIkd1N6vDQQYL1RGaTAv/ybregrJsFo+VP3ZatlR6LnKYWp1m7vPkGm3I6Pus/mvp1k10QGk8nhFuR31DjsG3lzZ4gXSs1oSv0qbxD2S6g5+Y6cPbITEGX3uQjsunXnQ9PHd22Mk+fqbDakTiCJh6aFqqPNShiAXkGSuC1oXJHX3zqnbn75dWO0UVhBNAbjYkSnQeyka1wnZb12sR+PlRMvWQVcd93t5L/FiE0ORo=", + "hash": "1966015567654002132221649867760155775338749565055788652245071378689257341079" } }, "Dex": { - "digest": "fee88991bcc3331978a787642273ee02cbfc738949c6daad38c3bab65a8e81e", + "digest": "2c89e730fc5fbdb95ddf567c70d84741d5febd3336e28d3cf270e25fc31f9cfc", "methods": { "approveBase": { - "rows": 6175, - "digest": "d94976313c552b9d141ce08a5944614f" + "rows": 9703, + "digest": "ffcbc183607fa2d8846bbd553001cbaa" }, "supplyLiquidityBase": { - "rows": 2872, - "digest": "532a9120613a7204a72c74769f77f7c0" + "rows": 5272, + "digest": "344a6ee9aacb32f5704195748042b064" }, "swapX": { - "rows": 1532, - "digest": "c4f96b4cfded7cae567c8bc674ffd18d" + "rows": 2780, + "digest": "8e9e89731ea8f4eb1b135b635a7d25e1" }, "swapY": { - "rows": 1532, - "digest": "60d123f69c83b6a2a6a6559bf38b5d44" + "rows": 2780, + "digest": "881eb758a458d6975ebdf1dfc77ea27c" }, "burnLiquidity": { - "rows": 706, - "digest": "a79619c4968cf4128de1f6a94050ef9b" + "rows": 1282, + "digest": "66112257d2abc7cee86185b30bb3094b" } }, "verificationKey": { - "data": "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", - "hash": "23293837307354662555409403475746980862701324192337247238720431981639881295675" + "data": "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", + "hash": "2163297567969879975569441332957386228731686796440317341945941408542506939228" } }, "Group Primitive": { @@ -351,7 +351,7 @@ } }, "diverse": { - "digest": "e5400cb7967d5a1f41e41b0ea0b5ef59b90591fc9e22149e2ce71de32261326", + "digest": "1d94bb0a2587732e135a1b0425e3e7f41728fdc5e43c0f5bec2f6bff87dab79c", "methods": { "ecdsa": { "rows": 31723, @@ -366,8 +366,8 @@ "digest": "6ee38bce85ca4c6a852fdbe25bf096a9" }, "poseidon": { - "rows": 948, - "digest": "7dc8bce23975131f24b2cc5fcd5c4a89" + "rows": 1308, + "digest": "bbf7ae4683cf0be5e7fadd9434120cb2" }, "recursive": { "rows": 0, @@ -379,8 +379,8 @@ } }, "verificationKey": { - "data": "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", - "hash": "26053084572745389914185726729042857861021340677815758381460290889046876924343" + "data": "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", + "hash": "17479402598658352899743586428917322159115691660397458577673281338036010815138" } }, "mainProgram": {