@account-kit/wallet-client 0.0.1-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/abi/LightAccountFactoryAbi_V1_0_1.d.ts +55 -0
- package/dist/esm/abi/LightAccountFactoryAbi_V1_0_1.js +45 -0
- package/dist/esm/abi/LightAccountFactoryAbi_V1_0_1.js.map +1 -0
- package/dist/esm/abi/LightAccountFactoryAbi_V1_0_2.d.ts +55 -0
- package/dist/esm/abi/LightAccountFactoryAbi_V1_0_2.js +45 -0
- package/dist/esm/abi/LightAccountFactoryAbi_V1_0_2.js.map +1 -0
- package/dist/esm/abi/LightAccountFactoryAbi_V1_1_0.d.ts +55 -0
- package/dist/esm/abi/LightAccountFactoryAbi_V1_1_0.js +45 -0
- package/dist/esm/abi/LightAccountFactoryAbi_V1_1_0.js.map +1 -0
- package/dist/esm/abi/LightAccountFactoryAbi_V2_0_0.d.ts +256 -0
- package/dist/esm/abi/LightAccountFactoryAbi_V2_0_0.js +202 -0
- package/dist/esm/abi/LightAccountFactoryAbi_V2_0_0.js.map +1 -0
- package/dist/esm/abi/ModularAccountFactoryAbi_V2_0_0.d.ts +492 -0
- package/dist/esm/abi/ModularAccountFactoryAbi_V2_0_0.js +399 -0
- package/dist/esm/abi/ModularAccountFactoryAbi_V2_0_0.js.map +1 -0
- package/dist/esm/abi/MultiOwnerLightAccountFactoryAbi_V2_0_0.d.ts +286 -0
- package/dist/esm/abi/MultiOwnerLightAccountFactoryAbi_V2_0_0.js +225 -0
- package/dist/esm/abi/MultiOwnerLightAccountFactoryAbi_V2_0_0.js.map +1 -0
- package/dist/esm/abi/MultiOwnerModularAccountFactoryAbi_V1_0_0.d.ts +234 -0
- package/dist/esm/abi/MultiOwnerModularAccountFactoryAbi_V1_0_0.js +179 -0
- package/dist/esm/abi/MultiOwnerModularAccountFactoryAbi_V1_0_0.js.map +1 -0
- package/dist/esm/abi/MultisigModularAccountFactoryAbi_V1_0_0.d.ts +246 -0
- package/dist/esm/abi/MultisigModularAccountFactoryAbi_V1_0_0.js +182 -0
- package/dist/esm/abi/MultisigModularAccountFactoryAbi_V1_0_0.js.map +1 -0
- package/dist/esm/abi/index.d.ts +8 -0
- package/dist/esm/abi/index.js +9 -0
- package/dist/esm/abi/index.js.map +1 -0
- package/dist/esm/capabilities/index.d.ts +8 -0
- package/dist/esm/capabilities/index.js +8 -0
- package/dist/esm/capabilities/index.js.map +1 -0
- package/dist/esm/capabilities/paymaster.d.ts +3 -0
- package/dist/esm/capabilities/paymaster.js +5 -0
- package/dist/esm/capabilities/paymaster.js.map +1 -0
- package/dist/esm/capabilities/permissions/index.d.ts +98 -0
- package/dist/esm/capabilities/permissions/index.js +60 -0
- package/dist/esm/capabilities/permissions/index.js.map +1 -0
- package/dist/esm/capabilities/permissions/mav2.d.ts +36 -0
- package/dist/esm/capabilities/permissions/mav2.js +79 -0
- package/dist/esm/capabilities/permissions/mav2.js.map +1 -0
- package/dist/esm/client/actions/createAccount.d.ts +10 -0
- package/dist/esm/client/actions/createAccount.js +7 -0
- package/dist/esm/client/actions/createAccount.js.map +1 -0
- package/dist/esm/client/actions/getCallsStatus.d.ts +6 -0
- package/dist/esm/client/actions/getCallsStatus.js +7 -0
- package/dist/esm/client/actions/getCallsStatus.js.map +1 -0
- package/dist/esm/client/actions/grantPermissions.d.ts +13 -0
- package/dist/esm/client/actions/grantPermissions.js +11 -0
- package/dist/esm/client/actions/grantPermissions.js.map +1 -0
- package/dist/esm/client/actions/listAccounts.d.ts +6 -0
- package/dist/esm/client/actions/listAccounts.js +4 -0
- package/dist/esm/client/actions/listAccounts.js.map +1 -0
- package/dist/esm/client/actions/prepareCalls.d.ts +15 -0
- package/dist/esm/client/actions/prepareCalls.js +17 -0
- package/dist/esm/client/actions/prepareCalls.js.map +1 -0
- package/dist/esm/client/actions/requestAccount.d.ts +11 -0
- package/dist/esm/client/actions/requestAccount.js +28 -0
- package/dist/esm/client/actions/requestAccount.js.map +1 -0
- package/dist/esm/client/actions/sendPreparedCalls.d.ts +6 -0
- package/dist/esm/client/actions/sendPreparedCalls.js +8 -0
- package/dist/esm/client/actions/sendPreparedCalls.js.map +1 -0
- package/dist/esm/client/actions/signMessage.d.ts +6 -0
- package/dist/esm/client/actions/signMessage.js +7 -0
- package/dist/esm/client/actions/signMessage.js.map +1 -0
- package/dist/esm/client/actions/signSignatureRequest.d.ts +10 -0
- package/dist/esm/client/actions/signSignatureRequest.js +15 -0
- package/dist/esm/client/actions/signSignatureRequest.js.map +1 -0
- package/dist/esm/client/actions/signTypedData.d.ts +6 -0
- package/dist/esm/client/actions/signTypedData.js +7 -0
- package/dist/esm/client/actions/signTypedData.js.map +1 -0
- package/dist/esm/client/client.e2e-test.d.ts +1 -0
- package/dist/esm/client/client.e2e-test.js +238 -0
- package/dist/esm/client/client.e2e-test.js.map +1 -0
- package/dist/esm/client/decorator.d.ts +24 -0
- package/dist/esm/client/decorator.js +25 -0
- package/dist/esm/client/decorator.js.map +1 -0
- package/dist/esm/client/index.d.ts +18 -0
- package/dist/esm/client/index.js +43 -0
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/exports/index.d.ts +13 -0
- package/dist/esm/exports/index.js +18 -0
- package/dist/esm/exports/index.js.map +1 -0
- package/dist/esm/exports/internal.d.ts +13 -0
- package/dist/esm/exports/internal.js +15 -0
- package/dist/esm/exports/internal.js.map +1 -0
- package/dist/esm/isomorphic/actions/createSession.d.ts +14 -0
- package/dist/esm/isomorphic/actions/createSession.js +63 -0
- package/dist/esm/isomorphic/actions/createSession.js.map +1 -0
- package/dist/esm/isomorphic/actions/getCallsStatus.d.ts +21 -0
- package/dist/esm/isomorphic/actions/getCallsStatus.js +60 -0
- package/dist/esm/isomorphic/actions/getCallsStatus.js.map +1 -0
- package/dist/esm/isomorphic/actions/prepareCalls.d.ts +8 -0
- package/dist/esm/isomorphic/actions/prepareCalls.js +57 -0
- package/dist/esm/isomorphic/actions/prepareCalls.js.map +1 -0
- package/dist/esm/isomorphic/actions/sendPreparedCalls.d.ts +8 -0
- package/dist/esm/isomorphic/actions/sendPreparedCalls.js +43 -0
- package/dist/esm/isomorphic/actions/sendPreparedCalls.js.map +1 -0
- package/dist/esm/isomorphic/client.d.ts +97 -0
- package/dist/esm/isomorphic/client.js +30 -0
- package/dist/esm/isomorphic/client.js.map +1 -0
- package/dist/esm/isomorphic/utils/createAccount.d.ts +22 -0
- package/dist/esm/isomorphic/utils/createAccount.js +32 -0
- package/dist/esm/isomorphic/utils/createAccount.js.map +1 -0
- package/dist/esm/isomorphic/utils/createDummySigner.d.ts +3 -0
- package/dist/esm/isomorphic/utils/createDummySigner.js +17 -0
- package/dist/esm/isomorphic/utils/createDummySigner.js.map +1 -0
- package/dist/esm/isomorphic/utils/parsePermissionsContext.d.ts +20 -0
- package/dist/esm/isomorphic/utils/parsePermissionsContext.js +21 -0
- package/dist/esm/isomorphic/utils/parsePermissionsContext.js.map +1 -0
- package/dist/esm/local/client.d.ts +3 -0
- package/dist/esm/local/client.js +89 -0
- package/dist/esm/local/client.js.map +1 -0
- package/dist/esm/remote/client.d.ts +3 -0
- package/dist/esm/remote/client.js +42 -0
- package/dist/esm/remote/client.js.map +1 -0
- package/dist/esm/rpc/request.d.ts +329 -0
- package/dist/esm/rpc/request.js +194 -0
- package/dist/esm/rpc/request.js.map +1 -0
- package/dist/esm/rpc/schema.d.ts +319 -0
- package/dist/esm/rpc/schema.js +5 -0
- package/dist/esm/rpc/schema.js.map +1 -0
- package/dist/esm/schemas.d.ts +216 -0
- package/dist/esm/schemas.js +211 -0
- package/dist/esm/schemas.js.map +1 -0
- package/dist/esm/types.d.ts +27 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils.d.ts +4 -0
- package/dist/esm/utils.js +12 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/types/abi/LightAccountFactoryAbi_V1_0_1.d.ts +56 -0
- package/dist/types/abi/LightAccountFactoryAbi_V1_0_1.d.ts.map +1 -0
- package/dist/types/abi/LightAccountFactoryAbi_V1_0_2.d.ts +56 -0
- package/dist/types/abi/LightAccountFactoryAbi_V1_0_2.d.ts.map +1 -0
- package/dist/types/abi/LightAccountFactoryAbi_V1_1_0.d.ts +56 -0
- package/dist/types/abi/LightAccountFactoryAbi_V1_1_0.d.ts.map +1 -0
- package/dist/types/abi/LightAccountFactoryAbi_V2_0_0.d.ts +257 -0
- package/dist/types/abi/LightAccountFactoryAbi_V2_0_0.d.ts.map +1 -0
- package/dist/types/abi/ModularAccountFactoryAbi_V2_0_0.d.ts +493 -0
- package/dist/types/abi/ModularAccountFactoryAbi_V2_0_0.d.ts.map +1 -0
- package/dist/types/abi/MultiOwnerLightAccountFactoryAbi_V2_0_0.d.ts +287 -0
- package/dist/types/abi/MultiOwnerLightAccountFactoryAbi_V2_0_0.d.ts.map +1 -0
- package/dist/types/abi/MultiOwnerModularAccountFactoryAbi_V1_0_0.d.ts +235 -0
- package/dist/types/abi/MultiOwnerModularAccountFactoryAbi_V1_0_0.d.ts.map +1 -0
- package/dist/types/abi/MultisigModularAccountFactoryAbi_V1_0_0.d.ts +247 -0
- package/dist/types/abi/MultisigModularAccountFactoryAbi_V1_0_0.d.ts.map +1 -0
- package/dist/types/abi/index.d.ts +9 -0
- package/dist/types/abi/index.d.ts.map +1 -0
- package/dist/types/capabilities/index.d.ts +9 -0
- package/dist/types/capabilities/index.d.ts.map +1 -0
- package/dist/types/capabilities/paymaster.d.ts +4 -0
- package/dist/types/capabilities/paymaster.d.ts.map +1 -0
- package/dist/types/capabilities/permissions/index.d.ts +99 -0
- package/dist/types/capabilities/permissions/index.d.ts.map +1 -0
- package/dist/types/capabilities/permissions/mav2.d.ts +37 -0
- package/dist/types/capabilities/permissions/mav2.d.ts.map +1 -0
- package/dist/types/client/actions/createAccount.d.ts +11 -0
- package/dist/types/client/actions/createAccount.d.ts.map +1 -0
- package/dist/types/client/actions/getCallsStatus.d.ts +7 -0
- package/dist/types/client/actions/getCallsStatus.d.ts.map +1 -0
- package/dist/types/client/actions/grantPermissions.d.ts +14 -0
- package/dist/types/client/actions/grantPermissions.d.ts.map +1 -0
- package/dist/types/client/actions/listAccounts.d.ts +7 -0
- package/dist/types/client/actions/listAccounts.d.ts.map +1 -0
- package/dist/types/client/actions/prepareCalls.d.ts +16 -0
- package/dist/types/client/actions/prepareCalls.d.ts.map +1 -0
- package/dist/types/client/actions/requestAccount.d.ts +12 -0
- package/dist/types/client/actions/requestAccount.d.ts.map +1 -0
- package/dist/types/client/actions/sendPreparedCalls.d.ts +7 -0
- package/dist/types/client/actions/sendPreparedCalls.d.ts.map +1 -0
- package/dist/types/client/actions/signMessage.d.ts +7 -0
- package/dist/types/client/actions/signMessage.d.ts.map +1 -0
- package/dist/types/client/actions/signSignatureRequest.d.ts +11 -0
- package/dist/types/client/actions/signSignatureRequest.d.ts.map +1 -0
- package/dist/types/client/actions/signTypedData.d.ts +7 -0
- package/dist/types/client/actions/signTypedData.d.ts.map +1 -0
- package/dist/types/client/client.e2e-test.d.ts +2 -0
- package/dist/types/client/client.e2e-test.d.ts.map +1 -0
- package/dist/types/client/decorator.d.ts +25 -0
- package/dist/types/client/decorator.d.ts.map +1 -0
- package/dist/types/client/index.d.ts +19 -0
- package/dist/types/client/index.d.ts.map +1 -0
- package/dist/types/exports/index.d.ts +14 -0
- package/dist/types/exports/index.d.ts.map +1 -0
- package/dist/types/exports/internal.d.ts +14 -0
- package/dist/types/exports/internal.d.ts.map +1 -0
- package/dist/types/isomorphic/actions/createSession.d.ts +15 -0
- package/dist/types/isomorphic/actions/createSession.d.ts.map +1 -0
- package/dist/types/isomorphic/actions/getCallsStatus.d.ts +22 -0
- package/dist/types/isomorphic/actions/getCallsStatus.d.ts.map +1 -0
- package/dist/types/isomorphic/actions/prepareCalls.d.ts +9 -0
- package/dist/types/isomorphic/actions/prepareCalls.d.ts.map +1 -0
- package/dist/types/isomorphic/actions/sendPreparedCalls.d.ts +9 -0
- package/dist/types/isomorphic/actions/sendPreparedCalls.d.ts.map +1 -0
- package/dist/types/isomorphic/client.d.ts +98 -0
- package/dist/types/isomorphic/client.d.ts.map +1 -0
- package/dist/types/isomorphic/utils/createAccount.d.ts +23 -0
- package/dist/types/isomorphic/utils/createAccount.d.ts.map +1 -0
- package/dist/types/isomorphic/utils/createDummySigner.d.ts +4 -0
- package/dist/types/isomorphic/utils/createDummySigner.d.ts.map +1 -0
- package/dist/types/isomorphic/utils/parsePermissionsContext.d.ts +21 -0
- package/dist/types/isomorphic/utils/parsePermissionsContext.d.ts.map +1 -0
- package/dist/types/local/client.d.ts +4 -0
- package/dist/types/local/client.d.ts.map +1 -0
- package/dist/types/remote/client.d.ts +4 -0
- package/dist/types/remote/client.d.ts.map +1 -0
- package/dist/types/rpc/request.d.ts +330 -0
- package/dist/types/rpc/request.d.ts.map +1 -0
- package/dist/types/rpc/schema.d.ts +320 -0
- package/dist/types/rpc/schema.d.ts.map +1 -0
- package/dist/types/schemas.d.ts +217 -0
- package/dist/types/schemas.d.ts.map +1 -0
- package/dist/types/types.d.ts +28 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/utils.d.ts +5 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/package.json +67 -0
- package/src/abi/LightAccountFactoryAbi_V1_0_1.ts +44 -0
- package/src/abi/LightAccountFactoryAbi_V1_0_2.ts +44 -0
- package/src/abi/LightAccountFactoryAbi_V1_1_0.ts +44 -0
- package/src/abi/LightAccountFactoryAbi_V2_0_0.ts +201 -0
- package/src/abi/ModularAccountFactoryAbi_V2_0_0.ts +398 -0
- package/src/abi/MultiOwnerLightAccountFactoryAbi_V2_0_0.ts +224 -0
- package/src/abi/MultiOwnerModularAccountFactoryAbi_V1_0_0.ts +178 -0
- package/src/abi/MultisigModularAccountFactoryAbi_V1_0_0.ts +181 -0
- package/src/abi/index.ts +8 -0
- package/src/capabilities/index.ts +11 -0
- package/src/capabilities/paymaster.ts +5 -0
- package/src/capabilities/permissions/index.ts +124 -0
- package/src/capabilities/permissions/mav2.ts +127 -0
- package/src/client/actions/createAccount.ts +28 -0
- package/src/client/actions/getCallsStatus.ts +29 -0
- package/src/client/actions/grantPermissions.ts +48 -0
- package/src/client/actions/listAccounts.ts +18 -0
- package/src/client/actions/prepareCalls.ts +55 -0
- package/src/client/actions/requestAccount.ts +71 -0
- package/src/client/actions/sendPreparedCalls.ts +23 -0
- package/src/client/actions/signMessage.ts +32 -0
- package/src/client/actions/signSignatureRequest.ts +34 -0
- package/src/client/actions/signTypedData.ts +32 -0
- package/src/client/client.e2e-test.ts +294 -0
- package/src/client/decorator.ts +102 -0
- package/src/client/index.ts +93 -0
- package/src/exports/index.ts +32 -0
- package/src/exports/internal.ts +16 -0
- package/src/isomorphic/actions/createSession.ts +116 -0
- package/src/isomorphic/actions/getCallsStatus.ts +98 -0
- package/src/isomorphic/actions/prepareCalls.ts +99 -0
- package/src/isomorphic/actions/sendPreparedCalls.ts +95 -0
- package/src/isomorphic/client.ts +81 -0
- package/src/isomorphic/utils/createAccount.ts +58 -0
- package/src/isomorphic/utils/createDummySigner.ts +26 -0
- package/src/isomorphic/utils/parsePermissionsContext.ts +33 -0
- package/src/local/client.ts +132 -0
- package/src/remote/client.ts +67 -0
- package/src/rpc/request.ts +258 -0
- package/src/rpc/schema.ts +40 -0
- package/src/schemas.ts +257 -0
- package/src/types.ts +60 -0
- package/src/utils.ts +13 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type Address,
|
|
3
|
+
type Hex,
|
|
4
|
+
type IsUndefined,
|
|
5
|
+
type JsonRpcAccount,
|
|
6
|
+
toHex,
|
|
7
|
+
} from "viem";
|
|
8
|
+
import type { InnerWalletApiClient } from "../../types";
|
|
9
|
+
import type { SmartAccountSigner } from "@aa-sdk/core";
|
|
10
|
+
import type { CreateSessionParams } from "../../isomorphic/actions/createSession";
|
|
11
|
+
|
|
12
|
+
export type GrantPermissionsParams<
|
|
13
|
+
TAccount extends JsonRpcAccount<Address> | undefined =
|
|
14
|
+
| JsonRpcAccount<Address>
|
|
15
|
+
| undefined,
|
|
16
|
+
> = Omit<CreateSessionParams, "account" | "chainId"> &
|
|
17
|
+
(IsUndefined<TAccount> extends true
|
|
18
|
+
? { account: Address }
|
|
19
|
+
: { account?: never });
|
|
20
|
+
|
|
21
|
+
export type GrantPermissionsResult = {
|
|
22
|
+
context: Hex;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export async function grantPermissions<
|
|
26
|
+
TAccount extends JsonRpcAccount<Address> | undefined =
|
|
27
|
+
| JsonRpcAccount<Address>
|
|
28
|
+
| undefined,
|
|
29
|
+
>(
|
|
30
|
+
client: InnerWalletApiClient,
|
|
31
|
+
signer: SmartAccountSigner,
|
|
32
|
+
params: GrantPermissionsParams<TAccount>,
|
|
33
|
+
): Promise<GrantPermissionsResult>;
|
|
34
|
+
|
|
35
|
+
export async function grantPermissions(
|
|
36
|
+
client: InnerWalletApiClient,
|
|
37
|
+
signer: SmartAccountSigner,
|
|
38
|
+
params: GrantPermissionsParams,
|
|
39
|
+
): Promise<GrantPermissionsResult> {
|
|
40
|
+
if (client.account && !params.account) {
|
|
41
|
+
params.account = client.account.address;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return client.grantPermissions(signer, {
|
|
45
|
+
...params,
|
|
46
|
+
chainId: toHex(client.chain.id),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Static } from "@sinclair/typebox";
|
|
2
|
+
import type { wallet_listAccounts } from "../../rpc/request";
|
|
3
|
+
import type { InnerWalletApiClient } from "../../types";
|
|
4
|
+
|
|
5
|
+
export type ListAccountsParams = Static<
|
|
6
|
+
typeof wallet_listAccounts
|
|
7
|
+
>["Request"]["params"][0];
|
|
8
|
+
|
|
9
|
+
export type ListAccountsResult = Static<
|
|
10
|
+
typeof wallet_listAccounts
|
|
11
|
+
>["ReturnType"];
|
|
12
|
+
|
|
13
|
+
export async function listAccounts(
|
|
14
|
+
client: InnerWalletApiClient,
|
|
15
|
+
params: ListAccountsParams,
|
|
16
|
+
): Promise<ListAccountsResult> {
|
|
17
|
+
return client.request({ method: "wallet_listAccounts", params: [params] });
|
|
18
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import {
|
|
2
|
+
toHex,
|
|
3
|
+
type Address,
|
|
4
|
+
type IsUndefined,
|
|
5
|
+
type JsonRpcAccount,
|
|
6
|
+
} from "viem";
|
|
7
|
+
import type {
|
|
8
|
+
PrepareCallsParams as IsomorphicPrepareCallsParams,
|
|
9
|
+
PrepareCallsResult as IsomorphicPrepareCallsResult,
|
|
10
|
+
} from "../../isomorphic/actions/prepareCalls";
|
|
11
|
+
import type { InnerWalletApiClient } from "../../types";
|
|
12
|
+
|
|
13
|
+
export type GetAccountParam<TAccount> =
|
|
14
|
+
IsUndefined<TAccount> extends true
|
|
15
|
+
? { account: Address }
|
|
16
|
+
: { account?: never };
|
|
17
|
+
|
|
18
|
+
export type PrepareCallsParams<
|
|
19
|
+
TAccount extends JsonRpcAccount<Address> | undefined =
|
|
20
|
+
| JsonRpcAccount<Address>
|
|
21
|
+
| undefined,
|
|
22
|
+
> = Omit<IsomorphicPrepareCallsParams, "from" | "chainId"> &
|
|
23
|
+
(IsUndefined<TAccount> extends true ? { from: Address } : { from?: never });
|
|
24
|
+
|
|
25
|
+
export type PrepareCallsResult = IsomorphicPrepareCallsResult;
|
|
26
|
+
|
|
27
|
+
export async function prepareCalls<
|
|
28
|
+
TAccount extends JsonRpcAccount<Address> | undefined =
|
|
29
|
+
| JsonRpcAccount<Address>
|
|
30
|
+
| undefined,
|
|
31
|
+
>(
|
|
32
|
+
client: InnerWalletApiClient<TAccount>,
|
|
33
|
+
params: PrepareCallsParams<TAccount>,
|
|
34
|
+
): Promise<PrepareCallsResult>;
|
|
35
|
+
|
|
36
|
+
export async function prepareCalls(
|
|
37
|
+
client: InnerWalletApiClient,
|
|
38
|
+
params: PrepareCallsParams,
|
|
39
|
+
): Promise<PrepareCallsResult> {
|
|
40
|
+
if (client.policyId && !params.capabilities?.paymasterService) {
|
|
41
|
+
params.capabilities = {
|
|
42
|
+
...params.capabilities,
|
|
43
|
+
paymasterService: { policyId: client.policyId },
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (client.account && !params.from) {
|
|
48
|
+
params.from = client.account.address;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return await client.request({
|
|
52
|
+
method: "wallet_prepareCalls",
|
|
53
|
+
params: [{ ...params, chainId: toHex(client.chain.id) }],
|
|
54
|
+
});
|
|
55
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { SmartAccountSigner, SmartContractAccount } from "@aa-sdk/core";
|
|
2
|
+
import type { Static } from "@sinclair/typebox";
|
|
3
|
+
import { Value } from "@sinclair/typebox/value";
|
|
4
|
+
import type { Address } from "abitype";
|
|
5
|
+
import { custom, type IsUndefined, type JsonRpcAccount } from "viem";
|
|
6
|
+
import { createAccount } from "../../isomorphic/utils/createAccount";
|
|
7
|
+
import type { wallet_requestAccount } from "../../rpc/request";
|
|
8
|
+
import { TypeSerializedInitcode } from "../../schemas";
|
|
9
|
+
import type { InnerWalletApiClient } from "../../types";
|
|
10
|
+
|
|
11
|
+
export type RequestAccountParams<
|
|
12
|
+
TAccount extends JsonRpcAccount<Address> | undefined =
|
|
13
|
+
| JsonRpcAccount<Address>
|
|
14
|
+
| undefined,
|
|
15
|
+
> =
|
|
16
|
+
IsUndefined<TAccount> extends true
|
|
17
|
+
? Omit<
|
|
18
|
+
Extract<
|
|
19
|
+
Static<typeof wallet_requestAccount>["Request"]["params"][0],
|
|
20
|
+
{ signerAddress: Address }
|
|
21
|
+
>,
|
|
22
|
+
"signerAddress" | "includeCounterfactualInfo"
|
|
23
|
+
>
|
|
24
|
+
: never;
|
|
25
|
+
|
|
26
|
+
// TODO: this could be more specific potentially :shrug:
|
|
27
|
+
export type RequestAccountResult = SmartContractAccount;
|
|
28
|
+
|
|
29
|
+
export function requestAccount<
|
|
30
|
+
TAccount extends JsonRpcAccount<Address> | undefined =
|
|
31
|
+
| JsonRpcAccount<Address>
|
|
32
|
+
| undefined,
|
|
33
|
+
>(
|
|
34
|
+
client: InnerWalletApiClient<TAccount>,
|
|
35
|
+
signer: SmartAccountSigner,
|
|
36
|
+
params?: RequestAccountParams<TAccount>,
|
|
37
|
+
): Promise<RequestAccountResult>;
|
|
38
|
+
|
|
39
|
+
export async function requestAccount(
|
|
40
|
+
client: InnerWalletApiClient,
|
|
41
|
+
signer: SmartAccountSigner,
|
|
42
|
+
params?: RequestAccountParams,
|
|
43
|
+
): Promise<RequestAccountResult> {
|
|
44
|
+
const args =
|
|
45
|
+
client.account && !params
|
|
46
|
+
? {
|
|
47
|
+
accountAddress: client.account.address,
|
|
48
|
+
includeCounterfactualInfo: true,
|
|
49
|
+
}
|
|
50
|
+
: {
|
|
51
|
+
...params,
|
|
52
|
+
signerAddress: await signer.getAddress(),
|
|
53
|
+
includeCounterfactualInfo: true,
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const { counterfactualInfo, accountAddress } = await client.request({
|
|
57
|
+
method: "wallet_requestAccount",
|
|
58
|
+
params: [args],
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
return createAccount({
|
|
62
|
+
accountAddress: accountAddress,
|
|
63
|
+
counterfactualInfo: Value.Parse(
|
|
64
|
+
TypeSerializedInitcode,
|
|
65
|
+
counterfactualInfo!,
|
|
66
|
+
),
|
|
67
|
+
chain: client.chain,
|
|
68
|
+
transport: custom(client.transport),
|
|
69
|
+
signer,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Static } from "@sinclair/typebox";
|
|
2
|
+
import type { wallet_sendPreparedCalls } from "../../rpc/request";
|
|
3
|
+
import type { InnerWalletApiClient } from "../../types";
|
|
4
|
+
import { toHex } from "viem";
|
|
5
|
+
|
|
6
|
+
export type SendPreparedCallsParams = Omit<
|
|
7
|
+
Static<typeof wallet_sendPreparedCalls>["Request"]["params"][0],
|
|
8
|
+
"chainId"
|
|
9
|
+
>;
|
|
10
|
+
|
|
11
|
+
export type SendPreparedCallsResult = Static<
|
|
12
|
+
typeof wallet_sendPreparedCalls
|
|
13
|
+
>["ReturnType"];
|
|
14
|
+
|
|
15
|
+
export async function sendPreparedCalls(
|
|
16
|
+
client: InnerWalletApiClient,
|
|
17
|
+
params: SendPreparedCallsParams,
|
|
18
|
+
): Promise<SendPreparedCallsResult> {
|
|
19
|
+
return client.request({
|
|
20
|
+
method: "wallet_sendPreparedCalls",
|
|
21
|
+
params: [{ ...params, chainId: toHex(client.chain.id) }],
|
|
22
|
+
});
|
|
23
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type Address,
|
|
3
|
+
type Hex,
|
|
4
|
+
type JsonRpcAccount,
|
|
5
|
+
type SignableMessage,
|
|
6
|
+
} from "viem";
|
|
7
|
+
import type { InnerWalletApiClient } from "../../types";
|
|
8
|
+
import type { SmartAccountSigner } from "@aa-sdk/core";
|
|
9
|
+
import { requestAccount } from "./requestAccount";
|
|
10
|
+
|
|
11
|
+
export type SignMessageParams = SignableMessage;
|
|
12
|
+
|
|
13
|
+
export type SignMessageResult = Hex;
|
|
14
|
+
|
|
15
|
+
export async function signMessage<
|
|
16
|
+
TAccount extends JsonRpcAccount<Address> | undefined =
|
|
17
|
+
| JsonRpcAccount<Address>
|
|
18
|
+
| undefined,
|
|
19
|
+
>(
|
|
20
|
+
client: InnerWalletApiClient<TAccount>,
|
|
21
|
+
signer: SmartAccountSigner,
|
|
22
|
+
params: SignMessageParams,
|
|
23
|
+
): Promise<SignMessageResult>;
|
|
24
|
+
|
|
25
|
+
export async function signMessage(
|
|
26
|
+
client: InnerWalletApiClient,
|
|
27
|
+
signer: SmartAccountSigner,
|
|
28
|
+
params: SignMessageParams,
|
|
29
|
+
): Promise<SignMessageResult> {
|
|
30
|
+
const account = await requestAccount(client, signer);
|
|
31
|
+
return account.signMessageWith6492({ message: params });
|
|
32
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { SmartAccountSigner } from "@aa-sdk/core";
|
|
2
|
+
import type { Static } from "@sinclair/typebox";
|
|
3
|
+
import { type Hex } from "viem";
|
|
4
|
+
import { TypeSignatureRequest } from "../../schemas";
|
|
5
|
+
import { assertNever } from "../../utils";
|
|
6
|
+
|
|
7
|
+
export type SignSignatureRequestParams = Static<typeof TypeSignatureRequest>;
|
|
8
|
+
|
|
9
|
+
export type SignSignatureRequestResult = {
|
|
10
|
+
type: "ecdsa";
|
|
11
|
+
signature: Hex;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export function signSignatureRequest(
|
|
15
|
+
signer: SmartAccountSigner,
|
|
16
|
+
params: SignSignatureRequestParams,
|
|
17
|
+
): Promise<SignSignatureRequestResult>;
|
|
18
|
+
|
|
19
|
+
export async function signSignatureRequest(
|
|
20
|
+
signer: SmartAccountSigner,
|
|
21
|
+
params: SignSignatureRequestParams,
|
|
22
|
+
): Promise<SignSignatureRequestResult> {
|
|
23
|
+
const signature =
|
|
24
|
+
params.type === "personal_sign"
|
|
25
|
+
? await signer.signMessage(params.data)
|
|
26
|
+
: params.type === "eth_signTypedData_v4"
|
|
27
|
+
? await signer.signTypedData(params.data)
|
|
28
|
+
: assertNever(params, "Unexpected signature request type");
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
type: "ecdsa",
|
|
32
|
+
signature,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type Address,
|
|
3
|
+
type Hex,
|
|
4
|
+
type JsonRpcAccount,
|
|
5
|
+
type TypedDataDefinition,
|
|
6
|
+
} from "viem";
|
|
7
|
+
import type { InnerWalletApiClient } from "../../types";
|
|
8
|
+
import type { SmartAccountSigner } from "@aa-sdk/core";
|
|
9
|
+
import { requestAccount } from "./requestAccount";
|
|
10
|
+
|
|
11
|
+
export type SignTypedDataParams = TypedDataDefinition;
|
|
12
|
+
|
|
13
|
+
export type SignTypedDataResult = Hex;
|
|
14
|
+
|
|
15
|
+
export async function signTypedData<
|
|
16
|
+
TAccount extends JsonRpcAccount<Address> | undefined =
|
|
17
|
+
| JsonRpcAccount<Address>
|
|
18
|
+
| undefined,
|
|
19
|
+
>(
|
|
20
|
+
client: InnerWalletApiClient<TAccount>,
|
|
21
|
+
signer: SmartAccountSigner,
|
|
22
|
+
params: SignTypedDataParams,
|
|
23
|
+
): Promise<SignTypedDataResult>;
|
|
24
|
+
|
|
25
|
+
export async function signTypedData(
|
|
26
|
+
client: InnerWalletApiClient,
|
|
27
|
+
signer: SmartAccountSigner,
|
|
28
|
+
params: SignTypedDataParams,
|
|
29
|
+
): Promise<SignTypedDataResult> {
|
|
30
|
+
const account = await requestAccount(client, signer);
|
|
31
|
+
return account.signTypedDataWith6492(params);
|
|
32
|
+
}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { LocalAccountSigner } from "@aa-sdk/core";
|
|
2
|
+
import { alchemy, arbitrumSepolia } from "@account-kit/infra";
|
|
3
|
+
import { describe, expect, it } from "bun:test";
|
|
4
|
+
import { createPublicClient, zeroAddress, type Address } from "viem";
|
|
5
|
+
import { createSmartWalletClient } from ".";
|
|
6
|
+
import { PermissionType } from "@account-kit/smart-contracts/experimental";
|
|
7
|
+
import { signSignatureRequest } from "./actions/signSignatureRequest";
|
|
8
|
+
|
|
9
|
+
describe("Client E2E Tests", () => {
|
|
10
|
+
const transport = alchemy(
|
|
11
|
+
process.env.ALCHEMY_PROXY_RPC_URL
|
|
12
|
+
? {
|
|
13
|
+
rpcUrl: process.env.ALCHEMY_PROXY_RPC_URL,
|
|
14
|
+
}
|
|
15
|
+
: {
|
|
16
|
+
apiKey: process.env.TEST_ALCHEMY_API_KEY!,
|
|
17
|
+
},
|
|
18
|
+
);
|
|
19
|
+
describe("Local Mode Tests", () => {
|
|
20
|
+
const signer = LocalAccountSigner.privateKeyToAccountSigner(
|
|
21
|
+
"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff81",
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
const client = createSmartWalletClient({
|
|
25
|
+
transport,
|
|
26
|
+
chain: arbitrumSepolia,
|
|
27
|
+
mode: "local",
|
|
28
|
+
signer,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const publicClient = createPublicClient({
|
|
32
|
+
chain: arbitrumSepolia,
|
|
33
|
+
transport,
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("should successfully get a counterfactual address", async () => {
|
|
37
|
+
const account = await client.requestAccount();
|
|
38
|
+
expect(account.address).toMatchInlineSnapshot(
|
|
39
|
+
`"0x26809de7733F9CcB5c0c61210a4f78d6F1daFc58"`,
|
|
40
|
+
);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("can correctly sign a message", async () => {
|
|
44
|
+
const account = await client.requestAccount();
|
|
45
|
+
const message = "hello world";
|
|
46
|
+
const signature = await client.signMessage(message);
|
|
47
|
+
const publicClient = createPublicClient({
|
|
48
|
+
chain: arbitrumSepolia,
|
|
49
|
+
transport,
|
|
50
|
+
});
|
|
51
|
+
const isValid = await publicClient.verifyMessage({
|
|
52
|
+
address: account.address,
|
|
53
|
+
message: "hello world",
|
|
54
|
+
signature,
|
|
55
|
+
});
|
|
56
|
+
expect(isValid).toBeTrue();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("can correctly sign typed data", async () => {
|
|
60
|
+
const account = await client.requestAccount();
|
|
61
|
+
const signature = await client.signTypedData(givenTypedData);
|
|
62
|
+
const isValid = await publicClient.verifyTypedData({
|
|
63
|
+
...givenTypedData,
|
|
64
|
+
signature,
|
|
65
|
+
address: account.address,
|
|
66
|
+
});
|
|
67
|
+
expect(isValid).toBeTrue();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("should successfully send a UO with paymaster", async () => {
|
|
71
|
+
const account = await client.requestAccount();
|
|
72
|
+
const preparedUO = await client.prepareCalls({
|
|
73
|
+
calls: [{ to: zeroAddress, value: "0x0" }],
|
|
74
|
+
from: account.address,
|
|
75
|
+
capabilities: {
|
|
76
|
+
paymasterService: {
|
|
77
|
+
policyId: process.env.TEST_PAYMASTER_POLICY_ID!,
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
if (preparedUO.signatureRequest.type !== "personal_sign") {
|
|
83
|
+
throw new Error("Invalid signature request type");
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const signature = await signer.signMessage(
|
|
87
|
+
preparedUO.signatureRequest.data,
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
const result = await client.sendPreparedCalls({
|
|
91
|
+
...preparedUO,
|
|
92
|
+
signature: {
|
|
93
|
+
type: "ECDSA",
|
|
94
|
+
signature,
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
expect(result.preparedCallIds).toBeArrayOfSize(1);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("should successfully create a session with grantPermissions and send a UO", async () => {
|
|
102
|
+
const account = await client.requestAccount();
|
|
103
|
+
|
|
104
|
+
const sessionKey = LocalAccountSigner.generatePrivateKeySigner();
|
|
105
|
+
|
|
106
|
+
const permissions = await client.grantPermissions({
|
|
107
|
+
account: account.address,
|
|
108
|
+
expiry: Math.floor(Date.now() / 1000) + 60 * 60,
|
|
109
|
+
key: {
|
|
110
|
+
publicKey: await sessionKey.getAddress(),
|
|
111
|
+
type: "secp256k1",
|
|
112
|
+
},
|
|
113
|
+
permissions: [{ type: PermissionType.ROOT }],
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
const preparedUO = await client.prepareCalls({
|
|
117
|
+
calls: [{ to: zeroAddress, value: "0x0" }],
|
|
118
|
+
from: account.address,
|
|
119
|
+
capabilities: {
|
|
120
|
+
paymasterService: {
|
|
121
|
+
policyId: process.env.TEST_PAYMASTER_POLICY_ID!,
|
|
122
|
+
},
|
|
123
|
+
permissions,
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
const signature = await signSignatureRequest(
|
|
128
|
+
sessionKey,
|
|
129
|
+
preparedUO.signatureRequest,
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
const result = await client.sendPreparedCalls({
|
|
133
|
+
...preparedUO,
|
|
134
|
+
signature,
|
|
135
|
+
capabilities: {
|
|
136
|
+
permissions,
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
expect(result.preparedCallIds).toBeArrayOfSize(1);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
describe("Remote Mode Tests", () => {
|
|
145
|
+
const signer = LocalAccountSigner.privateKeyToAccountSigner(
|
|
146
|
+
"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80",
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
const client = createSmartWalletClient({
|
|
150
|
+
transport,
|
|
151
|
+
chain: arbitrumSepolia,
|
|
152
|
+
mode: "remote",
|
|
153
|
+
signer,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
const publicClient = createPublicClient({
|
|
157
|
+
chain: arbitrumSepolia,
|
|
158
|
+
transport,
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it("should successfully get a counterfactual address", async () => {
|
|
162
|
+
const account = await client.requestAccount();
|
|
163
|
+
expect(account.address).toMatchInlineSnapshot(
|
|
164
|
+
`"0x65b5DE0251f553B2208762a4724303E750294D96"`,
|
|
165
|
+
);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it("can correctly sign a message", async () => {
|
|
169
|
+
const account = await client.requestAccount();
|
|
170
|
+
const message = "hello world";
|
|
171
|
+
const signature = await client.signMessage(message);
|
|
172
|
+
const publicClient = createPublicClient({
|
|
173
|
+
chain: arbitrumSepolia,
|
|
174
|
+
transport,
|
|
175
|
+
});
|
|
176
|
+
const isValid = await publicClient.verifyMessage({
|
|
177
|
+
address: account.address,
|
|
178
|
+
message: "hello world",
|
|
179
|
+
signature,
|
|
180
|
+
});
|
|
181
|
+
expect(isValid).toBeTrue();
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it("can correctly sign typed data", async () => {
|
|
185
|
+
const account = await client.requestAccount();
|
|
186
|
+
const signature = await client.signTypedData(givenTypedData);
|
|
187
|
+
const isValid = await publicClient.verifyTypedData({
|
|
188
|
+
...givenTypedData,
|
|
189
|
+
signature,
|
|
190
|
+
address: account.address,
|
|
191
|
+
});
|
|
192
|
+
expect(isValid).toBeTrue();
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it("should successfully send a UO with paymaster", async () => {
|
|
196
|
+
const account = await client.requestAccount();
|
|
197
|
+
const preparedUO = await client.prepareCalls({
|
|
198
|
+
calls: [{ to: zeroAddress, value: "0x0" }],
|
|
199
|
+
from: account.address,
|
|
200
|
+
capabilities: {
|
|
201
|
+
paymasterService: {
|
|
202
|
+
policyId: process.env.TEST_PAYMASTER_POLICY_ID!,
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
const signature = await client.signSignatureRequest(
|
|
208
|
+
preparedUO.signatureRequest,
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
const result = await client.sendPreparedCalls({
|
|
212
|
+
...preparedUO,
|
|
213
|
+
signature,
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
expect(result.preparedCallIds).toBeArrayOfSize(1);
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
it("should successfully create a session with grantPermissions and send a UO", async () => {
|
|
220
|
+
const account = await client.requestAccount();
|
|
221
|
+
|
|
222
|
+
const sessionKey = LocalAccountSigner.generatePrivateKeySigner();
|
|
223
|
+
|
|
224
|
+
const permissions = await client.grantPermissions({
|
|
225
|
+
account: account.address,
|
|
226
|
+
expiry: Math.floor(Date.now() / 1000) + 60 * 60,
|
|
227
|
+
key: {
|
|
228
|
+
publicKey: await sessionKey.getAddress(),
|
|
229
|
+
type: "secp256k1",
|
|
230
|
+
},
|
|
231
|
+
permissions: [{ type: PermissionType.ROOT }],
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
const preparedUO = await client.prepareCalls({
|
|
235
|
+
calls: [{ to: zeroAddress, value: "0x0" }],
|
|
236
|
+
from: account.address,
|
|
237
|
+
capabilities: {
|
|
238
|
+
paymasterService: {
|
|
239
|
+
policyId: process.env.TEST_PAYMASTER_POLICY_ID!,
|
|
240
|
+
},
|
|
241
|
+
permissions,
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
const signature = await signSignatureRequest(
|
|
246
|
+
sessionKey,
|
|
247
|
+
preparedUO.signatureRequest,
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
const result = await client.sendPreparedCalls({
|
|
251
|
+
...preparedUO,
|
|
252
|
+
signature,
|
|
253
|
+
capabilities: {
|
|
254
|
+
permissions,
|
|
255
|
+
},
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
expect(result.preparedCallIds).toBeArrayOfSize(1);
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
const givenTypedData = {
|
|
263
|
+
types: {
|
|
264
|
+
Person: [
|
|
265
|
+
{ name: "name", type: "string" },
|
|
266
|
+
{ name: "wallet", type: "address" },
|
|
267
|
+
],
|
|
268
|
+
Mail: [
|
|
269
|
+
{ name: "from", type: "Person" },
|
|
270
|
+
{ name: "to", type: "Person" },
|
|
271
|
+
{ name: "contents", type: "string" },
|
|
272
|
+
],
|
|
273
|
+
},
|
|
274
|
+
primaryType: "Mail" as const,
|
|
275
|
+
domain: {
|
|
276
|
+
name: "Ether Mail",
|
|
277
|
+
version: "1",
|
|
278
|
+
chainId: 1,
|
|
279
|
+
verifyingContract:
|
|
280
|
+
"0xbbc68f94D29d52EE8D4994E54d6ED0fEAeb99C2c" as Address,
|
|
281
|
+
},
|
|
282
|
+
message: {
|
|
283
|
+
from: {
|
|
284
|
+
name: "Alice",
|
|
285
|
+
wallet: "0xFC24e57486116026740634F629ffC4E5C95A6893",
|
|
286
|
+
},
|
|
287
|
+
to: {
|
|
288
|
+
name: "Bob",
|
|
289
|
+
wallet: "0xe7a26f006EAA562308C5df235C02BFB9a5849177",
|
|
290
|
+
},
|
|
291
|
+
contents: "Hello, Bob!",
|
|
292
|
+
},
|
|
293
|
+
} as const;
|
|
294
|
+
});
|