Skip to content
This repository has been archived by the owner on Feb 8, 2025. It is now read-only.

Z 325 full sim #281

Merged
merged 2 commits into from
Aug 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
144 changes: 72 additions & 72 deletions api/dbschema/edgeql-js/__spec__.ts

Large diffs are not rendered by default.

207 changes: 108 additions & 99 deletions api/dbschema/edgeql-js/modules/default.ts

Large diffs are not rendered by default.

9 changes: 5 additions & 4 deletions api/dbschema/edgeql-js/modules/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -696,7 +696,6 @@ export type $ObjectTypeλShape = $.typeutil.flatten<$SourceλShape & Omit<$Consi
"<__type__[is ProposalResponse]": $.LinkDesc<_default.$ProposalResponse, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Approval]": $.LinkDesc<_default.$Approval, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Proposal]": $.LinkDesc<_default.$Proposal, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Simulation]": $.LinkDesc<_default.$Simulation, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is ApproverDetails]": $.LinkDesc<_default.$ApproverDetails, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Message]": $.LinkDesc<_default.$Message, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Operation]": $.LinkDesc<_default.$Operation, $.Cardinality.Many, {}, false, false, false, false>;
Expand All @@ -705,34 +704,36 @@ export type $ObjectTypeλShape = $.typeutil.flatten<$SourceλShape & Omit<$Consi
"<__type__[is Token]": $.LinkDesc<_default.$Token, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Approver]": $.LinkDesc<_default.$Approver, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is current_approver]": $.LinkDesc<_default.$current_approver, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is OptimisticSuccess]": $.LinkDesc<_default.$OptimisticSuccess, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is User]": $.LinkDesc<_default.$User, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is current_user]": $.LinkDesc<_default.$current_user, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Contact]": $.LinkDesc<_default.$Contact, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is GlobalLabel]": $.LinkDesc<_default.$GlobalLabel, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Event]": $.LinkDesc<_default.$Event, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Transferlike]": $.LinkDesc<_default.$Transferlike, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Transfer]": $.LinkDesc<_default.$Transfer, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Contract]": $.LinkDesc<_default.$Contract, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is TransferApproval]": $.LinkDesc<_default.$TransferApproval, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Rejection]": $.LinkDesc<_default.$Rejection, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is ActionFunction]": $.LinkDesc<_default.$ActionFunction, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Action]": $.LinkDesc<_default.$Action, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is TransferLimit]": $.LinkDesc<_default.$TransferLimit, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is TransfersConfig]": $.LinkDesc<_default.$TransfersConfig, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is PolicyState]": $.LinkDesc<_default.$PolicyState, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Contract]": $.LinkDesc<_default.$Contract, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Policy]": $.LinkDesc<_default.$Policy, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is RemovedPolicy]": $.LinkDesc<_default.$RemovedPolicy, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Failure]": $.LinkDesc<_default.$Failure, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Result]": $.LinkDesc<_default.$Result, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Confirmed]": $.LinkDesc<_default.$Confirmed, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is OptimisticSuccess]": $.LinkDesc<_default.$OptimisticSuccess, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Failure]": $.LinkDesc<_default.$Failure, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is ConfirmedFailure]": $.LinkDesc<_default.$ConfirmedFailure, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Success]": $.LinkDesc<_default.$Success, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is ConfirmedSuccess]": $.LinkDesc<_default.$ConfirmedSuccess, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Scheduled]": $.LinkDesc<_default.$Scheduled, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is PaymasterFees]": $.LinkDesc<_default.$PaymasterFees, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is SystemTx]": $.LinkDesc<_default.$SystemTx, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is SimulatedFailure]": $.LinkDesc<_default.$SimulatedFailure, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is Function]": $.LinkDesc<_default.$Function, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__[is SimulatedSuccess]": $.LinkDesc<_default.$SimulatedSuccess, $.Cardinality.Many, {}, false, false, false, false>;
"<__type__": $.LinkDesc<$.ObjectType, $.Cardinality.Many, {}, false, false, false, false>;
"<intersection_of": $.LinkDesc<$.ObjectType, $.Cardinality.Many, {}, false, false, false, false>;
"<subject": $.LinkDesc<$.ObjectType, $.Cardinality.Many, {}, false, false, false, false>;
Expand Down
22 changes: 9 additions & 13 deletions api/dbschema/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,20 +140,19 @@ export namespace $default {
"events": Event[];
"transfers": Transfer[];
"systx"?: SystemTx | null;
"response": string;
"gasUsed": bigint;
}
export interface Confirmed extends Result {
"block": bigint;
"ethFeePerGas": string;
"gasUsed": bigint;
"networkEthFee": string;
}
export interface Failure extends Result {
"reason"?: string | null;
}
export interface ConfirmedFailure extends Confirmed, Failure {}
export interface Success extends Result {
"response"?: string | null;
}
export interface Success extends Result {}
export interface ConfirmedSuccess extends Confirmed, Success {}
export interface UserLabelled extends Labelled {}
export interface Contact extends UserLabelled {
Expand Down Expand Up @@ -242,12 +241,8 @@ export namespace $default {
"cancelled": boolean;
"scheduledFor": Date;
}
export interface Simulation extends std.$Object {
"responses": string[];
"success": boolean;
"timestamp": Date;
"transfers": Transfer[];
}
export interface SimulatedFailure extends Failure {}
export interface SimulatedSuccess extends Success {}
export interface SystemTx extends std.$Object {
"proposal": Transaction;
"maxEthFeePerGas": string;
Expand Down Expand Up @@ -277,7 +272,6 @@ export namespace $default {
"executable": boolean;
"unorderedOperations": Operation[];
"operations": Operation[];
"simulation"?: Simulation | null;
"paymaster": string;
"feeToken": Token;
"maxAmountFp": bigint;
Expand Down Expand Up @@ -357,7 +351,8 @@ export type Policy = $default.Policy;
export type Rejection = $default.Rejection;
export type RemovedPolicy = $default.RemovedPolicy;
export type Scheduled = $default.Scheduled;
export type Simulation = $default.Simulation;
export type SimulatedFailure = $default.SimulatedFailure;
export type SimulatedSuccess = $default.SimulatedSuccess;
export type SystemTx = $default.SystemTx;
export type Token = $default.Token;
export type Transaction = $default.Transaction;
Expand Down Expand Up @@ -664,7 +659,8 @@ export interface types {
"Rejection": $default.Rejection;
"RemovedPolicy": $default.RemovedPolicy;
"Scheduled": $default.Scheduled;
"Simulation": $default.Simulation;
"SimulatedFailure": $default.SimulatedFailure;
"SimulatedSuccess": $default.SimulatedSuccess;
"SystemTx": $default.SystemTx;
"Token": $default.Token;
"Transaction": $default.Transaction;
Expand Down
44 changes: 44 additions & 0 deletions api/dbschema/migrations/00002-m1puzhz.edgeql
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
CREATE MIGRATION m1b4kmwwkkxbx7nv3ze7u3c5td4y35hzgyinz422ny3npt4jpkcc3a
ONTO m1vh7caqxl35lle7od4cqf4gaeabpurttipgns3nylfnnnzjb2bbqa
{
ALTER TYPE default::Simulation {
DROP PROPERTY responses;
DROP LINK transfers;
DROP PROPERTY success;
DROP PROPERTY timestamp;
};
ALTER TYPE default::Confirmed {
ALTER PROPERTY gasUsed {
DROP CONSTRAINT std::min_value(0);
};
};
ALTER TYPE default::Confirmed {
DROP PROPERTY networkEthFee;
};
ALTER TYPE default::Confirmed {
DROP PROPERTY gasUsed;
};
ALTER TYPE default::Success {
DROP PROPERTY response;
};
ALTER TYPE default::Result {
CREATE REQUIRED PROPERTY response: default::Bytes {
SET default := '0x';
};
};
CREATE TYPE default::SimulatedFailure EXTENDING default::Failure;
CREATE TYPE default::SimulatedSuccess EXTENDING default::Success;
ALTER TYPE default::Transaction {
DROP LINK simulation;
};
DROP TYPE default::Simulation;
ALTER TYPE default::Result {
CREATE REQUIRED PROPERTY gasUsed: std::bigint {
SET REQUIRED USING (<std::bigint>0n);
CREATE CONSTRAINT std::min_value(0);
};
};
ALTER TYPE default::Confirmed {
CREATE REQUIRED PROPERTY networkEthFee := ((.ethFeePerGas * .gasUsed));
};
};
22 changes: 7 additions & 15 deletions api/dbschema/transaction.esdl
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ module default {
on source delete delete target;
default := (insert PaymasterFees {});
}
simulation: Simulation { constraint exclusive; on target delete deferred restrict; }
required executable: bool { default := false; }
multi link systxs := .<proposal[is SystemTx];
link systx: SystemTx { constraint exclusive; } # Latest .timestamp
Expand All @@ -47,16 +46,6 @@ module default {
);
}

type Simulation {
required success: bool;
required responses: array<Bytes>;
multi transfers: Transfer {
constraint exclusive;
on source delete delete target;
}
required timestamp: datetime { default := datetime_of_statement(); }
}

type SystemTx {
required hash: Bytes32 { constraint exclusive; }
required proposal: Transaction;
Expand Down Expand Up @@ -85,6 +74,8 @@ module default {
abstract type Result {
required transaction: Transaction;
systx: SystemTx;
required response: Bytes { default := '0x'; }
required gasUsed: bigint { constraint min_value(0); }
required timestamp: datetime { default := datetime_of_statement(); }
multi link events := .<result[is Event];
multi link transfers := .events[is Transfer];
Expand All @@ -94,19 +85,20 @@ module default {
);
}

abstract type Success extending Result {
response: Bytes;
}
abstract type Success extending Result {}

abstract type Failure extending Result {
reason: str;
}

type SimulatedSuccess extending Success {}

type SimulatedFailure extending Failure {}

type OptimisticSuccess extending Success {}

abstract type Confirmed extending Result {
required block: bigint { constraint min_value(0); }
required gasUsed: bigint { constraint min_value(0); }
required ethFeePerGas: decimal { constraint min_value(0); }
required property networkEthFee := .ethFeePerGas * .gasUsed;
}
Expand Down
102 changes: 102 additions & 0 deletions api/src/core/networks/encodeEventData.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import { ExtractAbiEvent, ExtractAbiEvents } from 'abitype';
import {
Abi,
AbiEventNotFoundError,
AbiEventParametersToPrimitiveTypes,
ContractEventName,
encodeAbiParameters,
encodeEventTopics,
EncodeEventTopicsErrorType,
getAbiItem,
Hex,
} from 'viem';
import { IsNarrowable, UnionEvaluate } from 'viem/_types/types/utils';

const docsPath = '/docs/contract/encodeEventTopics';

export type EncodeEventDataErrorType = EncodeEventTopicsErrorType;

type ContractEventArgs<
abi extends Abi | readonly unknown[] = Abi,
eventName extends ContractEventName<abi> = ContractEventName<abi>,
> =
AbiEventParametersToPrimitiveTypes<
ExtractAbiEvent<abi extends Abi ? abi : Abi, eventName>['inputs'],
{ IndexedOnly: false }
> extends infer args
? [args] extends [never]
? readonly unknown[] | Record<string, unknown>
: args
: readonly unknown[] | Record<string, unknown>;

export type EncodeEventDataParameters<
abi extends Abi | readonly unknown[] = Abi,
eventName extends ContractEventName<abi> | undefined = ContractEventName<abi>,
///
hasEvents = abi extends Abi
? Abi extends abi
? true
: [ExtractAbiEvents<abi>] extends [never]
? false
: true
: true,
allArgs = ContractEventArgs<
abi,
eventName extends ContractEventName<abi> ? eventName : ContractEventName<abi>
>,
allErrorNames = ContractEventName<abi>,
> = {
abi: abi;
args?: allArgs | undefined;
} & UnionEvaluate<
IsNarrowable<abi, Abi> extends true
? abi['length'] extends 1
? { eventName?: eventName | allErrorNames | undefined }
: { eventName: eventName | allErrorNames }
: { eventName?: eventName | allErrorNames | undefined }
> &
(hasEvents extends true ? unknown : never);

export function encodeEventData<
const abi extends Abi | readonly unknown[],
eventName extends ContractEventName<abi> | undefined = undefined,
>(parameters: EncodeEventDataParameters<abi, eventName>): Hex {
const { abi, eventName, args } = parameters as EncodeEventDataParameters;

let abiItem = abi[0];
if (eventName) {
const item = getAbiItem({ abi, name: eventName });
if (!item) throw new AbiEventNotFoundError(eventName, { docsPath });
abiItem = item;
}

if (abiItem.type !== 'event') throw new AbiEventNotFoundError(undefined, { docsPath });
if (!(args && 'inputs' in abiItem)) return '0x';

const nonIndexedParams = abiItem.inputs?.filter(
(param) => !('indexed' in param && param.indexed),
);

const nonIndexedArgs = Array.isArray(args)
? args
: Object.entries(args)
.filter(([aName]) => nonIndexedParams.find((v) => v.name === aName))
.sort(
([aName], [bName]) =>
nonIndexedParams.findIndex((v) => v.name === aName) -
nonIndexedParams.findIndex((v) => v.name === bName),
)
.map(([, v]) => v);

return encodeAbiParameters(nonIndexedParams, nonIndexedArgs);
}

export function encodeEventTopicsAndData<
const abi extends Abi | readonly unknown[],
eventName extends ContractEventName<abi> | undefined = undefined,
>(parameters: EncodeEventDataParameters<abi, eventName>) {
return {
topics: encodeEventTopics(parameters),
data: encodeEventData(parameters),
};
}
Loading
Loading