Skip to content

Commit 093090b

Browse files
committed
🔀 Merge #854 into deployment/rinkeby
2 parents ae74e48 + 684a4e2 commit 093090b

File tree

3 files changed

+95
-18
lines changed

3 files changed

+95
-18
lines changed

‎src/routes/wallet/index.ts

+25-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { Router } from 'express';
2-
import { checkCosmosSignPayload, checkEvmSignPayload } from '../../util/api/users';
2+
import { checkCosmosSignPayload, checkEvmSignPayload, getUserWithCivicLikerPropertiesByWallet } from '../../util/api/users';
33
import { ValidationError } from '../../util/ValidationError';
44
import { jwtSign } from '../../util/jwt';
55
import {
66
findLikeWalletByEvmWallet,
7+
checkBookUserEvmWallet,
78
migrateBookClassId,
89
migrateLikeUserToEvmUser,
910
migrateLikeWalletToEvmWallet,
1011
} from '../../util/api/wallet';
12+
import { checkAddressValid, checkCosmosAddressValid } from '../../util/ValidationHelper';
1113

1214
const router = Router();
1315

@@ -78,6 +80,22 @@ router.post('/evm/migrate/book', async (req, res, next) => {
7880
}
7981
});
8082

83+
router.get('/evm/migrate/user/addr/:likeWallet', async (req, res, next) => {
84+
try {
85+
const { likeWallet } = req.params;
86+
if (!likeWallet || !checkCosmosAddressValid(likeWallet, 'like')) {
87+
throw new ValidationError('INVALID_PAYLOAD');
88+
}
89+
const [likerIdInfo, evmWallet] = await Promise.all([
90+
getUserWithCivicLikerPropertiesByWallet(likeWallet),
91+
checkBookUserEvmWallet(likeWallet),
92+
]);
93+
res.json({ likerIdInfo, evmWallet });
94+
} catch (err) {
95+
next(err);
96+
}
97+
});
98+
8199
router.post('/evm/migrate/user', async (req, res, next) => {
82100
try {
83101
const {
@@ -95,22 +113,26 @@ router.post('/evm/migrate/user', async (req, res, next) => {
95113
throw new ValidationError('INVALID_SIGN');
96114
}
97115
const { evm_wallet: evmWallet } = signed;
98-
if (!evmWallet) {
116+
if (!evmWallet || !checkAddressValid(evmWallet)) {
99117
throw new ValidationError('INVALID_PAYLOAD');
100118
}
101119
const {
120+
isMigratedBookUser,
102121
isMigratedLikerId,
103122
isMigratedLikerLand,
104123
migratedLikerId,
105124
migratedLikerLandUser,
125+
migrateBookUserError,
106126
migrateLikerIdError,
107127
migrateLikerLandError,
108128
} = await migrateLikeUserToEvmUser(likeWallet, evmWallet);
109129
res.json({
130+
isMigratedBookUser,
110131
isMigratedLikerId,
111132
isMigratedLikerLand,
112133
migratedLikerId,
113134
migratedLikerLandUser,
135+
migrateBookUserError,
114136
migrateLikerIdError,
115137
migrateLikerLandError,
116138
});
@@ -136,7 +158,7 @@ router.post('/evm/migrate/all', async (req, res, next) => {
136158
throw new ValidationError('INVALID_SIGN');
137159
}
138160
const { evm_wallet: evmWallet } = signed;
139-
if (!evmWallet) {
161+
if (!evmWallet || !checkAddressValid(evmWallet)) {
140162
throw new ValidationError('INVALID_PAYLOAD');
141163
}
142164
const {

‎src/util/api/wallet/index.ts

+63-13
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,54 @@ export async function findLikeWalletByEvmWallet(evmWallet: string) {
1616
return userQuery.docs[0].data()?.likeWallet;
1717
}
1818

19+
export async function checkBookUserEvmWallet(likeWallet: string) {
20+
const userQuery = await likeNFTBookUserCollection.doc(likeWallet).get();
21+
if (!userQuery.exists) {
22+
return null;
23+
}
24+
return userQuery.data()?.evmWallet || null;
25+
}
26+
1927
async function migrateBookUser(likeWallet: string, evmWallet: string) {
2028
try {
21-
const userExists = await db.runTransaction(async (t) => {
22-
const [evmQuery, userDoc, bookQuery] = await Promise.all([
29+
const { userExists, alreadyMigrated } = await db.runTransaction(async (t) => {
30+
const [evmQuery, userDoc] = await Promise.all([
2331
t.get(likeNFTBookUserCollection.where('evmWallet', '==', evmWallet).limit(1)),
2432
t.get(likeNFTBookUserCollection.doc(likeWallet).get()),
25-
t.get(likeNFTBookCollection.where('ownerWallet', '==', likeWallet).limit(1)),
2633
]);
2734
if (evmQuery.docs.length > 0) {
28-
throw new Error('EVM_WALLET_ALREADY_EXIST');
35+
if (evmQuery.docs[0].id !== userDoc?.id) {
36+
throw new Error('EVM_WALLET_USED_BY_OTHER_USER');
37+
}
38+
return {
39+
userExists: true,
40+
alreadyMigrated: true,
41+
};
2942
}
3043
if (!userDoc.exists) {
3144
t.create(likeNFTBookUserCollection.doc(likeWallet), {
3245
evmWallet,
3346
likeWallet,
47+
migrateTimestamp: FieldValue.serverTimestamp(),
3448
timestamp: FieldValue.serverTimestamp(),
3549
});
3650
} else {
37-
t.update(userDoc, { evmWallet, likeWallet });
51+
const { evmWallet: existingEvmWallet } = userDoc.data();
52+
if (existingEvmWallet && existingEvmWallet !== evmWallet) {
53+
throw new Error('EVM_WALLET_NOT_MATCH_USER_RECORD');
54+
}
55+
t.update(userDoc, {
56+
evmWallet,
57+
likeWallet,
58+
migrateTimestamp: FieldValue.serverTimestamp(),
59+
});
3860
}
39-
bookQuery.docs.forEach((doc) => {
40-
t.update(doc.ref, { ownerWallet: evmWallet });
41-
});
42-
return userDoc.exists;
61+
return {
62+
userExists: userDoc.exists,
63+
alreadyMigrated: false,
64+
};
4365
});
44-
return { error: null };
66+
return { error: null, userExists, alreadyMigrated };
4567
} catch (error) {
4668
// eslint-disable-next-line no-console
4769
console.error(error);
@@ -98,7 +120,7 @@ async function migrateLikerId(likeWallet:string, evmWallet: string) {
98120
} catch (error) {
99121
// eslint-disable-next-line no-console
100122
console.error(error);
101-
return { error: (error as Error).message };
123+
return { likerId: null, error: (error as Error).message };
102124
}
103125
}
104126

@@ -150,6 +172,19 @@ export async function migrateBookClassId(likeClassId:string, evmClassId: string)
150172
}
151173

152174
export async function migrateLikeUserToEvmUser(likeWallet: string, evmWallet: string) {
175+
const { error: migrateBookUserError } = await migrateBookUser(likeWallet, evmWallet);
176+
if (migrateBookUserError) {
177+
return {
178+
isMigratedBookUser: false,
179+
isMigratedLikerId: false,
180+
isMigratedLikerLand: false,
181+
migratedLikerId: null,
182+
migratedLikerLandUser: null,
183+
migrateBookUserError,
184+
migrateLikerIdError: null,
185+
migrateLikerLandError: null,
186+
};
187+
}
153188
const [
154189
{ error: migrateLikerIdError, likerId },
155190
{ error: migrateLikerLandError, user: likerLandUser },
@@ -158,23 +193,38 @@ export async function migrateLikeUserToEvmUser(likeWallet: string, evmWallet: st
158193
migrateLikerLandEvmWallet(likeWallet, evmWallet),
159194
]);
160195
return {
196+
isMigratedBookUser: !migrateBookUserError,
161197
isMigratedLikerId: !migrateLikerIdError,
162198
isMigratedLikerLand: !migrateLikerLandError,
163199
migratedLikerId: likerId,
164200
migratedLikerLandUser: likerLandUser,
201+
migrateBookUserError,
165202
migrateLikerIdError,
166203
migrateLikerLandError,
167204
};
168205
}
169206

170207
export async function migrateLikeWalletToEvmWallet(likeWallet: string, evmWallet: string) {
208+
const { error: migrateBookUserError } = await migrateBookUser(likeWallet, evmWallet);
209+
if (migrateBookUserError) {
210+
return {
211+
isMigratedBookUser: false,
212+
isMigratedBookOwner: false,
213+
isMigratedLikerId: false,
214+
isMigratedLikerLand: false,
215+
migratedLikerId: null,
216+
migratedLikerLandUser: null,
217+
migrateBookUserError,
218+
migrateBookOwnerError: null,
219+
migrateLikerIdError: null,
220+
migrateLikerLandError: null,
221+
};
222+
}
171223
const [
172-
{ error: migrateBookUserError },
173224
{ error: migrateBookOwnerError },
174225
{ error: migrateLikerIdError, likerId },
175226
{ error: migrateLikerLandError, user: likerLandUser },
176227
] = await Promise.all([
177-
migrateBookUser(likeWallet, evmWallet),
178228
migrateBookOwner(likeWallet, evmWallet),
179229
migrateLikerId(likeWallet, evmWallet),
180230
migrateLikerLandEvmWallet(likeWallet, evmWallet),

‎src/util/liker-land.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -442,9 +442,14 @@ export async function migrateLikerLandEvmWallet(likeWallet: string, evmWallet: s
442442
});
443443
return { user: data, error: null };
444444
} catch (error) {
445+
// eslint-disable-next-line no-console
446+
console.error(error);
445447
if (axios.isAxiosError(error)) {
446-
return { error: new Error((error as AxiosError).response?.data as string) };
448+
const axiosError = error as AxiosError;
449+
const errorBody = axiosError.response?.data;
450+
const errorMessage = errorBody || error.message;
451+
return { user: null, error: errorMessage };
447452
}
448-
return { user: null, error: null };
453+
return { user: null, error: (error as Error).message };
449454
}
450455
}

0 commit comments

Comments
 (0)