Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

feat: wallet api improvements #345

Merged
merged 30 commits into from
May 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
b946e9c
wip: wallet api implementation
agent-dominatrix Dec 14, 2023
7b5fdbd
wip: wallet api
agent-dominatrix Dec 20, 2023
039fb41
accounts, networks, signing apis
agent-dominatrix Jan 2, 2024
efb9de1
WIP: events api
agent-dominatrix Jan 8, 2024
97971cf
fix: wallet api lock unlock
agent-dominatrix Jan 10, 2024
1c0a8a6
fix: minor fix
agent-dominatrix Jan 10, 2024
858bac0
feat: onTxSuccessful and onTxFailed events
agent-dominatrix Jan 12, 2024
b97b212
feat: onEVMTxSuccessful and onEVMTxFailed events
agent-dominatrix Jan 30, 2024
251c56c
feat: minor fixes to api spec
agent-dominatrix Feb 26, 2024
459e66e
feat: address-book api and few fixes
agent-dominatrix Mar 11, 2024
8c26bd9
feat: network config and currency improvements
agent-dominatrix Mar 21, 2024
f751b6f
fix: add extra params in types
agent-dominatrix Mar 22, 2024
a29ff23
WIP: fixing issues
agent-dominatrix Mar 26, 2024
5e5a054
Revert "WIP: fixing issues"
agent-dominatrix Mar 27, 2024
634e95e
fix: minor issues
agent-dominatrix Mar 27, 2024
c740821
chore: refactoring and fix multi proxy response handlers
agent-dominatrix Mar 28, 2024
f56145a
fix: remove interactions from adress-book api
agent-dominatrix Mar 27, 2024
1ce9d06
fix: minor address book issues
agent-dominatrix Mar 28, 2024
3c6dfa3
fix: data tab bug
agent-dominatrix Apr 1, 2024
05df073
Merge branch 'master' into feat/wallet-api-dev
agent-dominatrix Apr 1, 2024
1bfafba
fix: chatstore issue in approval page
agent-dominatrix Apr 2, 2024
a511dab
feat: enforce enable flow with permissions
agent-dominatrix Apr 3, 2024
4fb28ac
fix: issue with switching accounts
agent-dominatrix Apr 4, 2024
59c8eb3
fix: few fixes and updates
agent-dominatrix Apr 10, 2024
1f9378b
feat: add ethereum signing method
agent-dominatrix Apr 15, 2024
2c8abfd
fix: fix signEthereumm for hex address and getKeys for type privateKe…
agent-dominatrix Apr 16, 2024
83a7205
fix: minor issues with packages
agent-dominatrix May 3, 2024
6223c5e
Merge branch master into feat/wallet-api-dev
agent-dominatrix May 3, 2024
5553ee4
Merge branch 'master' into feat/wallet-api-dev
agent-dominatrix May 3, 2024
48a3cd6
fix: issue with building background package
agent-dominatrix May 3, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,5 @@ packages/proto-types/!(proto-types-gen)/**/*.mjs
packages/proto-types/!(proto-types-gen)/**/*.cjs
packages/proto-types/!(proto-types-gen)/**/*.map
packages/proto-types/outputHash

