diff --git a/mover/Zimknn/code/task4/Move.lock b/mover/Zimknn/code/task4/Move.lock new file mode 100644 index 000000000..a69b774d1 --- /dev/null +++ b/mover/Zimknn/code/task4/Move.lock @@ -0,0 +1,43 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 2 +manifest_digest = "3ABF32818B72E6D04438DED6A1EE7108F878BD790FA71CF7256257AEA16B0E43" +deps_digest = "3C4103934B1E040BB6B23F1D610B4EF9F2F1166A50A104EADCF77467C004C600" +dependencies = [ + { name = "Sui" }, + { name = "task2" }, +] + +[[move.package]] +name = "MoveStdlib" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "framework/testnet", subdir = "crates/sui-framework/packages/move-stdlib" } + +[[move.package]] +name = "Sui" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "framework/testnet", subdir = "crates/sui-framework/packages/sui-framework" } + +dependencies = [ + { name = "MoveStdlib" }, +] + +[[move.package]] +name = "task2" +source = { local = "../task2" } + +dependencies = [ + { name = "Sui" }, +] + +[move.toolchain-version] +compiler-version = "1.29.2" +edition = "2024.beta" +flavor = "sui" + +[env] + +[env.testnet] +chain-id = "4c78adac" +original-published-id = "0x3f1f464e51c7f96bc4f707d74d0ec132dbf4a2bc097828001724e4c4a0151baf" +latest-published-id = "0x3f1f464e51c7f96bc4f707d74d0ec132dbf4a2bc097828001724e4c4a0151baf" +published-version = "1" diff --git a/mover/Zimknn/code/task4/Move.toml b/mover/Zimknn/code/task4/Move.toml new file mode 100644 index 000000000..b83b8eef9 --- /dev/null +++ b/mover/Zimknn/code/task4/Move.toml @@ -0,0 +1,39 @@ +[package] +name = "task4" +edition = "2024.beta" # edition = "legacy" to use legacy (pre-2024) Move +# license = "" # e.g., "MIT", "GPL", "Apache 2.0" +# authors = ["..."] # e.g., ["Joe Smith (joesmith@noemail.com)", "John Snow (johnsnow@noemail.com)"] + +[dependencies] +Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "framework/testnet" } +task2 = { local = "../task2" } + +# For remote import, use the `{ git = "...", subdir = "...", rev = "..." }`. +# Revision can be a branch, a tag, and a commit hash. +# MyRemotePackage = { git = "https://some.remote/host.git", subdir = "remote/path", rev = "main" } + +# For local dependencies use `local = path`. Path is relative to the package root +# Local = { local = "../path/to" } + +# To resolve a version conflict and force a specific version for dependency +# override use `override = true` +# Override = { local = "../conflicting/version", override = true } + +[addresses] +task4 = "0x0" +task2 = "0x2f980ae2b2a73f93cf6b8a0d8744627dab914b5270c3dfbd4ca63758ac2d21fe" + +# Named addresses will be accessible in Move as `@name`. They're also exported: +# for example, `std = "0x1"` is exported by the Standard Library. +# alice = "0xA11CE" + +[dev-dependencies] +# The dev-dependencies section allows overriding dependencies for `--test` and +# `--dev` modes. You can introduce test-only dependencies here. +# Local = { local = "../path/to/dev-build" } + +[dev-addresses] +# The dev-addresses section allows overwriting named addresses for the `--test` +# and `--dev` modes. +# alice = "0xB0B" + diff --git a/mover/Zimknn/code/task4/sources/task4.move b/mover/Zimknn/code/task4/sources/task4.move new file mode 100644 index 000000000..38da28b05 --- /dev/null +++ b/mover/Zimknn/code/task4/sources/task4.move @@ -0,0 +1,92 @@ +module task4::flip_coin { + + use sui::balance; + use sui::balance::{Balance, zero}; + use sui::coin; + use sui::coin::{from_balance, into_balance}; + use sui::random; + use sui::random::Random; + use sui::transfer::{share_object, transfer, public_transfer}; + use sui::tx_context::sender; + use task2::zimknn_faucet_coin::{ZIMKNN_FAUCET_COIN}; + + public struct Game has key { + id: UID, + val: Balance + } + + public struct AdaminCap has key { + id: UID + } + + + fun init(ctx: &mut TxContext) { + let game = Game { + id: object::new(ctx), + val: zero() + }; + + share_object(game); + + let admin = AdaminCap { + id: object::new(ctx) + }; + + transfer(admin, sender(ctx)); + } + #[allow(lint(public_random))] + public entry fun play( + game: &mut Game, + flip_value: bool, + in: coin::Coin, + rand: &Random, + ctx: &mut TxContext + ) { + let coin_value = coin::value(&in); + + let game_val = balance::value(&game.val); + + // 池子总量大于投注数量,防止给用户返还资金不够 + if (game_val < coin_value) { + abort 0 + }; + // 池子总量大于投注数量10倍,防止all in漏洞 + if (game_val < coin_value * 10) { + abort 1 + }; + + let mut gen = random::new_generator(rand, ctx); + let flag = random::generate_bool(&mut gen); + + let play_address = sender(ctx); + if (flip_value == flag) { + withdraw(game, coin_value, play_address, ctx); + public_transfer(in, play_address); + } else { + deposit(game, in, ctx); + } + } + + fun deposit(game: &mut Game, in: coin::Coin, _ctx: &mut TxContext) { + let in_balance = into_balance(in); + balance::join(&mut game.val, in_balance); + } + + public entry fun public_deposit( + game: &mut Game, + in: coin::Coin, + ctx: &mut TxContext + ) { + deposit(game, in, ctx); + } + + fun withdraw(game: &mut Game, amt: u64, to: address, ctx: &mut TxContext) { + let win_balance = balance::split(&mut game.val, amt); + let win_coin = from_balance(win_balance, ctx); + public_transfer(win_coin, to); + } + + public entry fun public_withdraw(_: &AdaminCap, game: &mut Game, amt: u64, ctx: &mut TxContext) { + withdraw(game, amt, sender(ctx), ctx); + } +} \ No newline at end of file diff --git a/mover/Zimknn/code/task5/Move.lock b/mover/Zimknn/code/task5/Move.lock new file mode 100644 index 000000000..c5a6bf5d9 --- /dev/null +++ b/mover/Zimknn/code/task5/Move.lock @@ -0,0 +1,34 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 2 +manifest_digest = "39149E9191F5A7299278C257F4DBF8CA774C7A7EC549B5951C87448D6A311A49" +deps_digest = "F8BBB0CCB2491CA29A3DF03D6F92277A4F3574266507ACD77214D37ECA3F3082" +dependencies = [ + { name = "Sui" }, +] + +[[move.package]] +name = "MoveStdlib" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "framework/mainnet", subdir = "crates/sui-framework/packages/move-stdlib" } + +[[move.package]] +name = "Sui" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "framework/mainnet", subdir = "crates/sui-framework/packages/sui-framework" } + +dependencies = [ + { name = "MoveStdlib" }, +] + +[move.toolchain-version] +compiler-version = "1.28.4" +edition = "2024.beta" +flavor = "sui" + +[env] + +[env.mainnet] +chain-id = "35834a8a" +original-published-id = "0x60f45a1dcbb8fee154af0f8c0e0dc41a171f3050ead824aad23037b9c8448c07" +latest-published-id = "0x60f45a1dcbb8fee154af0f8c0e0dc41a171f3050ead824aad23037b9c8448c07" +published-version = "1" diff --git a/mover/Zimknn/code/task5/Move.toml b/mover/Zimknn/code/task5/Move.toml new file mode 100644 index 000000000..fef2bd16c --- /dev/null +++ b/mover/Zimknn/code/task5/Move.toml @@ -0,0 +1,37 @@ +[package] +name = "task5" +edition = "2024.beta" # edition = "legacy" to use legacy (pre-2024) Move +# license = "" # e.g., "MIT", "GPL", "Apache 2.0" +# authors = ["..."] # e.g., ["Joe Smith (joesmith@noemail.com)", "John Snow (johnsnow@noemail.com)"] + +[dependencies] +Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "framework/mainnet" } + +# For remote import, use the `{ git = "...", subdir = "...", rev = "..." }`. +# Revision can be a branch, a tag, and a commit hash. +# MyRemotePackage = { git = "https://some.remote/host.git", subdir = "remote/path", rev = "main" } + +# For local dependencies use `local = path`. Path is relative to the package root +# Local = { local = "../path/to" } + +# To resolve a version conflict and force a specific version for dependency +# override use `override = true` +# Override = { local = "../conflicting/version", override = true } + +[addresses] +task5 = "0x0" + +# Named addresses will be accessible in Move as `@name`. They're also exported: +# for example, `std = "0x1"` is exported by the Standard Library. +# alice = "0xA11CE" + +[dev-dependencies] +# The dev-dependencies section allows overriding dependencies for `--test` and +# `--dev` modes. You can introduce test-only dependencies here. +# Local = { local = "../path/to/dev-build" } + +[dev-addresses] +# The dev-addresses section allows overwriting named addresses for the `--test` +# and `--dev` modes. +# alice = "0xB0B" + diff --git a/mover/Zimknn/code/task5/sources/task5.move b/mover/Zimknn/code/task5/sources/task5.move new file mode 100644 index 000000000..343bf61a9 --- /dev/null +++ b/mover/Zimknn/code/task5/sources/task5.move @@ -0,0 +1,261 @@ +module task5::zimknn_swap { + use sui::coin::{Self, Coin}; + use sui::balance::{Self, Supply, Balance}; + use sui::math; + + const EZeroAmount: u64 = 0; + + const EReservesEmpty: u64 = 2; + + const EPoolFull: u64 = 4; + + const FEE_SCALING: u128 = 10000; + + const FEE_PERCENT: u128 = 30; + + const MAX_POOL_VALUE: u64 = { + 18446744073709551615 / 10000 + }; + + public struct LSP has drop {} + + public struct Pool has key { + id: UID, + token_a: Balance, + token_b: Balance, + lsp_supply: Supply>, + /// Fee Percent is denominated in basis points. + fee_percent: u64 + } + + fun init(_: &mut TxContext) { + } + + entry fun create_pool ( + token_a: Coin, + token_b: Coin, + ctx: &mut TxContext + ) { + transfer::public_transfer( + create_pool_inner(token_a, token_b, ctx), + tx_context::sender(ctx) + ); + } + + fun create_pool_inner ( + token_a: Coin, + token_b: Coin, + ctx: &mut TxContext + ): Coin> { + let fee_percent = (FEE_PERCENT as u64); + + let token_a_amt = coin::value(&token_a); + let token_b_amt = coin::value(&token_b); + + assert!(token_a_amt > 0 && token_b_amt > 0, EZeroAmount); + assert!(token_a_amt < MAX_POOL_VALUE && token_b_amt < MAX_POOL_VALUE, EPoolFull); + + let share = math::sqrt(token_a_amt) * math::sqrt(token_b_amt); + let mut lsp_supply = balance::create_supply(LSP {}); + let lsp = balance::increase_supply(&mut lsp_supply, share); + + transfer::share_object(Pool { + id: object::new(ctx), + token_a: coin::into_balance(token_a), + token_b: coin::into_balance(token_b), + lsp_supply, + fee_percent, + }); + + coin::from_balance(lsp, ctx) + } + + entry fun add_liquidity ( + pool: &mut Pool, + token_a: Coin, + token_b: Coin, + ctx: &mut TxContext + ) { + transfer::public_transfer( + add_liquidity_inner(pool, token_a, token_b, ctx), + tx_context::sender(ctx) + ) + } + + fun add_liquidity_inner ( + pool: &mut Pool, + token_a: Coin, + token_b: Coin, + ctx: &mut TxContext + ): Coin> { + assert!(coin::value(&token_a) > 0 && coin::value(&token_b) > 0, EZeroAmount); + + let (token_a_amt, token_b_amt, lsp_supply) = get_amounts(pool); + assert!(token_a_amt > 0 && token_b_amt > 0, EReservesEmpty); + + let token_a_balance = coin::into_balance(token_a); + let token_b_balance = coin::into_balance(token_b); + + let token_a_added = balance::value(&token_a_balance); + let token_b_added = balance::value(&token_b_balance); + + let share_minted = math::min( + (token_a_added * lsp_supply) / token_a_amt, + (token_b_added * lsp_supply) / token_b_amt + ); + + let token_a_amt = balance::join(&mut pool.token_a, token_a_balance); + let token_b_amt = balance::join(&mut pool.token_b, token_b_balance); + + assert!(token_a_amt < MAX_POOL_VALUE && token_b_amt < MAX_POOL_VALUE, EPoolFull); + + let balance = balance::increase_supply(&mut pool.lsp_supply, share_minted); + + coin::from_balance(balance, ctx) + } + + entry fun remove_liquidity ( + pool: &mut Pool, + lsp: Coin>, + ctx: &mut TxContext + ) { + let (token_a, token_b) = remove_liquidity_inner(pool, lsp, ctx); + let sender = tx_context::sender(ctx); + + transfer::public_transfer(token_a, sender); + transfer::public_transfer(token_b, sender); + } + + fun remove_liquidity_inner ( + pool: &mut Pool, + lsp: Coin>, + ctx: &mut TxContext + ): (Coin, Coin) { + let lsp_amount = coin::value(&lsp); + assert!(lsp_amount > 0, EZeroAmount); + + let (token_a_amt, token_b_amt, total_supply) = get_amounts(pool); + + let token_a = (token_a_amt * lsp_amount) / total_supply; + let token_b = (token_b_amt * lsp_amount) / total_supply; + + balance::decrease_supply(&mut pool.lsp_supply, coin::into_balance(lsp)); + + ( + coin::take(&mut pool.token_a, token_a, ctx), + coin::take(&mut pool.token_b, token_b, ctx), + ) + } + + entry fun swap_a_to_b ( + pool: &mut Pool, + token_a: Coin, + ctx: &mut TxContext + ) { + transfer::public_transfer( + swap_a_to_b_inner(pool, token_a, ctx), + tx_context::sender(ctx) + ) + } + + fun swap_a_to_b_inner ( + pool: &mut Pool, + token_a: Coin, + ctx: &mut TxContext + ): Coin { + let token_a_amt = coin::value(&token_a); + assert!(token_a_amt > 0, EZeroAmount); + + let (token_a_amt, token_b_amt, _) = get_amounts(pool); + assert!(token_a_amt > 0 && token_b_amt > 0, EReservesEmpty); + + let token_b_amt = sell_token_a(pool, token_a_amt); + + balance::join(&mut pool.token_a, coin::into_balance(token_a)); + + coin::take(&mut pool.token_b, token_b_amt, ctx) + } + + entry fun swap_b_to_a ( + pool: &mut Pool, + token_b: Coin, + ctx: &mut TxContext + ) { + transfer::public_transfer( + swap_b_to_a_inner(pool, token_b, ctx), + tx_context::sender(ctx) + ) + } + + fun swap_b_to_a_inner ( + pool: &mut Pool, + token_b: Coin, + ctx: &mut TxContext + ): Coin { + let token_b_amt = coin::value(&token_b); + assert!(token_b_amt > 0, EZeroAmount); + + let (token_a_amt, token_b_amt, _) = get_amounts(pool); + assert!(token_a_amt > 0 && token_b_amt > 0, EReservesEmpty); + + let token_a_amt = sell_token_b(pool, token_b_amt); + + balance::join(&mut pool.token_b, coin::into_balance(token_b)); + + coin::take(&mut pool.token_a, token_a_amt, ctx) + } + + public fun sell_token_a(pool: &Pool, to_sell: u64): u64 { + let (token_a_amt, token_b_amt, _) = get_amounts(pool); + calc_output_amount( + to_sell, + token_a_amt, + token_b_amt, + pool.fee_percent + ) + } + + public fun sell_token_b(pool: &Pool, to_sell: u64): u64 { + let (token_a_amt, token_b_amt, _) = get_amounts(pool); + calc_output_amount( + to_sell, + token_b_amt, + token_a_amt, + pool.fee_percent + ) + } + + public fun get_amounts(pool: &Pool): (u64, u64, u64) { + ( + balance::value(&pool.token_a), + balance::value(&pool.token_b), + balance::supply_value(&pool.lsp_supply), + ) + } + + public fun calc_output_amount( + input_amount: u64, + input_reserve: u64, + output_reserve: u64, + fee_percent: u64 + ): u64 { + let ( + input_amount, + input_reserve, + output_reserve, + fee_percent + ) = ( + (input_amount as u128), + (input_reserve as u128), + (output_reserve as u128), + (fee_percent as u128), + ); + + let input_with_fee = input_amount * FEE_SCALING / (FEE_SCALING - fee_percent); + + let total = input_reserve * output_reserve; + let output_amount = output_reserve - total / (input_reserve + input_with_fee); + + (output_amount as u64) + } +} diff --git a/mover/Zimknn/code/task6/index.html b/mover/Zimknn/code/task6/index.html new file mode 100644 index 000000000..bb7f75b16 --- /dev/null +++ b/mover/Zimknn/code/task6/index.html @@ -0,0 +1,59 @@ + + + + + + + Sui dApp Starter + + + + +
+ + + diff --git a/mover/Zimknn/code/task6/package.json b/mover/Zimknn/code/task6/package.json new file mode 100644 index 000000000..4d2443da7 --- /dev/null +++ b/mover/Zimknn/code/task6/package.json @@ -0,0 +1,36 @@ +{ + "name": "basic-dapp-ptb", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@mysten/dapp-kit": "0.14.11", + "@mysten/sui": "1.2.1", + "@radix-ui/colors": "^3.0.0", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/themes": "^2.0.0", + "@tanstack/react-query": "^5.0.0", + "navi-sdk": "^1.1.23", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.1.0", + "@typescript-eslint/parser": "^6.1.0", + "@vitejs/plugin-react-swc": "^3.3.2", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "prettier": "^3.0.0", + "typescript": "^5.3.3", + "vite": "^4.4.4" + } +} diff --git a/mover/Zimknn/code/task6/prettier.config.cjs b/mover/Zimknn/code/task6/prettier.config.cjs new file mode 100644 index 000000000..c07541106 --- /dev/null +++ b/mover/Zimknn/code/task6/prettier.config.cjs @@ -0,0 +1,4 @@ +// eslint-disable-next-line no-undef +module.exports = { + proseWrap: "always", +}; diff --git a/mover/Zimknn/code/task6/src/Execute.tsx b/mover/Zimknn/code/task6/src/Execute.tsx new file mode 100644 index 000000000..828522541 --- /dev/null +++ b/mover/Zimknn/code/task6/src/Execute.tsx @@ -0,0 +1,61 @@ +import {useCurrentAccount, useSignAndExecuteTransaction} from "@mysten/dapp-kit"; +import {Container, Flex, Heading, Text, Button} from "@radix-ui/themes"; +import {supply_borrow_supply} from "./transactions/navi.ts"; + +const formatDateNumber = (num: number) => { + return num < 10 ? `0${num}` : num; +} + +const Execute = () => { + const account = useCurrentAccount(); + const {mutate: signAndExecute} = useSignAndExecuteTransaction(); + + const date = new Date(); + const month = formatDateNumber(date.getMonth() + 1); + const day = formatDateNumber(date.getDate()); + const hour = formatDateNumber(date.getHours()); + const usdcAmt = Number(`0.${month}${day}${hour}`); + + return ( + + Wallet Status + + {account ? ( + + Wallet connected + Address: {account.address} + + ) : ( + Wallet not connected + )} + + {account ? ( + + 执行交易 + + 1. [存入Navi Protocol 1 SUI] + {`2.[借出当前日期的USDC ${usdcAmt} 的 USDC ]`} + 3.[然后在存入等额的USDC] + + + + ) : null} + + ); +} + +export default Execute; diff --git a/mover/Zimknn/code/task6/src/const.ts b/mover/Zimknn/code/task6/src/const.ts new file mode 100644 index 000000000..48f89f7f0 --- /dev/null +++ b/mover/Zimknn/code/task6/src/const.ts @@ -0,0 +1,2 @@ +export const SUI_COIN_TYPE = '0x2::coin::Coin<0x2::sui::SUI>'; +export const USDC_COIN_TYPE = '0x2::coin::Coin<0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf::coin::COIN>'; diff --git a/mover/Zimknn/code/task6/src/main.tsx b/mover/Zimknn/code/task6/src/main.tsx new file mode 100644 index 000000000..21e0bec07 --- /dev/null +++ b/mover/Zimknn/code/task6/src/main.tsx @@ -0,0 +1,37 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import "@mysten/dapp-kit/dist/index.css"; +import "@radix-ui/themes/styles.css"; + +import { getFullnodeUrl } from "@mysten/sui/client"; +import { + SuiClientProvider, + WalletProvider, + createNetworkConfig, +} from "@mysten/dapp-kit"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { Theme } from "@radix-ui/themes"; +import App from "./App.tsx"; + +const queryClient = new QueryClient(); + +const { networkConfig } = createNetworkConfig({ + localnet: { url: getFullnodeUrl("localnet") }, + devnet: { url: getFullnodeUrl("devnet") }, + testnet: { url: getFullnodeUrl("testnet") }, + mainnet: { url: getFullnodeUrl("mainnet") }, +}); + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + + + + + + + + + , +); diff --git a/mover/Zimknn/code/task6/src/transactions/navi.ts b/mover/Zimknn/code/task6/src/transactions/navi.ts new file mode 100644 index 000000000..103f12cc4 --- /dev/null +++ b/mover/Zimknn/code/task6/src/transactions/navi.ts @@ -0,0 +1,43 @@ +import { TransactionBlock } from '@mysten/sui.js/transactions'; +import { Transaction } from '@mysten/sui/transactions'; +import { depositCoin, borrowCoin, } from 'navi-sdk/dist/libs/PTB' +import { Sui, USDC } from "navi-sdk/dist/address"; +import { Pool, PoolConfig } from "navi-sdk/dist/types"; +import { pool } from 'navi-sdk/dist/address' + + +export const supply_borrow_supply = async ({ signAndExecute, usdcAmt, onSuccess = () => { }, onError = () => { } }: { + signAndExecute: any; + usdcAmt: number; + onSuccess?: (result: any) => void; + onError?: (result: any) => void; +}) => { + let tx = new Transaction(); + + // 设置gas + tx.setGasBudget(1e9); + + // 分离出1sui + const [sui_1] = tx.splitCoins(tx.gas, [1e9]); + + // // 存入navi + const Sui_Pool: PoolConfig = pool[Sui.symbol as keyof Pool]; + await depositCoin(tx as any as TransactionBlock, Sui_Pool, sui_1, 1e9); + + // // 借出 usdc + const USDC_Pool: PoolConfig = pool[USDC.symbol as keyof Pool]; + const [usdc_coin] = await borrowCoin(tx as any as TransactionBlock, USDC_Pool, usdcAmt * 1e6); + + // // 存入 usdc + await depositCoin(tx as any as TransactionBlock, USDC_Pool, usdc_coin, usdcAmt * 1e6); + + // 签名执行交易 + await signAndExecute({ + transaction: tx, + }, { + onSuccess, + onError, + }); + +} + diff --git a/mover/Zimknn/code/task6/src/vite-env.d.ts b/mover/Zimknn/code/task6/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/mover/Zimknn/code/task6/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/mover/Zimknn/code/task6/tsconfig.json b/mover/Zimknn/code/task6/tsconfig.json new file mode 100644 index 000000000..a7fc6fbf2 --- /dev/null +++ b/mover/Zimknn/code/task6/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/mover/Zimknn/code/task6/tsconfig.node.json b/mover/Zimknn/code/task6/tsconfig.node.json new file mode 100644 index 000000000..42872c59f --- /dev/null +++ b/mover/Zimknn/code/task6/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/mover/Zimknn/code/task6/vite.config.ts b/mover/Zimknn/code/task6/vite.config.ts new file mode 100644 index 000000000..d366e8c8d --- /dev/null +++ b/mover/Zimknn/code/task6/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react-swc"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}); diff --git a/mover/Zimknn/readme.md b/mover/Zimknn/readme.md index b68b80a93..fde13c681 100644 --- a/mover/Zimknn/readme.md +++ b/mover/Zimknn/readme.md @@ -32,18 +32,18 @@ - [x] scan上的NFT截图:![Scan截图](./images/3.png) ## 04 Move Game -- [] game package id : -- [] deposit Coin hash: -- [] withdraw `Coin` hash: -- [] play game hash: +- [x] game package id: 0x3f1f464e51c7f96bc4f707d74d0ec132dbf4a2bc097828001724e4c4a0151baf +- [x] deposit Coin hash: 5cfWVGueaiprYudEoHAHj8R9HcTR24hZeeWUE1UiwL2U +- [x] withdraw `Coin` hash: GFsm1UD4pLstbpMdEaZkFLEZ7ZdX4D8UfGcrbdeqjWh6 +- [x] play game hash: 6SoDei5yuSD5vjrsemtVtCtjJvcs4474f6k5zKJwoTDG ## 05 Move Swap -- [] swap package id : -- [] call swap CoinA-> CoinB hash : -- [] call swap CoinB-> CoinA hash : +- [x] swap package id : 0x60f45a1dcbb8fee154af0f8c0e0dc41a171f3050ead824aad23037b9c8448c07 +- [x] call swap CoinA-> CoinB hash : AwAvob7gkvjUL7DatNCgWu2dbSLzeAAr8j6X78Tq45ox +- [x] call swap CoinB-> CoinA hash : DAcPFxNXcvNVQKvfjPqySJqrRXPeSkVcnk8h8K8MScS ## 06 Dapp-kit SDK PTB -- [] save hash : +- [x] save hash : ACF95mGZPubeRdXDA3cftSiJV2rua5cWfiT2Vn2iE3Q8 ## 07 Move CTF Check In - [] CLI call 截图 : ![截图](./images/你的图片地址)