From db5339b18077fa7a4cbbe49283525f86304da8d7 Mon Sep 17 00:00:00 2001 From: garikbesson Date: Mon, 28 Oct 2024 15:46:25 +0100 Subject: [PATCH] update dependencies, code structure, tests, README --- .cargo/config | 2 - .gitpod.Dockerfile | 8 - .gitpod.yml | 7 - Cargo.toml | 18 + README-Windows.md | 112 ---- README.md | 165 ++---- ft/Cargo.toml | 17 - integration-tests/rs/Cargo.toml | 28 - integration-tests/rs/src/tests.rs | 507 ------------------ integration-tests/ts/ava.config.cjs | 9 - integration-tests/ts/package.json | 16 - integration-tests/ts/src/main.ava.ts | 243 --------- res/defi.wasm | Bin 130066 -> 0 bytes res/fungible_token.wasm | Bin 234861 -> 0 bytes rustfmt.toml | 1 - scripts/build.bat | 7 - scripts/build.sh | 6 - {ft/src => src}/lib.rs | 142 ++++- test-contract-defi/Cargo.toml | 17 - tests/contracts/defi/Cargo.toml | 15 + .../contracts/defi}/src/lib.rs | 45 +- tests/init.rs | 87 +++ tests/main.rs | 2 + tests/tests/mod.rs | 3 + tests/tests/storage.rs | 292 ++++++++++ tests/tests/supply.rs | 18 + tests/tests/transfer.rs | 301 +++++++++++ 27 files changed, 913 insertions(+), 1155 deletions(-) delete mode 100644 .cargo/config delete mode 100644 .gitpod.Dockerfile delete mode 100644 .gitpod.yml create mode 100644 Cargo.toml delete mode 100644 README-Windows.md delete mode 100644 ft/Cargo.toml delete mode 100644 integration-tests/rs/Cargo.toml delete mode 100644 integration-tests/rs/src/tests.rs delete mode 100644 integration-tests/ts/ava.config.cjs delete mode 100644 integration-tests/ts/package.json delete mode 100644 integration-tests/ts/src/main.ava.ts delete mode 100755 res/defi.wasm delete mode 100755 res/fungible_token.wasm delete mode 100644 rustfmt.toml delete mode 100644 scripts/build.bat delete mode 100755 scripts/build.sh rename {ft/src => src}/lib.rs (62%) delete mode 100644 test-contract-defi/Cargo.toml create mode 100644 tests/contracts/defi/Cargo.toml rename {test-contract-defi => tests/contracts/defi}/src/lib.rs (60%) create mode 100644 tests/init.rs create mode 100644 tests/main.rs create mode 100644 tests/tests/mod.rs create mode 100644 tests/tests/storage.rs create mode 100644 tests/tests/supply.rs create mode 100644 tests/tests/transfer.rs diff --git a/.cargo/config b/.cargo/config deleted file mode 100644 index 9c624f7..0000000 --- a/.cargo/config +++ /dev/null @@ -1,2 +0,0 @@ -[build] -rustflags = ["-C", "link-args=-s"] \ No newline at end of file diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile deleted file mode 100644 index bc2641a..0000000 --- a/.gitpod.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM gitpod/workspace-full - -ENV CARGO_HOME=/home/gitpod/.cargo - -RUN bash -cl "rustup toolchain install stable && rustup target add wasm32-unknown-unknown" - -RUN bash -c ". .nvm/nvm.sh \ - && nvm install v12 && nvm alias default v12" \ No newline at end of file diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index 4d043d4..0000000 --- a/.gitpod.yml +++ /dev/null @@ -1,7 +0,0 @@ -image: - file: .gitpod.Dockerfile -# List the start up tasks. You can start them in parallel in multiple terminals. See https://www.gitpod.io/docs/config-start-tasks/ -tasks: - - before: echo "nvm use default" >> ~/.bashrc && npm install -g near-cli --no-optional && nvm use default - init: yarn - command: clear && echo Hey! Check out examples of how to build a NEP-21 Fungible Token in Rust. diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..6b43dca --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "fungible-token" +version = "1.0.0" +authors = ["Near Inc "] +edition = "2018" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +near-sdk = "5.5.0" +near-contract-standards = "5.5.0" + +[dev-dependencies] +near-sdk = { version = "5.5.0", features = ["unit-testing"] } +near-workspaces = { version = "0.14.1", features = ["unstable"] } +anyhow = "1.0" +tokio = { version = "1.41.0", features = ["full"] } diff --git a/README-Windows.md b/README-Windows.md deleted file mode 100644 index c73c261..0000000 --- a/README-Windows.md +++ /dev/null @@ -1,112 +0,0 @@ -Fungible Token (FT) -=================== - -Example implementation of a [Fungible Token] contract which uses [near-contract-standards] and [simulation] tests. This is a contract-only example. - -**Note**: this README is specific to Windows and this example. For development on OS X or Linux, please see [README.md](README.md). - - [Fungible Token]: https://nomicon.io/Standards/Tokens/FungibleTokenCore.html - [near-contract-standards]: https://github.com/near/near-sdk-rs/tree/master/near-contract-standards - [simulation]: https://github.com/near/near-sdk-rs/tree/master/near-sdk-sim - -Prerequisites -============= - -If you're using Gitpod, you can skip this step. - -1. Make sure Rust is installed per the prerequisites in [`near-sdk-rs`](https://github.com/near/near-sdk-rs#pre-requisites) -2. Ensure `near-cli` is installed by running `near --version`. If not installed, install with: `npm install --global near-cli` - -## Building - -To build run in CMD: -```bash -build.bat -``` - -Using this contract -=================== - -This smart contract will get deployed to your NEAR account. For this example, please create a new NEAR account. Because NEAR allows the ability to upgrade contracts on the same account, initialization functions must be cleared. If you'd like to run this example on a NEAR account that has had prior contracts deployed, please use the `near-cli` command `near delete`, and then recreate it in Wallet. To create (or recreate) an account, please follow the directions on [NEAR Wallet](https://wallet.near.org/). - -Switch to `mainnet`. You can skip this step to use `testnet` as a default network. - - set NEAR_ENV=mainnet - -In the project root, log in to your newly created account with `near-cli` by following the instructions after this command: - - near login - -To make this tutorial easier to copy/paste, we're going to set an environment variable for your account id. In the below command, replace `MY_ACCOUNT_NAME` with the account name you just logged in with, including the `.near`: - - set ID=MY_ACCOUNT_NAME - -You can tell if the environment variable is set correctly if your command line prints the account name after this command: - - echo %ID% - -Now we can deploy the compiled contract in this example to your account: - - near deploy --wasmFile res/fungible_token.wasm --accountId %ID% - -FT contract should be initialized before usage. You can read more about metadata at ['nomicon.io'](https://nomicon.io/Standards/FungibleToken/Metadata.html#reference-level-explanation). Modify the parameters and create a token: - - near call %ID% new "{\"owner_id\": \""%ID%"\", \"total_supply\": \"1000000000000000\", \"metadata\": { \"spec\": \"ft-1.0.0\", \"name\": \"Example Token Name\", \"symbol\": \"EXLT\", \"decimals\": 8 }}" --accountId %ID% - -Get metadata: - - near view %ID% ft_metadata - - -Transfer Example ---------------- - -Let's set up an account to transfer some tokens to. These account will be a sub-account of the NEAR account you logged in with. - - near create-account bob.%ID% --masterAccount %ID% --initialBalance 1 - -Add storage deposit for Bob's account: - - near call %ID% storage_deposit '' --accountId bob.%ID% --amount 0.00125 - -Check balance of Bob's account, it should be `0` for now: - - near view %ID% ft_balance_of "{\"account_id\": \""bob.%ID%"\"}" - -Transfer tokens to Bob from the contract that minted these fungible tokens, exactly 1 yoctoNEAR of deposit should be attached: - - near call %ID% ft_transfer "{\"receiver_id\": \""bob.%ID%"\", \"amount\": \"19\"}" --accountId %ID% --amount 0.000000000000000000000001 - - -Check the balance of Bob again with the command from before and it will now return `19`. - -## Testing - -As with many Rust libraries and contracts, there are tests in the main fungible token implementation at `ft/src/lib.rs`. - -Additionally, this project has [simulation] tests in `tests/sim`. Simulation tests allow testing cross-contract calls, which is crucial to ensuring that the `ft_transfer_call` function works properly. These simulation tests are the reason this project has the file structure it does. Note that the root project has a `Cargo.toml` which sets it up as a workspace. `ft` and `test-contract-defi` are both small & focused contract projects, the latter only existing for simulation tests. The root project imports `near-sdk-sim` and tests interaction between these contracts. - -You can run all these tests with one command: - -```bash -cargo test -``` - -If you want to run only simulation tests, you can use `cargo test simulate`, since all the simulation tests include "simulate" in their names. - - -## Notes - - - The maximum balance value is limited by U128 (`2**128 - 1`). - - JSON calls should pass U128 as a base-10 string. E.g. "100". - - This does not include escrow functionality, as `ft_transfer_call` provides a superior approach. An escrow system can, of course, be added as a separate contract or additional functionality within this contract. - -## No AssemblyScript? - -[near-contract-standards] is currently Rust-only. We strongly suggest using this library to create your own Fungible Token contract to ensure it works as expected. - -Someday NEAR core or community contributors may provide a similar library for AssemblyScript, at which point this example will be updated to include both a Rust and AssemblyScript version. - -## Contributing - -When making changes to the files in `ft` or `test-contract-defi`, remember to use `./build.sh` to compile all contracts and copy the output to the `res` folder. If you forget this, **the simulation tests will not use the latest versions**. diff --git a/README.md b/README.md index c4372c9..22c499b 100644 --- a/README.md +++ b/README.md @@ -1,144 +1,58 @@ -Fungible Token (FT) -=================== +Fungible Token (FT) Example 👋 -Example implementation of a [Fungible Token] contract which uses [near-contract-standards] and [simulation] tests. This is a contract-only example. +[![](https://img.shields.io/badge/⋈%20Examples-Basics-green)](https://docs.near.org/tutorials/welcome) +[![](https://img.shields.io/badge/Contract-Rust-red)](contract-rs) - [Fungible Token]: https://nomicon.io/Standards/FungibleToken/Core - [near-contract-standards]: https://github.com/near/near-sdk-rs/tree/master/near-contract-standards - [simulation]: https://github.com/near/near-sdk-rs/tree/master/near-sdk-sim +This repository contains an example implementation of a [fungible token] contract in Rust which uses [near-contract-standards] and workspaces-rs tests. -Prerequisites -============= +[fungible token]: https://nomicon.io/Standards/FungibleToken/Core +[near-contract-standards]: https://github.com/near/near-sdk-rs/tree/master/near-contract-standards +[near-workspaces-rs]: https://github.com/near/near-workspaces-rs -If you're using Gitpod, you can skip this step. +
-1. Make sure Rust is installed per the prerequisites in [`near-sdk-rs`](https://github.com/near/near-sdk-rs#pre-requisites) -2. Ensure `near-cli` is installed by running `near --version`. If not installed, install with: `npm install -g near-cli` +## How to Build Locally? -## Building +Install [`cargo-near`](https://github.com/near/cargo-near) and run: -To build run: ```bash -./scripts/build.sh +cargo near build ``` -Using this contract -=================== - -### Quickest deploy - -You can build and deploy this smart contract to a development account. [Dev Accounts](https://docs.near.org/concepts/basics/account#dev-accounts) are auto-generated accounts to assist in developing and testing smart contracts. Please see the [Standard deploy](#standard-deploy) section for creating a more personalized account to deploy to. +## How to Test Locally? ```bash -near dev-deploy --wasmFile res/fungible_token.wasm --helperUrl https://near-contract-helper.onrender.com +cargo test ``` -Behind the scenes, this is creating an account and deploying a contract to it. On the console, notice a message like: +## How to Deploy? ->Done deploying to dev-1234567890123 - -In this instance, the account is `dev-1234567890123`. A file has been created containing a key pair to -the account, located at `neardev/dev-account`. To make the next few steps easier, we're going to set an -environment variable containing this development account id and use that when copy/pasting commands. -Run this command to the environment variable: +To deploy manually, install [`cargo-near`](https://github.com/near/cargo-near) and run: ```bash -source neardev/dev-account.env -``` - -You can tell if the environment variable is set correctly if your command line prints the account name after this command: -```bash -echo $CONTRACT_NAME -``` +# Create a new account +cargo near create-dev-account -The next command will initialize the contract using the `new` method: +# Deploy the contract on it +cargo near deploy -```bash -near call $CONTRACT_NAME new '{"owner_id": "'$CONTRACT_NAME'", "total_supply": "1000000000000000", "metadata": { "spec": "ft-1.0.0", "name": "Example Token Name", "symbol": "EXLT", "decimals": 8 }}' --accountId $CONTRACT_NAME +# Initialize the contract +near call new '{"owner_id": "", "total_supply": "1000000000000000", "metadata": { "spec": "ft-1.0.0", "name": "Example Token Name", "symbol": "EXLT", "decimals": 8 }}' --accountId ``` -To get the fungible token metadata: - +## Basic methods ```bash -near view $CONTRACT_NAME ft_metadata -``` - -### Standard deploy - -This smart contract will get deployed to your NEAR account. For this example, please create a new NEAR account. Because NEAR allows the ability to upgrade contracts on the same account, initialization functions must be cleared. If you'd like to run this example on a NEAR account that has had prior contracts deployed, please use the `near-cli` command `near delete`, and then recreate it in Wallet. To create (or recreate) an account, please follow the directions on [NEAR Wallet](https://wallet.near.org/). - -Switch to `mainnet`. You can skip this step to use `testnet` as a default network. - - export NEAR_ENV=mainnet - -In the project root, log in to your newly created account with `near-cli` by following the instructions after this command: - - near login - -To make this tutorial easier to copy/paste, we're going to set an environment variable for your account id. In the below command, replace `MY_ACCOUNT_NAME` with the account name you just logged in with, including the `.near`: - - ID=MY_ACCOUNT_NAME - -You can tell if the environment variable is set correctly if your command line prints the account name after this command: - - echo $ID - -Now we can deploy the compiled contract in this example to your account: - - near deploy --wasmFile res/fungible_token.wasm --accountId $ID - -FT contract should be initialized before usage. You can read more about metadata at ['nomicon.io'](https://nomicon.io/Standards/FungibleToken/Metadata.html#reference-level-explanation). Modify the parameters and create a token: - - near call $ID new '{"owner_id": "'$ID'", "total_supply": "1000000000000000", "metadata": { "spec": "ft-1.0.0", "name": "Example Token Name", "symbol": "EXLT", "decimals": 8 }}' --accountId $ID - -Get metadata: - - near view $ID ft_metadata +# View metadata +near view ft_metadata +# Make a storage deposit +near call storage_deposit '' --accountId --amount 0.00125 -Transfer Example ---------------- +# View balance +near view ft_balance_of '{"account_id": ""}' -Let's set up an account to transfer some tokens to. These account will be a sub-account of the NEAR account you logged in with. - - near create-account bob.$ID --masterAccount $ID --initialBalance 1 - -Add storage deposit for Bob's account: - - near call $ID storage_deposit '' --accountId bob.$ID --amount 0.00125 - - -Check balance of Bob's account, it should be `0` for now: - - near view $ID ft_balance_of '{"account_id": "'bob.$ID'"}' - -Transfer tokens to Bob from the contract that minted these fungible tokens, exactly 1 yoctoNEAR of deposit should be attached: - - near call $ID ft_transfer '{"receiver_id": "'bob.$ID'", "amount": "19"}' --accountId $ID --amount 0.000000000000000000000001 - - -Check the balance of Bob again with the command from before and it will now return `19`. - -## Testing - -As with many Rust libraries and contracts, there are tests in the main fungible token implementation at `ft/src/lib.rs`. - -Additionally, this project has [simulation] tests in `tests/sim`. Simulation tests allow testing cross-contract calls, which is crucial to ensuring that the `ft_transfer_call` function works properly. These simulation tests are the reason this project has the file structure it does. Note that the root project has a `Cargo.toml` which sets it up as a workspace. `ft` and `test-contract-defi` are both small & focused contract projects, the latter only existing for simulation tests. The root project imports `near-sdk-sim` and tests interaction between these contracts. - -You can run unit tests with the following command: - -```bash -cd ft && cargo test -- --nocapture --color=always -``` - -You can run integration tests with the following commands: -*Rust* -```bash -cd integration-tests/rs && cargo run --example integration-tests -``` -*TypeScript* -```bash -cd integration-tests/ts && yarn && yarn test +# Transfer tokens +near call ft_transfer '{"receiver_id": "", "amount": "19"}' --accountId --amount 0.000000000000000000000001 ``` ## Notes @@ -147,14 +61,13 @@ cd integration-tests/ts && yarn && yarn test - JSON calls should pass U128 as a base-10 string. E.g. "100". - This does not include escrow functionality, as `ft_transfer_call` provides a superior approach. An escrow system can, of course, be added as a separate contract or additional functionality within this contract. -## No AssemblyScript? - -[near-contract-standards] is currently Rust-only. We strongly suggest using this library to create your own Fungible Token contract to ensure it works as expected. - -Someday NEAR core or community contributors may provide a similar library for AssemblyScript, at which point this example will be updated to include both a Rust and AssemblyScript version. - -## Contributing - -When making changes to the files in `ft` or `test-contract-defi`, remember to use `./build.sh` to compile all contracts and copy the output to the `res` folder. If you forget this, **the simulation tests will not use the latest versions**. +## Useful Links -Note that if the `rust-toolchain` file in this repository changes, please make sure to update the `.gitpod.Dockerfile` to explicitly specify using that as default as well. +- [cargo-near](https://github.com/near/cargo-near) - NEAR smart contract development toolkit for Rust +- [near CLI](https://near.cli.rs) - Iteract with NEAR blockchain from command line +- [NEAR Rust SDK Documentation](https://docs.near.org/sdk/rust/introduction) +- [NEAR Documentation](https://docs.near.org) +- [NEAR StackOverflow](https://stackoverflow.com/questions/tagged/nearprotocol) +- [NEAR Discord](https://near.chat) +- [NEAR Telegram Developers Community Group](https://t.me/neardev) +- NEAR DevHub: [Telegram](https://t.me/neardevhub), [Twitter](https://twitter.com/neardevhub) \ No newline at end of file diff --git a/ft/Cargo.toml b/ft/Cargo.toml deleted file mode 100644 index d62bce4..0000000 --- a/ft/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "fungible-token" -version = "1.0.0" -authors = ["Near Inc "] -edition = "2018" - -[lib] -crate-type = ["cdylib", "rlib"] - -[dependencies] -near-sdk = "4.0.0" -near-contract-standards = "4.0.0" - -# This can be removed when near-sdk is updated -# Unfortuantely, this crate was yanked by the author and this is needed -[patch.crates-io] -parity-secp256k1 = { git = 'https://github.com/paritytech/rust-secp256k1.git' } \ No newline at end of file diff --git a/integration-tests/rs/Cargo.toml b/integration-tests/rs/Cargo.toml deleted file mode 100644 index f752878..0000000 --- a/integration-tests/rs/Cargo.toml +++ /dev/null @@ -1,28 +0,0 @@ -[package] -name = "fungible-token-integration-tests" -version = "1.0.0" -publish = false -edition = "2018" - -[dev-dependencies] -near-sdk = "4.0.0-pre.7" -anyhow = "1.0" -borsh = "0.9" -maplit = "1.0" -near-units = "0.2.0" -# arbitrary_precision enabled for u128 types that workspaces requires for Balance types -serde_json = { version = "1.0", features = ["arbitrary_precision"] } -tokio = { version = "1.18.1", features = ["full"] } -tracing = "0.1" -tracing-subscriber = { version = "0.3.11", features = ["env-filter"] } -workspaces = "0.4.0" -pkg-config = "0.3.1" - -[[example]] -name = "integration-tests" -path = "src/tests.rs" - -# This can be removed when near-sdk is updated -# Unfortuantely, this crate was yanked by the author and this is needed -[patch.crates-io] -parity-secp256k1 = { git = 'https://github.com/paritytech/rust-secp256k1.git' } \ No newline at end of file diff --git a/integration-tests/rs/src/tests.rs b/integration-tests/rs/src/tests.rs deleted file mode 100644 index c677c92..0000000 --- a/integration-tests/rs/src/tests.rs +++ /dev/null @@ -1,507 +0,0 @@ -use near_sdk::json_types::U128; -use near_units::{parse_gas, parse_near}; -use serde_json::json; -use workspaces::prelude::*; -use workspaces::result::CallExecutionDetails; -use workspaces::{network::Sandbox, Account, Contract, Worker}; - -const DEFI_WASM_FILEPATH: &str = "../../res/defi.wasm"; -const FT_WASM_FILEPATH: &str = "../../res/fungible_token.wasm"; - -#[tokio::main] -async fn main() -> anyhow::Result<()> { - // initiate environemnt - let worker = workspaces::sandbox().await?; - - // deploy contracts - let defi_wasm = std::fs::read(DEFI_WASM_FILEPATH)?; - let defi_contract = worker.dev_deploy(&defi_wasm).await?; - let ft_wasm = std::fs::read(FT_WASM_FILEPATH)?; - let ft_contract = worker.dev_deploy(&ft_wasm).await?; - - // create accounts - let owner = worker.root_account().unwrap(); - let alice = owner - .create_subaccount(&worker, "alice") - .initial_balance(parse_near!("30 N")) - .transact() - .await? - .into_result()?; - let bob = owner - .create_subaccount(&worker, "bob") - .initial_balance(parse_near!("30 N")) - .transact() - .await? - .into_result()?; - let charlie = owner - .create_subaccount(&worker, "charlie") - .initial_balance(parse_near!("30 N")) - .transact() - .await? - .into_result()?; - let dave = owner - .create_subaccount(&worker, "dave") - .initial_balance(parse_near!("30 N")) - .transact() - .await? - .into_result()?; - - // Initialize contracts - ft_contract - .call(&worker, "new_default_meta") - .args_json(serde_json::json!({ - "owner_id": owner.id(), - "total_supply": parse_near!("1,000,000,000 N").to_string(), - }))? - .transact() - .await?; - defi_contract - .call(&worker, "new") - .args_json(serde_json::json!({ - "fungible_token_account_id": ft_contract.id() - }))? - .transact() - .await?; - defi_contract - .as_account() - .call(&worker, ft_contract.id(), "storage_deposit") - .args_json(serde_json::json!({ - "account_id": defi_contract.id() - }))? - .deposit(parse_near!("0.008 N")) - .transact() - .await?; - - // begin tests - test_total_supply(&owner, &ft_contract, &worker).await?; - test_simple_transfer(&owner, &alice, &ft_contract, &worker).await?; - test_can_close_empty_balance_account(&bob, &ft_contract, &worker).await?; - test_close_account_non_empty_balance(&alice, &ft_contract, &worker).await?; - test_close_account_force_non_empty_balance(&alice, &ft_contract, &worker).await?; - test_transfer_call_with_burned_amount(&owner, &charlie, &ft_contract, &defi_contract, &worker) - .await?; - test_simulate_transfer_call_with_immediate_return_and_no_refund( - &owner, - &ft_contract, - &defi_contract, - &worker, - ) - .await?; - test_transfer_call_when_called_contract_not_registered_with_ft( - &owner, - &dave, - &ft_contract, - &worker, - ) - .await?; - test_transfer_call_promise_panics_for_a_full_refund(&owner, &alice, &ft_contract, &worker) - .await?; - Ok(()) -} - -async fn test_total_supply( - owner: &Account, - contract: &Contract, - worker: &Worker, -) -> anyhow::Result<()> { - let initial_balance = U128::from(parse_near!("1,000,000,000 N")); - let res: U128 = owner - .call(&worker, contract.id(), "ft_total_supply") - .args_json(json!({}))? - .transact() - .await? - .json()?; - assert_eq!(res, initial_balance); - println!(" Passed ✅ test_total_supply"); - Ok(()) -} - -async fn test_simple_transfer( - owner: &Account, - user: &Account, - contract: &Contract, - worker: &Worker, -) -> anyhow::Result<()> { - let transfer_amount = U128::from(parse_near!("1,000 N")); - - // register user - user.call(&worker, contract.id(), "storage_deposit") - .args_json(serde_json::json!({ - "account_id": user.id() - }))? - .deposit(parse_near!("0.008 N")) - .transact() - .await?; - - // transfer ft - owner - .call(&worker, contract.id(), "ft_transfer") - .args_json(serde_json::json!({ - "receiver_id": user.id(), - "amount": transfer_amount - }))? - .deposit(1) - .transact() - .await?; - - let root_balance: U128 = owner - .call(&worker, contract.id(), "ft_balance_of") - .args_json(serde_json::json!({ - "account_id": owner.id() - }))? - .transact() - .await? - .json()?; - - let alice_balance: U128 = owner - .call(&worker, contract.id(), "ft_balance_of") - .args_json(serde_json::json!({ - "account_id": user.id() - }))? - .transact() - .await? - .json()?; - - assert_eq!(root_balance, U128::from(parse_near!("999,999,000 N"))); - assert_eq!(alice_balance, transfer_amount); - - println!(" Passed ✅ test_simple_transfer"); - Ok(()) -} - -async fn test_can_close_empty_balance_account( - user: &Account, - contract: &Contract, - worker: &Worker, -) -> anyhow::Result<()> { - // register user - user.call(&worker, contract.id(), "storage_deposit") - .args_json(serde_json::json!({ - "account_id": user.id() - }))? - .deposit(parse_near!("0.008 N")) - .transact() - .await?; - - let result: bool = user - .call(&worker, contract.id(), "storage_unregister") - .args_json(serde_json::json!({}))? - .deposit(1) - .transact() - .await? - .json()?; - - assert_eq!(result, true); - println!(" Passed ✅ test_can_close_empty_balance_account"); - Ok(()) -} - -async fn test_close_account_non_empty_balance( - user_with_funds: &Account, - contract: &Contract, - worker: &Worker, -) -> anyhow::Result<()> { - match user_with_funds - .call(&worker, contract.id(), "storage_unregister") - .args_json(serde_json::json!({}))? - .deposit(1) - .transact() - .await - { - Ok(_result) => { - panic!("storage_unregister worked despite account being funded") - } - Err(e) => { - let e_string = e.to_string(); - if !e_string - .contains("Can't unregister the account with the positive balance without force") - { - panic!("storage_unregister with balance displays unexpected error message") - } - println!(" Passed ✅ test_close_account_non_empty_balance"); - } - } - Ok(()) -} - -async fn test_close_account_force_non_empty_balance( - user_with_funds: &Account, - contract: &Contract, - worker: &Worker, -) -> anyhow::Result<()> { - let result: CallExecutionDetails = user_with_funds - .call(&worker, contract.id(), "storage_unregister") - .args_json(serde_json::json!({"force": true }))? - .deposit(1) - .transact() - .await?; - - assert_eq!(true, result.is_success()); - assert_eq!( - result.logs()[0], - format!( - "Closed @{} with {}", - user_with_funds.id(), - parse_near!("1,000 N") // alice balance from above transfer_amount - ) - ); - println!(" Passed ✅ test_close_account_force_non_empty_balance"); - Ok(()) -} - -async fn test_transfer_call_with_burned_amount( - owner: &Account, - user: &Account, - ft_contract: &Contract, - defi_contract: &Contract, - worker: &Worker, -) -> anyhow::Result<()> { - let transfer_amount_str = parse_near!("1,000,000 N").to_string(); - let ftc_amount_str = parse_near!("1,000 N").to_string(); - - // register user - owner - .call(&worker, ft_contract.id(), "storage_deposit") - .args_json(serde_json::json!({ - "account_id": user.id() - }))? - .deposit(parse_near!("0.008 N")) - .transact() - .await?; - - // transfer ft - owner - .call(&worker, ft_contract.id(), "ft_transfer") - .args_json(serde_json::json!({ - "receiver_id": user.id(), - "amount": transfer_amount_str - }))? - .deposit(1) - .transact() - .await?; - - user.call(&worker, ft_contract.id(), "ft_transfer_call") - .args_json(serde_json::json!({ - "receiver_id": defi_contract.id(), - "amount": ftc_amount_str, - "msg": "0", - }))? - .deposit(1) - .gas(parse_gas!("200 Tgas") as u64) - .transact() - .await?; - - let storage_result: CallExecutionDetails = user - .call(&worker, ft_contract.id(), "storage_unregister") - .args_json(serde_json::json!({"force": true }))? - .deposit(1) - .transact() - .await?; - - // assert new state - assert_eq!( - storage_result.logs()[0], - format!( - "Closed @{} with {}", - user.id(), - parse_near!("999,000 N") // balance after defi ft transfer - ) - ); - - let total_supply: U128 = owner - .call(&worker, ft_contract.id(), "ft_total_supply") - .args_json(json!({}))? - .transact() - .await? - .json()?; - assert_eq!(total_supply, U128::from(parse_near!("999,000,000 N"))); - - let defi_balance: U128 = owner - .call(&worker, ft_contract.id(), "ft_total_supply") - .args_json(json!({"account_id": defi_contract.id()}))? - .transact() - .await? - .json()?; - assert_eq!(defi_balance, U128::from(parse_near!("999,000,000 N"))); - - println!(" Passed ✅ test_transfer_call_with_burned_amount"); - Ok(()) -} - -async fn test_simulate_transfer_call_with_immediate_return_and_no_refund( - owner: &Account, - ft_contract: &Contract, - defi_contract: &Contract, - worker: &Worker, -) -> anyhow::Result<()> { - let amount: u128 = parse_near!("100,000,000 N"); - let amount_str = amount.to_string(); - let owner_before_balance: U128 = ft_contract - .call(&worker, "ft_balance_of") - .args_json(json!({"account_id": owner.id()}))? - .transact() - .await? - .json()?; - let defi_before_balance: U128 = ft_contract - .call(&worker, "ft_balance_of") - .args_json(json!({"account_id": defi_contract.id()}))? - .transact() - .await? - .json()?; - - owner - .call(&worker, ft_contract.id(), "ft_transfer_call") - .args_json(serde_json::json!({ - "receiver_id": defi_contract.id(), - "amount": amount_str, - "msg": "take-my-money" - }))? - .deposit(1) - .gas(parse_gas!("200 Tgas") as u64) - .transact() - .await?; - - let owner_after_balance: U128 = ft_contract - .call(&worker, "ft_balance_of") - .args_json(json!({"account_id": owner.id()}))? - .transact() - .await? - .json()?; - let defi_after_balance: U128 = ft_contract - .call(&worker, "ft_balance_of") - .args_json(json!({"account_id": defi_contract.id()}))? - .transact() - .await? - .json()?; - - assert_eq!(owner_before_balance.0 - amount, owner_after_balance.0); - assert_eq!(defi_before_balance.0 + amount, defi_after_balance.0); - println!(" Passed ✅ test_simulate_transfer_call_with_immediate_return_and_no_refund"); - Ok(()) -} - -async fn test_transfer_call_when_called_contract_not_registered_with_ft( - owner: &Account, - user: &Account, - ft_contract: &Contract, - worker: &Worker, -) -> anyhow::Result<()> { - let amount = parse_near!("10 N"); - let amount_str = amount.to_string(); - let owner_before_balance: U128 = ft_contract - .call(&worker, "ft_balance_of") - .args_json(json!({"account_id": owner.id()}))? - .transact() - .await? - .json()?; - let user_before_balance: U128 = ft_contract - .call(&worker, "ft_balance_of") - .args_json(json!({"account_id": user.id()}))? - .transact() - .await? - .json()?; - - match owner - .call(&worker, ft_contract.id(), "ft_transfer_call") - .args_json(serde_json::json!({ - "receiver_id": user.id(), - "amount": amount_str, - "msg": "take-my-money", - }))? - .deposit(1) - .gas(parse_gas!("200 Tgas") as u64) - .transact() - .await - { - Ok(res) => { - panic!("Was able to transfer FT to an unregistered account"); - } - Err(err) => { - let owner_after_balance: U128 = ft_contract - .call(&worker, "ft_balance_of") - .args_json(json!({"account_id": owner.id()}))? - .transact() - .await? - .json()?; - let user_after_balance: U128 = ft_contract - .call(&worker, "ft_balance_of") - .args_json(json!({"account_id": user.id()}))? - .transact() - .await? - .json()?; - assert_eq!(user_before_balance, user_after_balance); - assert_eq!(owner_before_balance, owner_after_balance); - println!( - " Passed ✅ test_transfer_call_when_called_contract_not_registered_with_ft" - ); - } - } - Ok(()) -} - -async fn test_transfer_call_promise_panics_for_a_full_refund( - owner: &Account, - user: &Account, - ft_contract: &Contract, - worker: &Worker, -) -> anyhow::Result<()> { - let amount = parse_near!("10 N"); - - // register user - owner - .call(&worker, ft_contract.id(), "storage_deposit") - .args_json(serde_json::json!({ - "account_id": user.id() - }))? - .deposit(parse_near!("0.008 N")) - .transact() - .await?; - - let owner_before_balance: U128 = ft_contract - .call(&worker, "ft_balance_of") - .args_json(json!({"account_id": owner.id()}))? - .transact() - .await? - .json()?; - let user_before_balance: U128 = ft_contract - .call(&worker, "ft_balance_of") - .args_json(json!({"account_id": user.id()}))? - .transact() - .await? - .json()?; - - match owner - .call(&worker, ft_contract.id(), "ft_transfer_call") - .args_json(serde_json::json!({ - "receiver_id": user.id(), - "amount": amount, - "msg": "no parsey as integer big panic oh no", - }))? - .deposit(1) - .gas(parse_gas!("200 Tgas") as u64) - .transact() - .await - { - Ok(res) => { - panic!("Did not expect for trx to accept invalid paramenter data types") - } - Err(err) => { - let owner_after_balance: U128 = ft_contract - .call(&worker, "ft_balance_of") - .args_json(json!({"account_id": owner.id()}))? - .transact() - .await? - .json()?; - let user_after_balance: U128 = ft_contract - .call(&worker, "ft_balance_of") - .args_json(json!({"account_id": user.id()}))? - .transact() - .await? - .json()?; - assert_eq!(owner_before_balance, owner_after_balance); - assert_eq!(user_before_balance, user_after_balance); - println!(" Passed ✅ test_transfer_call_promise_panics_for_a_full_refund"); - } - } - Ok(()) -} diff --git a/integration-tests/ts/ava.config.cjs b/integration-tests/ts/ava.config.cjs deleted file mode 100644 index c488d9d..0000000 --- a/integration-tests/ts/ava.config.cjs +++ /dev/null @@ -1,9 +0,0 @@ -require("util").inspect.defaultOptions.depth = 5; // Increase AVA's printing depth - -module.exports = { - timeout: "300000", - files: ["**/*.ava.ts"], - failWithoutAssertions: false, - extensions: ["ts"], - require: ["ts-node/register"], -}; diff --git a/integration-tests/ts/package.json b/integration-tests/ts/package.json deleted file mode 100644 index 3f8abf3..0000000 --- a/integration-tests/ts/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "fungible-token-integration-tests-ts", - "version": "0.1.0", - "license": "(MIT AND Apache-2.0)", - "scripts": { - "test": "ava --verbose" - }, - "devDependencies": { - "ava": "^4.2.0", - "near-workspaces": "^3.1.0", - "typescript": "^4.6.4", - "ts-node": "^10.8.0", - "@types/bn.js": "^5.1.0" - }, - "dependencies": {} -} diff --git a/integration-tests/ts/src/main.ava.ts b/integration-tests/ts/src/main.ava.ts deleted file mode 100644 index 9e6d83c..0000000 --- a/integration-tests/ts/src/main.ava.ts +++ /dev/null @@ -1,243 +0,0 @@ -/** - * This tests the behavior of the standard FT contract at - * https://github.com/near/near-sdk-rs/tree/master/examples/fungible-token - * - * Some advanced features of near-workspaces this shows off: - * - * - Cross-Contract Calls: the "defi" contract implements basic features that - * might be used by a marketplace contract. You can see its source code at the - * near-sdk-rs link above. Several FT methods make cross-contract calls, and - * these are tested below using this "defi" contract. - * - * - Complex transactions: to exercise certain edge cases of the FT standard, - * tests below initiate chains of transactions using near-workspaces's transaction - * builder. Search for `batch` below. - */ -import { Worker, NearAccount, captureError, NEAR, BN } from 'near-workspaces'; -import anyTest, { TestFn } from 'ava'; - -const STORAGE_BYTE_COST = '1.5 mN'; -const INITIAL_SUPPLY = "10000"; - -async function registerUser(ft: NearAccount, user: NearAccount) { - await user.call( - ft, - 'storage_deposit', - { account_id: user }, - // Deposit pulled from ported sim test - { attachedDeposit: STORAGE_BYTE_COST }, - ); -} - -async function ft_balance_of(ft: NearAccount, user: NearAccount): Promise { - return new BN(await ft.view('ft_balance_of', { account_id: user })); -} - -const test = anyTest as TestFn<{ - worker: Worker; - accounts: Record; -}>; - -test.beforeEach(async t => { - const worker = await Worker.init(); - const root = worker.rootAccount; - const ft = await root.devDeploy( - "../../res/fungible_token.wasm", - { - initialBalance: NEAR.parse('100 N').toJSON(), - method: "new_default_meta", - args: { - owner_id: root, - total_supply: INITIAL_SUPPLY, - } - }, - ); - const defi = await root.devDeploy( - '../../res/defi.wasm', - { - initialBalance: NEAR.parse('100 N').toJSON(), - method: "new", - args: { fungible_token_account_id: ft } - }, - ); - - const ali = await root.createSubAccount('ali', { initialBalance: NEAR.parse('100 N').toJSON() }); - - t.context.worker = worker; - t.context.accounts = { root, ft, defi, ali }; -}); - -test.afterEach(async t => { - await t.context.worker.tearDown().catch(error => { - console.log('Failed to tear down the worker:', error); - }); -}); - -test('Total supply', async t => { - const { ft } = t.context.accounts; - const totalSupply: string = await ft.view('ft_total_supply'); - t.is(totalSupply, INITIAL_SUPPLY); -}); - -test('Simple transfer', async t => { - const { ft, ali, root } = t.context.accounts; - const initialAmount = new BN(INITIAL_SUPPLY); - const transferAmount = new BN('100'); - - // Register by prepaying for storage. - await registerUser(ft, ali); - - await root.call( - ft, - 'ft_transfer', - { - receiver_id: ali, - amount: transferAmount, - }, - { attachedDeposit: '1' }, - ); - - const rootBalance = await ft_balance_of(ft, root); - const aliBalance = await ft_balance_of(ft, ali); - - t.deepEqual(new BN(rootBalance), initialAmount.sub(transferAmount)); - t.deepEqual(new BN(aliBalance), transferAmount); -}); - -test('Can close empty balance account', async t => { - const { ft, ali } = t.context.accounts; - - await registerUser(ft, ali); - - const result = await ali.call( - ft, - 'storage_unregister', - {}, - { attachedDeposit: '1' }, - ); - - t.is(result, true); -}); - -test('Can force close non-empty balance account', async t => { - const { ft, root } = t.context.accounts; - - const errorString = await captureError(async () => - root.call(ft, 'storage_unregister', {}, { attachedDeposit: '1' })); - t.regex(errorString, /Can't unregister the account with the positive balance without force/); - - const result = await root.callRaw( - ft, - 'storage_unregister', - { force: true }, - { attachedDeposit: '1' }, - ); - - t.is(result.logs[0], - `Closed @${root.accountId} with ${INITIAL_SUPPLY}`, - ); -}); - -test('Transfer call with burned amount', async t => { - const { ft, defi, root } = t.context.accounts; - - const initialAmount = new BN(10_000); - const transferAmount = new BN(100); - const burnAmount = new BN(10); - - await registerUser(ft, defi); - const result = await root - .batch(ft) - .functionCall( - 'ft_transfer_call', - { - receiver_id: defi, - amount: transferAmount, - msg: burnAmount, - }, - { attachedDeposit: '1', gas: '150 Tgas' }, - ) - .functionCall( - 'storage_unregister', - { force: true }, - { attachedDeposit: '1', gas: '150 Tgas' }, - ) - .transact(); - - t.true(result.logs.includes( - `Closed @${root.accountId} with ${(initialAmount.sub(transferAmount)).toString()}`, - )); - - t.is(result.parseResult(), true); - - t.true(result.logs.includes( - 'The account of the sender was deleted', - )); - - t.true(result.logs.includes( - `Account @${root.accountId} burned ${burnAmount.toString()}`, - )); - - // Help: this index is diff from sim, we have 10 len when they have 4 - const callbackOutcome = result.receipts_outcomes[5]; - t.is(callbackOutcome.parseResult(), transferAmount.toString()); - const expectedAmount = transferAmount.sub(burnAmount); - const totalSupply: string = await ft.view('ft_total_supply'); - t.is(totalSupply, expectedAmount.toString()); - const defiBalance = await ft_balance_of(ft, defi); - t.deepEqual(defiBalance, expectedAmount); -}); - -test('Transfer call immediate return no refund', async t => { - const { ft, defi, root } = t.context.accounts; - const initialAmount = new BN(10_000); - const transferAmount = new BN(100); - - await registerUser(ft, defi); - - await root.call( - ft, - 'ft_transfer_call', - { - receiver_id: defi, - amount: transferAmount, - memo: null, - msg: 'take-my-money', - }, - { attachedDeposit: '1', gas: '150 Tgas' }, - ); - - const rootBalance = await ft_balance_of(ft, root); - const defiBalance = await ft_balance_of(ft, defi); - - t.deepEqual(rootBalance, initialAmount.sub(transferAmount)); - t.deepEqual(defiBalance, transferAmount); -}); - -test('Transfer call promise panics for a full refund', async t => { - const { ft, defi, root } = t.context.accounts; - const initialAmount = new BN(10_000); - const transferAmount = new BN(100); - - await registerUser(ft, defi); - - const result = await root.callRaw( - ft, - 'ft_transfer_call', - { - receiver_id: defi, - amount: transferAmount, - memo: null, - msg: 'this won\'t parse as an integer', - }, - { attachedDeposit: '1', gas: '150 Tgas' }, - ); - - t.regex(result.receiptFailureMessages.join('\n'), /ParseIntError/); - - const rootBalance = await ft_balance_of(ft, root); - const defiBalance = await ft_balance_of(ft, defi); - - t.deepEqual(rootBalance, initialAmount); - t.assert(defiBalance.isZero(), `Expected zero got ${defiBalance.toJSON()}`); -}); diff --git a/res/defi.wasm b/res/defi.wasm deleted file mode 100755 index ecf10cd7fa28caaf3bb869b0b49f01c7e76a1234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130066 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 XvUzFHRf8TDP{gO}aQ-VeJo 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�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
khhPL3!wGUtu(qt3!O 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%0Dfi{S;p%ss6TJqeo!t^o`T!r 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 diff --git a/rustfmt.toml b/rustfmt.toml deleted file mode 100644 index 2a35f02..0000000 --- a/rustfmt.toml +++ /dev/null @@ -1 +0,0 @@ -use_small_heuristics = "Max" diff --git a/scripts/build.bat b/scripts/build.bat deleted file mode 100644 index 2208979..0000000 --- a/scripts/build.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off - -title FT build -cd .. -cargo build --all --target wasm32-unknown-unknown --release -xcopy %CD%\target\wasm32-unknown-unknown\release\*.wasm %CD%\res /Y -pause \ No newline at end of file diff --git a/scripts/build.sh b/scripts/build.sh deleted file mode 100755 index 356b188..0000000 --- a/scripts/build.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -set -e -cd "`dirname $0`"/../ft -cargo build --all --target wasm32-unknown-unknown --release -cd .. -cp ft/target/wasm32-unknown-unknown/release/*.wasm ./res/ diff --git a/ft/src/lib.rs b/src/lib.rs similarity index 62% rename from ft/src/lib.rs rename to src/lib.rs index a52117e..27742ff 100644 --- a/ft/src/lib.rs +++ b/src/lib.rs @@ -18,14 +18,21 @@ NOTES: use near_contract_standards::fungible_token::metadata::{ FungibleTokenMetadata, FungibleTokenMetadataProvider, FT_METADATA_SPEC, }; -use near_contract_standards::fungible_token::FungibleToken; -use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +use near_contract_standards::fungible_token::{ + FungibleToken, FungibleTokenCore, FungibleTokenResolver, +}; +use near_contract_standards::storage_management::{ + StorageBalance, StorageBalanceBounds, StorageManagement, +}; +use near_sdk::borsh::BorshSerialize; use near_sdk::collections::LazyOption; use near_sdk::json_types::U128; -use near_sdk::{env, log, near_bindgen, AccountId, Balance, PanicOnDefault, PromiseOrValue}; +use near_sdk::{ + env, log, near, require, AccountId, BorshStorageKey, NearToken, PanicOnDefault, PromiseOrValue, +}; -#[near_bindgen] -#[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] +#[derive(PanicOnDefault)] +#[near(contract_state)] pub struct Contract { token: FungibleToken, metadata: LazyOption, @@ -33,7 +40,14 @@ pub struct Contract { const DATA_IMAGE_SVG_NEAR_ICON: &str = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 288 288'%3E%3Cg id='l' data-name='l'%3E%3Cpath d='M187.58,79.81l-30.1,44.69a3.2,3.2,0,0,0,4.75,4.2L191.86,103a1.2,1.2,0,0,1,2,.91v80.46a1.2,1.2,0,0,1-2.12.77L102.18,77.93A15.35,15.35,0,0,0,90.47,72.5H87.34A15.34,15.34,0,0,0,72,87.84V201.16A15.34,15.34,0,0,0,87.34,216.5h0a15.35,15.35,0,0,0,13.08-7.31l30.1-44.69a3.2,3.2,0,0,0-4.75-4.2L96.14,186a1.2,1.2,0,0,1-2-.91V104.61a1.2,1.2,0,0,1,2.12-.77l89.55,107.23a15.35,15.35,0,0,0,11.71,5.43h3.13A15.34,15.34,0,0,0,216,201.16V87.84A15.34,15.34,0,0,0,200.66,72.5h0A15.35,15.35,0,0,0,187.58,79.81Z'/%3E%3C/g%3E%3C/svg%3E"; -#[near_bindgen] +#[derive(BorshSerialize, BorshStorageKey)] +#[borsh(crate = "near_sdk::borsh")] +enum StorageKey { + FungibleToken, + Metadata, +} + +#[near] impl Contract { /// Initializes the contract with the given total supply owned by the given `owner_id` with /// default metadata (for example purposes only). @@ -57,41 +71,110 @@ impl Contract { /// Initializes the contract with the given total supply owned by the given `owner_id` with /// the given fungible token metadata. #[init] - pub fn new( - owner_id: AccountId, - total_supply: U128, - metadata: FungibleTokenMetadata, - ) -> Self { - assert!(!env::state_exists(), "Already initialized"); + pub fn new(owner_id: AccountId, total_supply: U128, metadata: FungibleTokenMetadata) -> Self { + require!(!env::state_exists(), "Already initialized"); metadata.assert_valid(); let mut this = Self { - token: FungibleToken::new(b"a".to_vec()), - metadata: LazyOption::new(b"m".to_vec(), Some(&metadata)), + token: FungibleToken::new(StorageKey::FungibleToken), + metadata: LazyOption::new(StorageKey::Metadata, Some(&metadata)), }; this.token.internal_register_account(&owner_id); this.token.internal_deposit(&owner_id, total_supply.into()); + near_contract_standards::fungible_token::events::FtMint { owner_id: &owner_id, - amount: &total_supply, - memo: Some("Initial tokens supply is minted"), + amount: total_supply, + memo: Some("new tokens are minted"), } .emit(); + this } +} + +#[near] +impl FungibleTokenCore for Contract { + #[payable] + fn ft_transfer(&mut self, receiver_id: AccountId, amount: U128, memo: Option) { + self.token.ft_transfer(receiver_id, amount, memo) + } - fn on_account_closed(&mut self, account_id: AccountId, balance: Balance) { - log!("Closed @{} with {}", account_id, balance); + #[payable] + fn ft_transfer_call( + &mut self, + receiver_id: AccountId, + amount: U128, + memo: Option, + msg: String, + ) -> PromiseOrValue { + self.token.ft_transfer_call(receiver_id, amount, memo, msg) } - fn on_tokens_burned(&mut self, account_id: AccountId, amount: Balance) { - log!("Account @{} burned {}", account_id, amount); + fn ft_total_supply(&self) -> U128 { + self.token.ft_total_supply() + } + + fn ft_balance_of(&self, account_id: AccountId) -> U128 { + self.token.ft_balance_of(account_id) } } -near_contract_standards::impl_fungible_token_core!(Contract, token, on_tokens_burned); -near_contract_standards::impl_fungible_token_storage!(Contract, token, on_account_closed); +#[near] +impl FungibleTokenResolver for Contract { + #[private] + fn ft_resolve_transfer( + &mut self, + sender_id: AccountId, + receiver_id: AccountId, + amount: U128, + ) -> U128 { + let (used_amount, burned_amount) = + self.token + .internal_ft_resolve_transfer(&sender_id, receiver_id, amount); + if burned_amount > 0 { + log!("Account @{} burned {}", sender_id, burned_amount); + } + used_amount.into() + } +} + +#[near] +impl StorageManagement for Contract { + #[payable] + fn storage_deposit( + &mut self, + account_id: Option, + registration_only: Option, + ) -> StorageBalance { + self.token.storage_deposit(account_id, registration_only) + } + + #[payable] + fn storage_withdraw(&mut self, amount: Option) -> StorageBalance { + self.token.storage_withdraw(amount) + } + + #[payable] + fn storage_unregister(&mut self, force: Option) -> bool { + #[allow(unused_variables)] + if let Some((account_id, balance)) = self.token.internal_storage_unregister(force) { + log!("Closed @{} with {}", account_id, balance); + true + } else { + false + } + } + + fn storage_balance_bounds(&self) -> StorageBalanceBounds { + self.token.storage_balance_bounds() + } + + fn storage_balance_of(&self, account_id: AccountId) -> Option { + self.token.storage_balance_of(account_id) + } +} -#[near_bindgen] +#[near] impl FungibleTokenMetadataProvider for Contract { fn ft_metadata(&self) -> FungibleTokenMetadata { self.metadata.get().unwrap() @@ -100,9 +183,9 @@ impl FungibleTokenMetadataProvider for Contract { #[cfg(all(test, not(target_arch = "wasm32")))] mod tests { + use near_contract_standards::fungible_token::Balance; use near_sdk::test_utils::{accounts, VMContextBuilder}; - use near_sdk::MockedBlockchain; - use near_sdk::{testing_env, Balance}; + use near_sdk::testing_env; use super::*; @@ -150,7 +233,7 @@ mod tests { testing_env!(context .storage_usage(env::storage_usage()) - .attached_deposit(1) + .attached_deposit(NearToken::from_yoctonear(1)) .predecessor_account_id(accounts(2)) .build()); let transfer_amount = TOTAL_SUPPLY / 3; @@ -160,9 +243,12 @@ mod tests { .storage_usage(env::storage_usage()) .account_balance(env::account_balance()) .is_view(true) - .attached_deposit(0) + .attached_deposit(NearToken::from_near(0)) .build()); - assert_eq!(contract.ft_balance_of(accounts(2)).0, (TOTAL_SUPPLY - transfer_amount)); + assert_eq!( + contract.ft_balance_of(accounts(2)).0, + (TOTAL_SUPPLY - transfer_amount) + ); assert_eq!(contract.ft_balance_of(accounts(1)).0, transfer_amount); } } diff --git a/test-contract-defi/Cargo.toml b/test-contract-defi/Cargo.toml deleted file mode 100644 index 674e6fb..0000000 --- a/test-contract-defi/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "defi" -version = "0.0.1" -authors = ["Near Inc "] -edition = "2018" - -[lib] -crate-type = ["cdylib", "rlib"] - -[dependencies] -near-sdk = "4.0.0" -near-contract-standards = "4.0.0" - -# This can be removed when near-sdk is updated -# Unfortuantely, this crate was yanked by the author and this is needed -[patch.crates-io] -parity-secp256k1 = { git = 'https://github.com/paritytech/rust-secp256k1.git' } \ No newline at end of file diff --git a/tests/contracts/defi/Cargo.toml b/tests/contracts/defi/Cargo.toml new file mode 100644 index 0000000..356c0a5 --- /dev/null +++ b/tests/contracts/defi/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "defi" +version = "0.0.1" +authors = ["Near Inc "] +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +near-sdk = "5.5.0" +near-contract-standards = "5.5.0" + +[dev-dependencies] +near-sdk = { version = "5.5.0", features = ["unit-testing"] } \ No newline at end of file diff --git a/test-contract-defi/src/lib.rs b/tests/contracts/defi/src/lib.rs similarity index 60% rename from test-contract-defi/src/lib.rs rename to tests/contracts/defi/src/lib.rs index d4a7569..83671a1 100644 --- a/test-contract-defi/src/lib.rs +++ b/tests/contracts/defi/src/lib.rs @@ -1,35 +1,36 @@ /*! Some hypothetical DeFi contract that will do smart things with the transferred tokens */ -use near_contract_standards::fungible_token::receiver::FungibleTokenReceiver; -use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize}; +use near_contract_standards::fungible_token::{receiver::FungibleTokenReceiver, Balance}; use near_sdk::json_types::U128; -use near_sdk::{ - env, ext_contract, log, near_bindgen, AccountId, Balance, PanicOnDefault, PromiseOrValue, -}; +use near_sdk::{env, log, near, require, AccountId, Gas, PanicOnDefault, PromiseOrValue}; -#[near_bindgen] -#[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)] +const BASE_GAS: u64 = 5_000_000_000_000; +const PROMISE_CALL: u64 = 5_000_000_000_000; +const GAS_FOR_FT_ON_TRANSFER: Gas = Gas::from_gas(BASE_GAS + PROMISE_CALL); + +#[derive(PanicOnDefault)] +#[near(contract_state)] pub struct DeFi { fungible_token_account_id: AccountId, } -// Defining cross-contract interface. This allows to create a new promise. -#[ext_contract(ext_self)] -pub trait ValueReturnTrait { +// Have to repeat the same trait for our own implementation. +#[allow(dead_code)] +trait ValueReturnTrait { fn value_please(&self, amount_to_return: String) -> PromiseOrValue; } -#[near_bindgen] +#[near] impl DeFi { #[init] pub fn new(fungible_token_account_id: AccountId) -> Self { - assert!(!env::state_exists(), "Already initialized"); + require!(!env::state_exists(), "Already initialized"); Self { fungible_token_account_id: fungible_token_account_id.into() } } } -#[near_bindgen] +#[near] impl FungibleTokenReceiver for DeFi { /// If given `msg: "take-my-money", immediately returns U128::From(0) /// Otherwise, makes a cross-contract call to own `value_please` function, passing `msg` @@ -41,24 +42,26 @@ impl FungibleTokenReceiver for DeFi { msg: String, ) -> PromiseOrValue { // Verifying that we were called by fungible token contract that we expect. - assert_eq!( - &env::predecessor_account_id(), - &self.fungible_token_account_id, + require!( + env::predecessor_account_id() == self.fungible_token_account_id, "Only supports the one fungible token contract" ); - log!("in {} tokens from @{} ft_on_transfer, msg = {}", amount.0, sender_id.as_ref(), msg); + log!("in {} tokens from @{} ft_on_transfer, msg = {}", amount.0, sender_id, msg); match msg.as_str() { "take-my-money" => PromiseOrValue::Value(U128::from(0)), _ => { - // Call ok_go with no attached deposit and all unspent GAS (weight of 1) - Self::ext(env::current_account_id()) - .value_please(msg).into() + let prepaid_gas = env::prepaid_gas(); + let account_id = env::current_account_id(); + Self::ext(account_id) + .with_static_gas(prepaid_gas.saturating_sub(GAS_FOR_FT_ON_TRANSFER)) + .value_please(msg) + .into() } } } } -#[near_bindgen] +#[near] impl ValueReturnTrait for DeFi { fn value_please(&self, amount_to_return: String) -> PromiseOrValue { log!("in value_please, amount_to_return = {}", amount_to_return); diff --git a/tests/init.rs b/tests/init.rs new file mode 100644 index 0000000..2e5979b --- /dev/null +++ b/tests/init.rs @@ -0,0 +1,87 @@ +use near_sdk::{json_types::U128, AccountId, NearToken}; +use near_workspaces::{Account, Contract, DevNetwork, Worker}; + +const INITIAL_BALANCE: NearToken = NearToken::from_near(30); +pub const ONE_YOCTO: NearToken = NearToken::from_yoctonear(1); + +pub async fn init_accounts(root: &Account) -> anyhow::Result<(Account, Account, Account, Account)> { + // create accounts + let alice = root + .create_subaccount("alice") + .initial_balance(INITIAL_BALANCE) + .transact() + .await? + .into_result()?; + let bob = root + .create_subaccount("bob") + .initial_balance(INITIAL_BALANCE) + .transact() + .await? + .into_result()?; + let charlie = root + .create_subaccount("charlie") + .initial_balance(INITIAL_BALANCE) + .transact() + .await? + .into_result()?; + let dave = root + .create_subaccount("dave") + .initial_balance(INITIAL_BALANCE) + .transact() + .await? + .into_result()?; + + return Ok((alice, bob, charlie, dave)); +} + +pub async fn init_contracts( + worker: &Worker, + initial_balance: U128, + account: &Account, +) -> anyhow::Result<(Contract, Contract)> { + let ft_wasm = near_workspaces::compile_project(".").await?; + let ft_contract = worker.dev_deploy(&ft_wasm).await?; + + let res = ft_contract + .call("new_default_meta") + .args_json((ft_contract.id(), initial_balance)) + .max_gas() + .transact() + .await?; + assert!(res.is_success()); + + let defi_wasm = near_workspaces::compile_project("./tests/contracts/defi").await?; + let defi_contract = worker.dev_deploy(&defi_wasm).await?; + + let res = defi_contract + .call("new") + .args_json((ft_contract.id(),)) + .max_gas() + .transact() + .await?; + assert!(res.is_success()); + + let res = ft_contract + .call("storage_deposit") + .args_json((account.id(), Option::::None)) + .deposit(near_sdk::env::storage_byte_cost().saturating_mul(125)) + .max_gas() + .transact() + .await?; + assert!(res.is_success()); + + return Ok((ft_contract, defi_contract)); +} + +pub async fn register_user(contract: &Contract, account_id: &AccountId) -> anyhow::Result<()> { + let res = contract + .call("storage_deposit") + .args_json((account_id, Option::::None)) + .max_gas() + .deposit(near_sdk::env::storage_byte_cost().saturating_mul(125)) + .transact() + .await?; + assert!(res.is_success()); + + Ok(()) +} diff --git a/tests/main.rs b/tests/main.rs new file mode 100644 index 0000000..ee78f7f --- /dev/null +++ b/tests/main.rs @@ -0,0 +1,2 @@ +mod init; +mod tests; diff --git a/tests/tests/mod.rs b/tests/tests/mod.rs new file mode 100644 index 0000000..61486dd --- /dev/null +++ b/tests/tests/mod.rs @@ -0,0 +1,3 @@ +mod storage; +mod supply; +mod transfer; diff --git a/tests/tests/storage.rs b/tests/tests/storage.rs new file mode 100644 index 0000000..31d236a --- /dev/null +++ b/tests/tests/storage.rs @@ -0,0 +1,292 @@ +use near_sdk::{json_types::U128, NearToken}; + +use crate::init::{init_accounts, init_contracts, ONE_YOCTO}; + +#[tokio::test] +async fn storage_deposit_not_enough_deposit() -> anyhow::Result<()> { + let initial_balance = U128::from(NearToken::from_near(10000).as_yoctonear()); + + let worker = near_workspaces::sandbox().await?; + let root = worker.root_account()?; + let (alice, _, _, _) = init_accounts(&root).await?; + let (ft_contract, _) = init_contracts(&worker, initial_balance, &alice).await?; + + let new_account = ft_contract + .as_account() + .create_subaccount("new-account") + .initial_balance(NearToken::from_near(10)) + .transact() + .await? + .into_result()?; + + let new_account_balance_before_deposit = new_account.view_account().await?.balance; + let contract_balance_before_deposit = ft_contract.view_account().await?.balance; + + let minimal_deposit = near_sdk::env::storage_byte_cost().saturating_mul(125); + let res = new_account + .call(ft_contract.id(), "storage_deposit") + .args(b"{}".to_vec()) + .max_gas() + .deposit(minimal_deposit.saturating_sub(NearToken::from_yoctonear(1))) + .transact() + .await?; + assert!(res.is_failure()); + + let new_account_balance_diff = new_account_balance_before_deposit + .saturating_sub(new_account.view_account().await?.balance); + // new_account is charged the transaction fee, so it should loose some NEAR + assert!(new_account_balance_diff > NearToken::from_near(0)); + assert!(new_account_balance_diff < NearToken::from_millinear(1)); + + let contract_balance_diff = ft_contract + .view_account() + .await? + .balance + .saturating_sub(contract_balance_before_deposit); + // contract receives a gas rewards for the function call, so it should gain some NEAR + assert!(contract_balance_diff > NearToken::from_near(0)); + assert!(contract_balance_diff < NearToken::from_yoctonear(30_000_000_000_000_000_000)); + + Ok(()) +} + +#[tokio::test] +async fn storage_deposit_minimal_deposit() -> anyhow::Result<()> { + let initial_balance = U128::from(NearToken::from_near(10000).as_yoctonear()); + + let worker = near_workspaces::sandbox().await?; + let root = worker.root_account()?; + let (alice, _, _, _) = init_accounts(&root).await?; + let (ft_contract, _) = init_contracts(&worker, initial_balance, &alice).await?; + + let new_account = ft_contract + .as_account() + .create_subaccount("new-account") + .initial_balance(NearToken::from_near(10)) + .transact() + .await? + .into_result()?; + + let new_account_balance_before_deposit = new_account.view_account().await?.balance; + let contract_balance_before_deposit = ft_contract.view_account().await?.balance; + + let minimal_deposit = near_sdk::env::storage_byte_cost().saturating_mul(125); + new_account + .call(ft_contract.id(), "storage_deposit") + .args(b"{}".to_vec()) + .max_gas() + .deposit(minimal_deposit) + .transact() + .await? + .into_result()?; + + let new_account_balance_diff = new_account_balance_before_deposit + .saturating_sub(new_account.view_account().await?.balance); + // new_account is charged the transaction fee, so it should loose a bit more than minimal_deposit + assert!(new_account_balance_diff > minimal_deposit); + assert!( + new_account_balance_diff < minimal_deposit.saturating_add(NearToken::from_millinear(1)) + ); + + let contract_balance_diff = ft_contract + .view_account() + .await? + .balance + .saturating_sub(contract_balance_before_deposit); + // contract receives a gas rewards for the function call, so the difference should be slightly more than minimal_deposit + assert!(contract_balance_diff > minimal_deposit); + // adjust the upper limit of the assertion to be more flexible for small variations in the gas reward received + assert!( + contract_balance_diff + < minimal_deposit.saturating_add(NearToken::from_yoctonear(50_000_000_000_000_000_000)) + ); + + Ok(()) +} + +#[tokio::test] +async fn storage_deposit_refunds_excessive_deposit() -> anyhow::Result<()> { + let initial_balance = U128::from(NearToken::from_near(10000).as_yoctonear()); + + let worker = near_workspaces::sandbox().await?; + let root = worker.root_account()?; + let (alice, _, _, _) = init_accounts(&root).await?; + let (ft_contract, _) = init_contracts(&worker, initial_balance, &alice).await?; + + let minimal_deposit = near_sdk::env::storage_byte_cost().saturating_mul(125); + + // Check the storage balance bounds to make sure we have the right minimal deposit + // + #[derive(near_sdk::serde::Serialize, near_sdk::serde::Deserialize)] + #[serde(crate = "near_sdk::serde")] + struct StorageBalanceBounds { + min: U128, + max: U128, + } + let storage_balance_bounds: StorageBalanceBounds = ft_contract + .call("storage_balance_bounds") + .view() + .await? + .json()?; + assert_eq!( + storage_balance_bounds.min, + minimal_deposit.as_yoctonear().into() + ); + assert_eq!( + storage_balance_bounds.max, + minimal_deposit.as_yoctonear().into() + ); + + // Check that a non-registered account does not have storage balance + // + #[derive(near_sdk::serde::Serialize, near_sdk::serde::Deserialize)] + #[serde(crate = "near_sdk::serde")] + struct StorageBalanceOf { + total: U128, + available: U128, + } + let storage_balance_bounds: Option = ft_contract + .call("storage_balance_of") + .args_json(near_sdk::serde_json::json!({"account_id": "non-registered-account"})) + .view() + .await? + .json()?; + assert!(storage_balance_bounds.is_none()); + + // Create a new account and deposit some NEAR to cover the storage + // + let new_account = ft_contract + .as_account() + .create_subaccount("new-account") + .initial_balance(NearToken::from_near(10)) + .transact() + .await? + .into_result()?; + + let new_account_balance_before_deposit = new_account.view_account().await?.balance; + let contract_balance_before_deposit = ft_contract.view_account().await?.balance; + + new_account + .call(ft_contract.id(), "storage_deposit") + .args(b"{}".to_vec()) + .max_gas() + .deposit(NearToken::from_near(5)) + .transact() + .await? + .into_result()?; + + // The expected storage balance should be the minimal deposit, + // the balance of the account should be reduced by the deposit, + // and the contract should gain the deposit. + // + let storage_balance_bounds: StorageBalanceOf = ft_contract + .call("storage_balance_of") + .args_json(near_sdk::serde_json::json!({"account_id": new_account.id()})) + .view() + .await? + .json()?; + assert_eq!( + storage_balance_bounds.total, + minimal_deposit.as_yoctonear().into() + ); + assert_eq!(storage_balance_bounds.available, 0.into()); + + let new_account_balance_diff = new_account_balance_before_deposit + .saturating_sub(new_account.view_account().await?.balance); + // new_account is charged the transaction fee, so it should loose a bit more than minimal_deposit + assert!(new_account_balance_diff > minimal_deposit); + assert!( + new_account_balance_diff < minimal_deposit.saturating_add(NearToken::from_millinear(1)) + ); + + let contract_balance_diff = ft_contract + .view_account() + .await? + .balance + .saturating_sub(contract_balance_before_deposit); + // contract receives a gas rewards for the function call, so the difference should be slightly more than minimal_deposit + assert!(contract_balance_diff > minimal_deposit); + assert!( + contract_balance_diff + < minimal_deposit.saturating_add(NearToken::from_yoctonear(50_000_000_000_000_000_000)) + ); + + Ok(()) +} + +#[tokio::test] +async fn close_account_empty_balance() -> anyhow::Result<()> { + let initial_balance = U128::from(NearToken::from_near(10000).as_yoctonear()); + + let worker = near_workspaces::sandbox().await?; + let root = worker.root_account()?; + let (alice, _, _, _) = init_accounts(&root).await?; + let (ft_contract, _) = init_contracts(&worker, initial_balance, &alice).await?; + + let res = alice + .call(ft_contract.id(), "storage_unregister") + .args_json((Option::::None,)) + .max_gas() + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(res.json::()?); + + Ok(()) +} + +#[tokio::test] +async fn close_account_non_empty_balance() -> anyhow::Result<()> { + let initial_balance = U128::from(NearToken::from_near(10000).as_yoctonear()); + + let worker = near_workspaces::sandbox().await?; + let root = worker.root_account()?; + let (alice, _, _, _) = init_accounts(&root).await?; + let (ft_contract, _) = init_contracts(&worker, initial_balance, &alice).await?; + + let res = ft_contract + .call("storage_unregister") + .args_json((Option::::None,)) + .max_gas() + .deposit(ONE_YOCTO) + .transact() + .await; + assert!(format!("{:?}", res) + .contains("Can't unregister the account with the positive balance without force")); + + let res = ft_contract + .call("storage_unregister") + .args_json((Some(false),)) + .max_gas() + .deposit(ONE_YOCTO) + .transact() + .await; + assert!(format!("{:?}", res) + .contains("Can't unregister the account with the positive balance without force")); + + Ok(()) +} + +#[tokio::test] +async fn close_account_force_non_empty_balance() -> anyhow::Result<()> { + let initial_balance = U128::from(NearToken::from_near(10000).as_yoctonear()); + + let worker = near_workspaces::sandbox().await?; + let root = worker.root_account()?; + let (alice, _, _, _) = init_accounts(&root).await?; + let (ft_contract, _) = init_contracts(&worker, initial_balance, &alice).await?; + + let res = ft_contract + .call("storage_unregister") + .args_json((Some(true),)) + .max_gas() + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(res.is_success()); + + let res = ft_contract.call("ft_total_supply").view().await?; + assert_eq!(res.json::()?.0, 0); + + Ok(()) +} diff --git a/tests/tests/supply.rs b/tests/tests/supply.rs new file mode 100644 index 0000000..25847eb --- /dev/null +++ b/tests/tests/supply.rs @@ -0,0 +1,18 @@ +use near_sdk::{json_types::U128, NearToken}; + +use crate::init::{init_accounts, init_contracts}; + +#[tokio::test] +async fn test_total_supply() -> anyhow::Result<()> { + let initial_balance = U128::from(NearToken::from_near(10000).as_yoctonear()); + + let worker = near_workspaces::sandbox().await?; + let root = worker.root_account()?; + let (alice, _, _, _) = init_accounts(&root).await?; + let (ft_contract, _) = init_contracts(&worker, initial_balance, &alice).await?; + + let res = ft_contract.call("ft_total_supply").view().await?; + assert_eq!(res.json::()?, initial_balance); + + Ok(()) +} diff --git a/tests/tests/transfer.rs b/tests/tests/transfer.rs new file mode 100644 index 0000000..2d5851f --- /dev/null +++ b/tests/tests/transfer.rs @@ -0,0 +1,301 @@ +use near_sdk::{json_types::U128, NearToken}; +use near_workspaces::{operations::Function, result::ValueOrReceiptId}; + +use crate::init::{init_accounts, init_contracts, register_user, ONE_YOCTO}; + +#[tokio::test] +async fn simple_transfer() -> anyhow::Result<()> { + // Create balance variables + let initial_balance = U128::from(NearToken::from_near(10000).as_yoctonear()); + let transfer_amount = U128::from(NearToken::from_near(100).as_yoctonear()); + + let worker = near_workspaces::sandbox().await?; + let root = worker.root_account()?; + let (alice, _, _, _) = init_accounts(&root).await?; + let (ft_contract, _) = init_contracts(&worker, initial_balance, &alice).await?; + + let res = ft_contract + .call("ft_transfer") + .args_json((alice.id(), transfer_amount, Option::::None)) + .max_gas() + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(res.is_success()); + + let ft_contract_balance = ft_contract + .call("ft_balance_of") + .args_json((ft_contract.id(),)) + .view() + .await? + .json::()?; + let alice_balance = ft_contract + .call("ft_balance_of") + .args_json((alice.id(),)) + .view() + .await? + .json::()?; + assert_eq!(initial_balance.0 - transfer_amount.0, ft_contract_balance.0); + assert_eq!(transfer_amount.0, alice_balance.0); + + Ok(()) +} + +#[tokio::test] +async fn transfer_call_with_burned_amount() -> anyhow::Result<()> { + let initial_balance = U128::from(NearToken::from_near(10000).as_yoctonear()); + let transfer_amount = U128::from(NearToken::from_near(100).as_yoctonear()); + + let worker = near_workspaces::sandbox().await?; + let root = worker.root_account()?; + let (alice, _, _, _) = init_accounts(&root).await?; + let (ft_contract, defi_contract) = init_contracts(&worker, initial_balance, &alice).await?; + + // defi contract must be registered as a FT account + register_user(&ft_contract, defi_contract.id()).await?; + + // root invests in defi by calling `ft_transfer_call` + let res = ft_contract + .batch() + .call( + Function::new("ft_transfer_call") + .args_json(( + defi_contract.id(), + transfer_amount, + Option::::None, + "10", + )) + .deposit(ONE_YOCTO) + .gas(near_sdk::Gas::from_tgas(150)), + ) + .call( + Function::new("storage_unregister") + .args_json((Some(true),)) + .deposit(ONE_YOCTO) + .gas(near_sdk::Gas::from_tgas(150)), + ) + .transact() + .await?; + assert!(res.is_success()); + + let logs = res.logs(); + let expected = format!("Account @{} burned {}", ft_contract.id(), 10); + assert!(logs.len() >= 2); + assert!(logs.contains(&"The account of the sender was deleted")); + assert!(logs.contains(&(expected.as_str()))); + + match res.receipt_outcomes()[5].clone().into_result()? { + ValueOrReceiptId::Value(val) => { + let used_amount = val.json::()?; + assert_eq!(used_amount, transfer_amount); + } + _ => panic!("Unexpected receipt id"), + } + assert!(res.json::()?); + + let res = ft_contract.call("ft_total_supply").view().await?; + assert_eq!(res.json::()?.0, transfer_amount.0 - 10); + let defi_balance = ft_contract + .call("ft_balance_of") + .args_json((defi_contract.id(),)) + .view() + .await? + .json::()?; + assert_eq!(defi_balance.0, transfer_amount.0 - 10); + + Ok(()) +} + +#[tokio::test] +async fn transfer_call_with_immediate_return_and_no_refund() -> anyhow::Result<()> { + let initial_balance = U128::from(NearToken::from_near(10000).as_yoctonear()); + let transfer_amount = U128::from(NearToken::from_near(100).as_yoctonear()); + + let worker = near_workspaces::sandbox().await?; + let root = worker.root_account()?; + let (alice, _, _, _) = init_accounts(&root).await?; + let (ft_contract, defi_contract) = init_contracts(&worker, initial_balance, &alice).await?; + + // defi contract must be registered as a FT account + register_user(&ft_contract, defi_contract.id()).await?; + + // root invests in defi by calling `ft_transfer_call` + let res = ft_contract + .call("ft_transfer_call") + .args_json(( + defi_contract.id(), + transfer_amount, + Option::::None, + "take-my-money", + )) + .max_gas() + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(res.is_success()); + + let root_balance = ft_contract + .call("ft_balance_of") + .args_json((ft_contract.id(),)) + .view() + .await? + .json::()?; + let defi_balance = ft_contract + .call("ft_balance_of") + .args_json((defi_contract.id(),)) + .view() + .await? + .json::()?; + assert_eq!(initial_balance.0 - transfer_amount.0, root_balance.0); + assert_eq!(transfer_amount.0, defi_balance.0); + + Ok(()) +} + +#[tokio::test] +async fn transfer_call_when_called_contract_not_registered_with_ft() -> anyhow::Result<()> { + let initial_balance = U128::from(NearToken::from_near(10000).as_yoctonear()); + let transfer_amount = U128::from(NearToken::from_near(100).as_yoctonear()); + + let worker = near_workspaces::sandbox().await?; + let root = worker.root_account()?; + let (alice, _, _, _) = init_accounts(&root).await?; + let (ft_contract, defi_contract) = init_contracts(&worker, initial_balance, &alice).await?; + + // call fails because DEFI contract is not registered as FT user + let res = ft_contract + .call("ft_transfer_call") + .args_json(( + defi_contract.id(), + transfer_amount, + Option::::None, + "take-my-money", + )) + .max_gas() + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(res.is_failure()); + + // balances remain unchanged + let root_balance = ft_contract + .call("ft_balance_of") + .args_json((ft_contract.id(),)) + .view() + .await? + .json::()?; + let defi_balance = ft_contract + .call("ft_balance_of") + .args_json((defi_contract.id(),)) + .view() + .await? + .json::()?; + assert_eq!(initial_balance.0, root_balance.0); + assert_eq!(0, defi_balance.0); + + Ok(()) +} + +#[tokio::test] +async fn transfer_call_with_promise_and_refund() -> anyhow::Result<()> { + let initial_balance = U128::from(NearToken::from_near(10000).as_yoctonear()); + let refund_amount = U128::from(NearToken::from_near(50).as_yoctonear()); + let transfer_amount = U128::from(NearToken::from_near(100).as_yoctonear()); + + let worker = near_workspaces::sandbox().await?; + let root = worker.root_account()?; + let (alice, _, _, _) = init_accounts(&root).await?; + let (ft_contract, defi_contract) = init_contracts(&worker, initial_balance, &alice).await?; + + // defi contract must be registered as a FT account + register_user(&ft_contract, defi_contract.id()).await?; + + let res = ft_contract + .call("ft_transfer_call") + .args_json(( + defi_contract.id(), + transfer_amount, + Option::::None, + refund_amount.0.to_string(), + )) + .max_gas() + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(res.is_success()); + + let root_balance = ft_contract + .call("ft_balance_of") + .args_json((ft_contract.id(),)) + .view() + .await? + .json::()?; + let defi_balance = ft_contract + .call("ft_balance_of") + .args_json((defi_contract.id(),)) + .view() + .await? + .json::()?; + assert_eq!( + initial_balance.0 - transfer_amount.0 + refund_amount.0, + root_balance.0 + ); + assert_eq!(transfer_amount.0 - refund_amount.0, defi_balance.0); + + Ok(()) +} + +#[tokio::test] +async fn transfer_call_promise_panics_for_a_full_refund() -> anyhow::Result<()> { + let initial_balance = U128::from(NearToken::from_near(10000).as_yoctonear()); + let transfer_amount = U128::from(NearToken::from_near(100).as_yoctonear()); + let worker = near_workspaces::sandbox().await?; + let root = worker.root_account()?; + let (alice, _, _, _) = init_accounts(&root).await?; + let (ft_contract, defi_contract) = init_contracts(&worker, initial_balance, &alice).await?; + + // defi contract must be registered as a FT account + register_user(&ft_contract, defi_contract.id()).await?; + + // root invests in defi by calling `ft_transfer_call` + let res = ft_contract + .call("ft_transfer_call") + .args_json(( + defi_contract.id(), + transfer_amount, + Option::::None, + "no parsey as integer big panic oh no".to_string(), + )) + .max_gas() + .deposit(ONE_YOCTO) + .transact() + .await?; + assert!(res.is_success()); + + let promise_failures = res.receipt_failures(); + assert_eq!(promise_failures.len(), 1); + let failure = promise_failures[0].clone().into_result(); + if let Err(err) = failure { + assert!(format!("{:?}", err).contains("ParseIntError")); + } else { + unreachable!(); + } + + // balances remain unchanged + let root_balance = ft_contract + .call("ft_balance_of") + .args_json((ft_contract.id(),)) + .view() + .await? + .json::()?; + let defi_balance = ft_contract + .call("ft_balance_of") + .args_json((defi_contract.id(),)) + .view() + .await? + .json::()?; + assert_eq!(initial_balance, root_balance); + assert_eq!(0, defi_balance.0); + + Ok(()) +}