[WIP] Simulate

This commit is contained in:
HeesungB 2022-12-13 23:46:32 +09:00
parent febde1e7c4
commit 8504c84d3c
5 changed files with 137 additions and 13 deletions

View File

@ -52,7 +52,7 @@ export const AllChainsItem: FunctionComponent<Props> = (props) => {
<Flex1 /> <Flex1 />
<ChainCheckBox checked={allChecked} /> <ChainCheckBox checked={allChecked} readOnly />
</ChainItemContainer> </ChainItemContainer>
</AllChainsContainer> </AllChainsContainer>
); );

View File

@ -41,6 +41,7 @@ export const ChainItem: FunctionComponent<Props> = (props) => {
<ChainItemContainer <ChainItemContainer
key={chainItem.prefix} key={chainItem.prefix}
isLoading={false} isLoading={false}
checked={checked}
onClick={checkHandler} onClick={checkHandler}
> >
<ChainImageContainer width="3rem" height="3rem"> <ChainImageContainer width="3rem" height="3rem">
@ -57,7 +58,7 @@ export const ChainItem: FunctionComponent<Props> = (props) => {
<Flex1 /> <Flex1 />
<ChainCheckBox checked={checked} /> <ChainCheckBox checked={checked} readOnly />
</ChainItemContainer> </ChainItemContainer>
); );
}; };

View File