packages/mobile
2 changes: 1 addition & 1 deletion .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module.exports = {
"plugin:prettier/recommended",
"prettier",
"plugin:import/typescript",
"plugin:storybook/recommended"
"plugin:storybook/recommended",
],
plugins: ["react-hooks", "unicorn", "import", "unused-imports"],
parserOptions: {
Expand Down
2 changes: 2 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,5 @@ packages/proto-types/outputHash

package.json
tsconfig.json

packages/mobile
1 change: 1 addition & 0 deletions packages/background/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
"@ethersproject/hash": "^5.7.0",
"@ethersproject/transactions": "^5.7.0",
"@ethersproject/wallet": "^5.7.0",
"@fetchai/wallet-types": "^0.1.1",
"@keplr-wallet/chain-validator": "0.12.12",
"@keplr-wallet/common": "0.12.12",
"@keplr-wallet/cosmos": "0.12.12",
Expand Down
1 change: 1 addition & 0 deletions packages/background/src/address-book/constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const ROUTE = "address-book";
83 changes: 83 additions & 0 deletions packages/background/src/address-book/handler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import { Env, Handler, InternalHandler, Message } from "@keplr-wallet/router";
import { AddressBookService } from "./service";
import {
AddEntryMsg,
DeleteEntryMsg,
ListEntriesMsg,
UpdateEntryMsg,
} from "./messages";

export const getHandler: (service: AddressBookService) => Handler = (
service: AddressBookService
) => {
return (env: Env, msg: Message<unknown>) => {
switch (msg.constructor) {
case ListEntriesMsg:
return handleListEntriesMsg(service)(env, msg as ListEntriesMsg);
case AddEntryMsg:
return handleAddEntryMsg(service)(env, msg as AddEntryMsg);
case UpdateEntryMsg:
return handleUpdateEntryMsg(service)(env, msg as UpdateEntryMsg);
case DeleteEntryMsg:
return handleDeleteEntryMsg(service)(env, msg as DeleteEntryMsg);
default:
throw new Error("Unknown msg type");
}
};
};

const handleListEntriesMsg: (
service: AddressBookService
) => InternalHandler<ListEntriesMsg> = (service) => {
return async (_env, _msg) => {
const chainId = await service.chainService.getSelectedChain();
await service.permissionService.checkBasicAccessPermission(
_env,
[chainId],
_msg.origin
);
return service.listEntries();
};
};

const handleAddEntryMsg: (
service: AddressBookService
) => InternalHandler<AddEntryMsg> = (service) => {
return async (_env, _msg) => {
const chainId = await service.chainService.getSelectedChain();
await service.permissionService.checkBasicAccessPermission(
_env,
[chainId],
_msg.origin
);
return service.addEntry(_msg.entry);
};
};

const handleUpdateEntryMsg: (
service: AddressBookService
) => InternalHandler<UpdateEntryMsg> = (service) => {
return async (_env, _msg) => {
const chainId = await service.chainService.getSelectedChain();
await service.permissionService.checkBasicAccessPermission(
_env,
[chainId],
_msg.origin
);
return service.updateEntry(_msg.entry);
};
};

const handleDeleteEntryMsg: (
service: AddressBookService
) => InternalHandler<DeleteEntryMsg> = (service) => {
return async (_env, _msg) => {
const chainId = await service.chainService.getSelectedChain();
await service.permissionService.checkBasicAccessPermission(
_env,
[chainId],
_msg.origin
);
return service.deleteEntry(_msg.address);
};
};
2 changes: 2 additions & 0 deletions packages/background/src/address-book/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from "./messages";
export * from "./service";
19 changes: 19 additions & 0 deletions packages/background/src/address-book/init.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { Router } from "@keplr-wallet/router";
import { ROUTE } from "./constants";
import { getHandler } from "./handler";
import {
AddEntryMsg,
DeleteEntryMsg,
ListEntriesMsg,
UpdateEntryMsg,
} from "./messages";
import { AddressBookService } from "./service";

export function init(router: Router, service: AddressBookService): void {
router.registerMessage(ListEntriesMsg);
router.registerMessage(UpdateEntryMsg);
router.registerMessage(DeleteEntryMsg);
router.registerMessage(AddEntryMsg);

router.addHandler(ROUTE, getHandler(service));
}
2 changes: 2 additions & 0 deletions packages/background/src/address-book/internal.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from "./service";
export * from "./init";
91 changes: 91 additions & 0 deletions packages/background/src/address-book/messages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import { AddressBookEntry } from "@fetchai/wallet-types";
import { Message } from "@keplr-wallet/router";
import { ROUTE } from "./constants";

export class ListEntriesMsg extends Message<AddressBookEntry[]> {
public static type() {
return "list-entries-msg";
}

constructor() {
super();
}

validateBasic(): void {
// noop
}

route(): string {
return ROUTE;
}

type(): string {
return ListEntriesMsg.type();
}
}

export class AddEntryMsg extends Message<void> {
public static type() {
return "add-entry-msg";
}

constructor(public readonly entry: AddressBookEntry) {
super();
}

validateBasic(): void {
// noop
}

route(): string {
return ROUTE;
}

type(): string {
return AddEntryMsg.type();
}
}

export class UpdateEntryMsg extends Message<void> {
public static type() {
return "update-entry-msg";
}

constructor(public readonly entry: AddressBookEntry) {
super();
}

validateBasic(): void {
// noop
}

route(): string {
return ROUTE;
}

type(): string {
return UpdateEntryMsg.type();
}
}

export class DeleteEntryMsg extends Message<void> {
public static type() {
return "delete-entry-msg";
}

constructor(public readonly address: string) {
super();
}

validateBasic(): void {
// noop
}

route(): string {
return ROUTE;
}

type(): string {
return DeleteEntryMsg.type();
}
}
77 changes: 77 additions & 0 deletions packages/background/src/address-book/service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import { AddressBookEntry } from "@fetchai/wallet-types";
import { ExtensionKVStore } from "@keplr-wallet/common";
import { ChainsService } from "src/chains";
import { PermissionService } from "src/permission";

export class AddressBookService {
protected addressBook: AddressBookEntry[] = [];
protected kvStore: ExtensionKVStore;

public chainService!: ChainsService;
public permissionService!: PermissionService;
constructor(
chainService: ChainsService,
permissionService: PermissionService
) {
this.chainService = chainService;
this.kvStore = new ExtensionKVStore("address-book");
this.permissionService = permissionService;
}

public async listEntries() {
const chainInfo = await this.chainService.getChainInfo(
await this.chainService.getSelectedChain()
);
const addressBook = await this.kvStore.get(`${chainInfo.chainName}`);
return addressBook as AddressBookEntry[];
}

public async addEntry(entry: AddressBookEntry) {
const chainInfo = await this.chainService.getChainInfo(
await this.chainService.getSelectedChain()
);
const addressBook: AddressBookEntry[] | undefined =
(await this.kvStore.get(`${chainInfo.chainName}`)) ?? [];

const entryExists = addressBook.find((a) => {
return a.address === entry.address;
});

if (!entryExists) {
addressBook.push(entry);
await this.kvStore.set(`${chainInfo.chainName}`, addressBook);
}
}

public async updateEntry(entry: AddressBookEntry) {
const chainInfo = await this.chainService.getChainInfo(
await this.chainService.getSelectedChain()
);
const addressBook: AddressBookEntry[] | undefined =
(await this.kvStore.get(`${chainInfo.chainName}`)) ?? [];

const updatedAddressBook = addressBook.map((_entry) => {
if (_entry.address === entry.address || _entry.name === entry.name) {
return entry;
} else {
return _entry;
}
});

await this.kvStore.set(`${chainInfo.chainName}`, updatedAddressBook);
}

public async deleteEntry(address: string) {
const chainInfo = await this.chainService.getChainInfo(
await this.chainService.getSelectedChain()
);
const addressBook: AddressBookEntry[] | undefined =
(await this.kvStore.get(`${chainInfo.chainName}`)) ?? [];

const updatedAddressBook = addressBook.filter((entry) => {
return entry.address !== address;
});

await this.kvStore.set(`${chainInfo.chainName}`, updatedAddressBook);
}
}
Loading
Loading