# Casper Gitcoin Answer
## Create and deploy a simple, smart contract
**Prerequisites**
Install the Rust programming language

**Installing Dependencies**
CMake

**Development Environment Setup**
Compiling the contract to WASM

Test the Contract

**Setting up the Network**
Compile the NCTL binary scripts.

Set up the assets required to run a local network

**Deploying Contracts**
The Casper Client

Check the Client Version

**Sending a Deployment to the Testnet**

**Check Deploy Status**

## Complete one of the existing tutorials for writing smart contracts
### Multi-Signature Tutorial is choosed for installation
**Building the Smart Contract**

**Setting up the Client**
File .env look like

Install the JavaScript packages in the keys-manager/client folder

**Testing the Client**

## Demonstrate key management concepts
### Scenario 1: signing transactions with a single key is choosed for installation
```
(async function () {
let deploy;
// 0. Initial state of the account.
// There should be only one associated key (fuacet) with weight 1.
// Deployment Threshold should be set to 1.
// Key Management Threshold should be set to 1.
let masterKey = keyManager.randomMasterKey();
let mainAccount = masterKey.deriveIndex(1);
console.log("\n0.1 Fund main account.\n");
await keyManager.fundAccount(mainAccount);
await keyManager.printAccount(mainAccount);
console.log("\n[x]0.2 Install Keys Manager contract");
deploy = keyManager.keys.buildContractInstallDeploy(mainAccount);
await keyManager.sendDeploy(deploy, [mainAccount]);
await keyManager.printAccount(mainAccount);
// 1. Set mainAccount's weight to 1
console.log("\n1. Set faucet's weight to 1\n");
deploy = keyManager.keys.setKeyWeightDeploy(mainAccount, mainAccount, 1);
await keyManager.sendDeploy(deploy, [mainAccount]);
await keyManager.printAccount(mainAccount);
// 2. Set Keys Management Threshold to 1.
console.log("\n2. Set Keys Management Threshold to 1\n");
deploy = keyManager.keys.setKeyManagementThresholdDeploy(mainAccount, 1);
await keyManager.sendDeploy(deploy, [mainAccount]);
await keyManager.printAccount(mainAccount);
// 3. Set Deploy Threshold to 1.
console.log("\n3. Set Deploy Threshold to 1.\n");
deploy = keyManager.keys.setDeploymentThresholdDeploy(mainAccount, 1);
await keyManager.sendDeploy(deploy, [mainAccount]);
await keyManager.printAccount(mainAccount);
})();
```

## Learn to transfer tokens to an account on the Casper Testnet.
### Transfer with CLI
Send the transaction

Sign the transaction

### Transfer with CSPR Portal

## Learn to Delegate and Undelegate on the Casper Testnet
### Delegate

### Undelegate