@ -73,7 +73,10 @@ export const ChainContainer = styled.div`
background-color: ${(props) => props.color}; background-color: ${(props) => props.color};
`; `;
export const ChainItemContainer = styled.div<{ isLoading: boolean }>` export const ChainItemContainer = styled.div<{
isLoading: boolean;
checked?: boolean;
}>`
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;

7
constants/icns.ts Normal file
View File

@ -0,0 +1,7 @@
export const RPC_URL = "";
export const REST_URL = "https://lcd.testnet.osmosis.zone";
export const REGISTRAR_ADDRESS =
"osmo1npn97g7hsgqlp70rw8nhd7c7vyvkukv9x0n25sn4fk5mgcjlz4gq9zlgf3";
export const RESOLVER_ADDRESS =
"osmo1002awr7frr9wk44lc3vfzt0d2w6vz5z03ql6fszjsjy8vdcvk0sskruz3c";

View File

@ -22,12 +22,22 @@ import { TwitterProfile } from "../../components/twitter-profile";
import { ChainList } from "../../components/chain-list"; import { ChainList } from "../../components/chain-list";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import { MainChainId } from "../../constants/wallet"; import { MainChainId } from "../../constants/wallet";
import { getKeplrFromWindow, KeplrWallet } from "../../wallets"; import {
getKeplrFromWindow,
KeplrWallet,
makeCosmwasmExecMsg,
simulateMsgs,
} from "../../wallets";
import { ChainIdHelper } from "@keplr-wallet/cosmos"; import { ChainIdHelper } from "@keplr-wallet/cosmos";
import AllChainsIcon from "../../public/images/svg/all-chains-icon.svg"; import AllChainsIcon from "../../public/images/svg/all-chains-icon.svg";
import { AllChainsItem } from "../../components/chain-list/all-chains-item"; import { AllChainsItem } from "../../components/chain-list/all-chains-item";
import { SearchInput } from "../../components/search-input"; import { SearchInput } from "../../components/search-input";
import {
REGISTRAR_ADDRESS,
RESOLVER_ADDRESS,
REST_URL,
} from "../../constants/icns";
export default function VerificationPage() { export default function VerificationPage() {
const router = useRouter(); const router = useRouter();
@ -51,7 +61,8 @@ export default function VerificationPage() {
return; return;
} }
await fetchTwitterInfo(); const twitterInfo = await fetchTwitterInfo();
setTwitterAuthInfo(twitterInfo);
await initWallet(); await initWallet();
@ -62,7 +73,7 @@ export default function VerificationPage() {
handleVerification(); handleVerification();
}, []); }, []);
const fetchTwitterInfo = async () => { const fetchTwitterInfo = async (): Promise<TwitterAuthInfoResponse> => {
const [, state, code] = const [, state, code] =
window.location.search.match( window.location.search.match(
/^(?=.*state=([^&]+)|)(?=.*code=([^&]+)|).+$/, /^(?=.*state=([^&]+)|)(?=.*code=([^&]+)|).+$/,
@ -72,7 +83,7 @@ export default function VerificationPage() {
`/api/twitter-auth-info?state=${state}&code=${code}`, `/api/twitter-auth-info?state=${state}&code=${code}`,
); );
setTwitterAuthInfo(newTwitterAuthInfo); return newTwitterAuthInfo;
}; };
const initWallet = async () => { const initWallet = async () => {
@ -144,8 +155,8 @@ export default function VerificationPage() {
} }
}; };
const verifyTwitterAccount = async () => { const verifyTwitterAccount = async (accessToken: string) => {
if (twitterAuthInfo && wallet) { if (wallet) {
const key = await wallet.getKey(MainChainId); const key = await wallet.getKey(MainChainId);
const icnsVerificationList = ( const icnsVerificationList = (
@ -156,19 +167,121 @@ export default function VerificationPage() {
}, },
body: JSON.stringify({ body: JSON.stringify({
claimer: key.bech32Address, claimer: key.bech32Address,
authToken: twitterAuthInfo.accessToken, authToken: accessToken,
}), }),
}) })
).verificationList; ).verificationList;
console.log(icnsVerificationList); return icnsVerificationList;
}
};
const checkAdr36 = async () => {
if (twitterAuthInfo && wallet) {
const key = await wallet.getKey(MainChainId);
const chainIds = Array.from(checkedItems).map(
(chain) => (chain as ChainItemType).chainId,
);
const adr36Infos = await wallet.signICNSAdr36(
MainChainId,
RESOLVER_ADDRESS,
key.bech32Address,
twitterAuthInfo.username,
chainIds,
);
return adr36Infos;
} }
}; };
const onClickRegistration = async () => { const onClickRegistration = async () => {
await verifyTwitterAccount(); const adr36Infos = await checkAdr36();
await router.push("/complete"); const twitterInfo = await fetchTwitterInfo();
const icnsVerificationList = await verifyTwitterAccount(
twitterInfo.accessToken,
);
if (wallet && icnsVerificationList && adr36Infos) {
const key = await wallet.getKey(MainChainId);
const registerMsg = makeCosmwasmExecMsg(
key.bech32Address,
REGISTRAR_ADDRESS,
{
claim: {
name: twitterInfo.username,
verifying_msg:
icnsVerificationList[0].status === "fulfilled"
? icnsVerificationList[0].value.data.verifying_msg
: "",
verifications: icnsVerificationList.map((verification) => {
if (verification.status === "fulfilled") {
return {
public_key: verification.value.data.public_key,
signature: verification.value.data.signature,
};
}
}),
},
},
[
{
denom: "uosmo",
amount: "500000",
},
],
);
const addressMsgs = adr36Infos.map((adr36Info) => {
return makeCosmwasmExecMsg(
key.bech32Address,
RESOLVER_ADDRESS,
{
set_record: {
name: twitterInfo.username,
bech32_prefix: adr36Info.bech32Prefix,
adr36_info: {
signer_bech32_address: adr36Info.bech32Address,
address_hash: adr36Info.addressHash,
pub_key: Buffer.from(adr36Info.pubKey).toString("base64"),
signature: Buffer.from(adr36Info.signature).toString("base64"),
signature_salt: adr36Info.signatureSalt.toString(),
},
},
},
[],
);
});
const aminoMsgs = [registerMsg.amino];
const protoMsgs = [registerMsg.proto];
for (const addressMsg of addressMsgs) {
aminoMsgs.push(addressMsg.amino);
protoMsgs.push(addressMsg.proto);
}
const chainInfo = {
chainId: MainChainId,
rest: REST_URL,
};
const simulated = await simulateMsgs(
chainInfo,
key.bech32Address,
{
proto: protoMsgs,
},
{
amount: [],
},
);
console.log("simulated", simulated);
}
}; };
return ( return (