Skip to content

Commit 322b408

Browse files
authored
mina/auro wallet support (#355)
* mina/auro wallet support (wip) * use mina provider package and fix hardcoded network * improve verifyAddress * update package-lock.json * fix: move MINA_LOGIN error variant * add 'accountsChanged' listener * use base58check for mina verifyAddress * update package-lock.json
1 parent c0e242c commit 322b408

File tree

18 files changed

+1332
-370
lines changed

18 files changed

+1332
-370
lines changed

package-lock.json

+1,024-368
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/batcher/address-validator/src/index.ts

+8
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ class PaimaAddressValidator {
8585
return await CryptoManager.Polkadot().verifyAddress(address);
8686
case AddressType.ALGORAND:
8787
return await CryptoManager.Algorand().verifyAddress(address);
88+
case AddressType.MINA:
89+
return await CryptoManager.Mina().verifyAddress(address);
8890
case AddressType.UNKNOWN:
8991
return false;
9092
default:
@@ -130,6 +132,12 @@ class PaimaAddressValidator {
130132
message,
131133
input.userSignature
132134
);
135+
case AddressType.MINA:
136+
return await CryptoManager.Mina().verifySignature(
137+
input.userAddress,
138+
message,
139+
input.userSignature
140+
);
133141
case AddressType.UNKNOWN:
134142
return false;
135143
default:

packages/batcher/utils/src/index.ts

+3
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export const SUPPORTED_CHAIN_NAMES: string[] = [
5656
addressTypeName(AddressType.POLKADOT),
5757
addressTypeName(AddressType.CARDANO),
5858
addressTypeName(AddressType.ALGORAND),
59+
addressTypeName(AddressType.MINA),
5960
];
6061

6162
const POLLING_INTERVAL = 10000;
@@ -70,6 +71,8 @@ export function addressTypeName(addressType: AddressType): string {
7071
return 'Astar / Polkadot';
7172
case AddressType.ALGORAND:
7273
return 'Algorand';
74+
case AddressType.MINA:
75+
return 'Mina';
7376
case AddressType.UNKNOWN:
7477
return 'Unknown address type';
7578
default:

packages/engine/paima-funnel/src/paima-l2-processing.ts

+2
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ async function validateSubunitSignature(
177177
return await CryptoManager.Polkadot().verifySignature(userAddress, message, userSignature);
178178
case AddressType.ALGORAND:
179179
return await CryptoManager.Algorand().verifySignature(userAddress, message, userSignature);
180+
case AddressType.MINA:
181+
return await CryptoManager.Mina().verifySignature(userAddress, message, userSignature);
180182
default:
181183
return false;
182184
}

packages/paima-sdk/paima-crypto/package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
"@polkadot/util": "^10.4.2",
3434
"@polkadot/util-crypto": "^10.4.2",
3535
"bech32": "^2.0.0",
36-
"@paima/utils": "2.3.0"
36+
"@paima/utils": "2.3.0",
37+
"mina-signer": "^2.1.1",
38+
"base58check": "^2.0.0"
3739
}
3840
}

packages/paima-sdk/paima-crypto/src/index.ts

+9
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { AlgorandCrypto } from './algorand.js';
22
import { CardanoCrypto } from './cardano.js';
33
import { EvmCrypto } from './evm.js';
44
import { PolkadotCrypto } from './polkadot.js';
5+
import { MinaCrypto } from './mina.js';
56
export { AlgorandCrypto, CardanoCrypto, EvmCrypto, PolkadotCrypto };
67
export type * from './IVerify.js';
78

@@ -13,6 +14,7 @@ export class CryptoManager {
1314
private static cardano: CardanoCrypto | undefined;
1415
private static evm: EvmCrypto | undefined;
1516
private static polkadot: PolkadotCrypto | undefined;
17+
private static mina: MinaCrypto | undefined;
1618

1719
static Algorand(): AlgorandCrypto {
1820
if (CryptoManager.algorand == null) {
@@ -41,4 +43,11 @@ export class CryptoManager {
4143
}
4244
return CryptoManager.polkadot;
4345
}
46+
47+
static Mina(): MinaCrypto {
48+
if (CryptoManager.mina == null) {
49+
CryptoManager.mina = new MinaCrypto();
50+
}
51+
return CryptoManager.mina;
52+
}
4453
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { doLog } from '@paima/utils';
2+
import type { IVerify } from './IVerify.js';
3+
const base58check = require('base58check');
4+
5+
export class MinaCrypto implements IVerify {
6+
verifyAddress = async (address: string): Promise<boolean> => {
7+
try {
8+
base58check.decode(address);
9+
} catch (e) {
10+
return false;
11+
}
12+
13+
return true;
14+
};
15+
verifySignature = async (
16+
userAddress: string,
17+
message: string,
18+
sigStruct: string
19+
): Promise<boolean> => {
20+
try {
21+
const [field, scalar, network, ...remainder] = sigStruct.split(';');
22+
if (!field || !scalar || !network || remainder.length > 0) {
23+
return false;
24+
}
25+
26+
const Client = require('mina-signer');
27+
28+
const signerClient = new Client({ network });
29+
30+
const verifyBody = {
31+
data: message,
32+
publicKey: userAddress,
33+
signature: { field, scalar },
34+
};
35+
36+
const verifyResult = signerClient.verifyMessage(verifyBody);
37+
38+
return verifyResult;
39+
} catch (err) {
40+
doLog('[address-validator] error verifying mina signature:', err);
41+
return false;
42+
}
43+
};
44+
}

packages/paima-sdk/paima-mw-core/src/delegate-wallet/index.ts

+7
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
PolkadotConnector,
1717
AlgorandConnector,
1818
WalletMode,
19+
MinaConnector,
1920
} from '@paima/providers';
2021
import { AddressType, ENV } from '@paima/utils';
2122
import { paimaEndpoints } from '../index.js';
@@ -122,6 +123,9 @@ export class WalletConnectHelper {
122123
case AddressType.ALGORAND:
123124
provider = AlgorandConnector.instance().getProvider();
124125
break;
126+
case AddressType.MINA:
127+
provider = MinaConnector.instance().getProvider();
128+
break;
125129
}
126130
if (!provider) throw new Error('Cannot get provider ' + walletType);
127131
return provider;
@@ -158,6 +162,9 @@ export class WalletConnectHelper {
158162
case AddressType.ALGORAND:
159163
loginInfo = { mode: WalletMode.Algorand };
160164
break;
165+
case AddressType.MINA:
166+
loginInfo = { mode: WalletMode.Mina };
167+
break;
161168
case AddressType.UNKNOWN:
162169
throw new Error('AddressTypes cannot be Unknown.');
163170
default:

packages/paima-sdk/paima-mw-core/src/errors.ts

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export const enum PaimaMiddlewareErrorCode {
4242
POLKADOT_WALLET_NOT_INSTALLED,
4343
POLKADOT_LOGIN,
4444
ALGORAND_LOGIN,
45+
MINA_LOGIN,
4546
// Input posting related:
4647
ERROR_POSTING_TO_CHAIN = 2_000,
4748
ERROR_POSTING_TO_BATCHER,
@@ -102,6 +103,7 @@ export const PAIMA_MIDDLEWARE_ERROR_MESSAGES: Record<PaimaMiddlewareErrorCode, s
102103
'Internal error: Invalid posting mode set',
103104
[PaimaMiddlewareErrorCode.FINAL_PAIMA_GENERIC_ERROR]:
104105
'Internal error: unknown generic paima error (FINAL_PAIMA_GENERIC_ERROR)',
106+
[PaimaMiddlewareErrorCode.MINA_LOGIN]: 'Error while connecting to the Mina wallet',
105107
};
106108

107109
export const paimaErrorMessageFxn: ErrorMessageFxn = buildErrorCodeTranslator(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import type { LoginInfoMap, Result } from '../types.js';
2+
import { PaimaMiddlewareErrorCode, buildEndpointErrorFxn } from '../errors.js';
3+
import { MinaConnector } from '@paima/providers';
4+
import type { ApiForMode, IProvider, WalletMode } from '@paima/providers';
5+
import { getGameName } from '../state.js';
6+
import { connectInjected } from './wallet-modes.js';
7+
8+
export async function minaLoginWrapper(
9+
loginInfo: LoginInfoMap[WalletMode.Mina]
10+
): Promise<Result<IProvider<ApiForMode<WalletMode.Mina>>>> {
11+
const errorFxn = buildEndpointErrorFxn('minaLoginWrapper');
12+
13+
const gameInfo = {
14+
gameName: getGameName(),
15+
gameChainId: undefined, // Not needed because of batcher
16+
};
17+
const loginResult = await connectInjected(
18+
'minaLoginWrapper',
19+
errorFxn,
20+
PaimaMiddlewareErrorCode.MINA_LOGIN,
21+
loginInfo,
22+
MinaConnector.instance(),
23+
gameInfo
24+
);
25+
if (loginResult.success === false) {
26+
return loginResult;
27+
}
28+
return {
29+
success: true,
30+
result: loginResult.result,
31+
};
32+
}

packages/paima-sdk/paima-mw-core/src/wallets/wallet-modes.ts

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type {
1010
EthersApi,
1111
InjectionPreference,
1212
WalletMode,
13+
MinaApi,
1314
} from '@paima/providers';
1415
import { WalletNotFound, UnsupportedWallet, connectInjectedWallet } from '@paima/providers';
1516
import type { EndpointErrorFxn } from '../errors.js';
@@ -37,6 +38,7 @@ export type LoginInfoMap = {
3738
[WalletMode.Cardano]: BaseLoginInfo<CardanoApi>;
3839
[WalletMode.Polkadot]: BaseLoginInfo<PolkadotApi>;
3940
[WalletMode.Algorand]: BaseLoginInfo<AlgorandApi>;
41+
[WalletMode.Mina]: BaseLoginInfo<MinaApi>;
4042
};
4143

4244
type ToUnion<T> = {

packages/paima-sdk/paima-mw-core/src/wallets/wallets.ts

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { ethersLoginWrapper } from './evm/ethers.js';
99
import type { IProvider } from '@paima/providers';
1010
import { WalletMode } from '@paima/providers';
1111
import { PostingMode, addLogin, setDefaultProvider, setPostingMode } from '../state.js';
12+
import { minaLoginWrapper } from './mina.js';
1213

1314
export async function specificWalletLogin(
1415
loginInfo: LoginInfo,
@@ -33,6 +34,9 @@ export async function specificWalletLogin(
3334
case WalletMode.Algorand: {
3435
return await algorandLoginWrapper(loginInfo);
3536
}
37+
case WalletMode.Mina: {
38+
return await minaLoginWrapper(loginInfo);
39+
}
3640
default:
3741
assertNever(loginInfo, true);
3842
return errorFxn(FE_ERR_SPECIFIC_WALLET_NOT_INSTALLED);

packages/paima-sdk/paima-providers/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"@paima/utils": "2.3.0",
3131
"@perawallet/connect": "^1.2.3",
3232
"@polkadot/extension-dapp": "^0.44.9",
33+
"@aurowallet/mina-provider": "^1.0.2",
3334
"bech32": "^2.0.0",
3435
"web3": "1.10.0",
3536
"web3-utils": "1.10.0",

packages/paima-sdk/paima-providers/src/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ export * from './algorand.js';
22
export * from './cardano.js';
33
export * from './evm/index.js';
44
export * from './polkadot.js';
5+
export * from './mina.js';
56
export * from './errors.js';
67
export * from './utils.js';
78
export type * from './algorand.js';
89
export type * from './cardano.js';
910
export type * from './evm/index.js';
1011
export type * from './polkadot.js';
12+
export type * from './mina.js';
1113
export type * from './IProvider.js';
1214
export type * from './utils.js';

0 commit comments

Comments
 (0)