---
# System prepended metadata

title: Casper Network Gitcoin Hackathon

---

# Casper Network Gitcoin Hackathon

# Task 1

All prerequisites where setup on Ubuntu 21.04 following https://docs.casperlabs.io/en/latest/dapp-dev-guide/setup-of-rust-contract-sdk.html.

![](https://i.imgur.com/xnXIkQd.png)



## Create and deploy a simple, smart contract with cargo casper and cargo test

- Project created with `cargo casper hackathon`

- Create and deploy
    ![](https://i.imgur.com/ry10mNX.png)

- Test contract
    ![](https://i.imgur.com/sZCL75N.png)

- Deploy contract to local devnet using faucet account

    ![](https://i.imgur.com/aP7fvWV.png)


    ![](https://i.imgur.com/CAXVkep.png)


## Complete one of the existing tutorials for writing smart contracts

### Counter

- Cloned counter Tutorial: `git clone https://github.com/casper-ecosystem/counter`


- View the Network State
![](https://i.imgur.com/Goo4cYB.png)

- Ran tests
![](https://i.imgur.com/fdituqM.png)


- Built the contract and deployed to the local Casper devnet
    - counter-define
    ![](https://i.imgur.com/S4OMDU9.png)
    
    - counter-call
    ![](https://i.imgur.com/tZgvs6A.png)
   
- Retrieve the specific counter contract details
![](https://i.imgur.com/pnKeSfp.png)


- Retrieve the specific counter variable details
![](https://i.imgur.com/IcLpzpw.png)

- Retrieve the specific deploy details
![](https://i.imgur.com/It7lHZQ.png)

- Increment the Counter
![](https://i.imgur.com/scUhuUw.png)

- View the Updated Network State Again (Stored value is now 2...)
![](https://i.imgur.com/tR7lpGm.png)
![](https://i.imgur.com/Cd7VB2p.png)


- Increment the Counter Again (using second contract)
![](https://i.imgur.com/oDqBjUq.png)

- View the Final Network State
![](https://i.imgur.com/ydtDvaJ.png)

 
## Demonstrate key management concepts by modifying the client in the Multi-Sig tutorial to address one of the additional scenarios

- Scenario 2: deploying with special keys

- Cloned `https://github.com/gitcoindev/keys-manager`  and followed setup steps
- Added line to package.json:
`"start:scenario-two": "node -r dotenv/config ./src/scenario-two.js",` 

- Added file 'scenario-two.js' to client/src
```javascript
const keyManager = require('./key-manager');
const TRANSFER_AMOUNT = process.env.TRANSFER_AMOUNT || 2500000000;

(async function() {

    let deploy;

    // init

    let masterKey = keyManager.randomMasterKey();
    let mainAccount = masterKey.deriveIndex(1);// Main Account
    let secondaryAccount = masterKey.deriveIndex(2);//Secondary Account
    let testAccount = masterKey.deriveIndex(3);// Test account

    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 2
    console.log("\n1. Set faucet's weight to 2\n");
    deploy = keyManager.keys.setKeyWeightDeploy(mainAccount, mainAccount, 2);
    await keyManager.sendDeploy(deploy, [mainAccount]);
    await keyManager.printAccount(mainAccount);
    
    // 2. Set Keys Management Threshold to 2.
    console.log("\n2. Set Keys Management Threshold to 2\n");
    deploy = keyManager.keys.setKeyManagementThresholdDeploy(mainAccount, 2);
    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);
    
    // 4. Add secondary key with weight 1 which can only deploy.
    console.log("\n4. Add secondary key with weight 1.\n");
    deploy = keyManager.keys.setKeyWeightDeploy(mainAccount, secondaryAccount, 1);
    await keyManager.sendDeploy(deploy, [mainAccount]);
    await keyManager.printAccount(mainAccount);

    // 6. Make a transfer from faucet using the secondary account.
    console.log("\n6. Make a transfer from faucet using the secondary account.\n");
    deploy = keyManager.transferDeploy(mainAccount, secondaryAccount, TRANSFER_AMOUNT);
    await keyManager.sendDeploy(deploy, [secondaryAccount]);
    await keyManager.printAccount(mainAccount);

    // 7. Add test key with weight 1 using secondary account.
    console.log("\n7. Add first new key with weight 1 using the secondary account. Fail is Expected...\n");
    deploy = keyManager.keys.setKeyWeightDeploy(mainAccount, testAccount, 1);
    await keyManager.sendDeploy(deploy, [secondaryAccount]);
    await keyManager.printAccount(mainAccount);
})();
```

- Output:
```

> keys-manager@1.0.0 start:scenario-two
> node -r dotenv/config ./src/scenario-two.js


0.1 Fund main account.

Signed by: account-hash-ac270d592ae6648f61958cff6e422743c69f118dc358ead49f4ad26a54de7227
Deploy hash: 7589a28f7d076ea1912dfa674b3f55086f6c185ef18f21ada48487724996c96f
Deploy result:
{
  deploy: {
    hash: '7589a28f7d076ea1912dfa674b3f55086f6c185ef18f21ada48487724996c96f',
    header: {
      account: '01911085d5b7d86bec517f174021ff3755efc25aa523658e0537df016a35b2d9c2',
      timestamp: '2021-09-17T10:49:34.124Z',
      ttl: '30m',
      gas_price: 1,
      body_hash: '33f61db9612f6e1e60eb907ddd23bc20e1fc21a021363b44e8591af3510e569a',
      dependencies: [],
      chain_name: 'casper-net-1'
    },
    payment: { ModuleBytes: [Object] },
    session: { Transfer: [Object] },
    approvals: [ [Object] ]
  }
}

[x] Current state of the account:
{
  _accountHash: 'account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707',
  namedKeys: [],
  mainPurse: 'uref-501b02dd61770c7fcced03532f775cf74b5d673aa18a39ebf82745cde3ace147-007',
  associatedKeys: [
    {
      accountHash: 'account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707',
      weight: 1
    }
  ],
  actionThresholds: { deployment: 1, keyManagement: 1 }
}

[x]0.2 Install Keys Manager contract
Signed by: account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707
Deploy hash: 907e4848ba1019a2db3f71ade6010a784c6f0d752b8b538581dbcea3948ea08a
Deploy result:
{
  deploy: {
    hash: '907e4848ba1019a2db3f71ade6010a784c6f0d752b8b538581dbcea3948ea08a',
    header: {
      account: '0202da26a3d30a9a7e83302fad9f91226cea31dd149184bfc9888eb447d03c45a8e1',
      timestamp: '2021-09-17T10:50:41.491Z',
      ttl: '30m',
      gas_price: 1,
      body_hash: 'd4b397a20f2addf8a039fad7d73b2aa781b6e954a283463d84047f8a97215c90',
      dependencies: [],
      chain_name: 'casper-net-1'
    },
    payment: { ModuleBytes: [Object] },
    session: { ModuleBytes: [Object] },
    approvals: [ [Object] ]
  }
}

[x] Current state of the account:
{
  _accountHash: 'account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707',
  namedKeys: [
    {
      name: 'keys_manager',
      key: 'hash-ba63cf13afe16e4ee4d271e3f7ffa83953b472557a1574a15a100951f7f65886'
    },
    {
      name: 'keys_manager_hash',
      key: 'uref-fcde0b9d3eef40813ad0e3170dc2152ebfa1264537fac03cacfcc328de9de158-007'
    }
  ],
  mainPurse: 'uref-501b02dd61770c7fcced03532f775cf74b5d673aa18a39ebf82745cde3ace147-007',
  associatedKeys: [
    {
      accountHash: 'account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707',
      weight: 1
    }
  ],
  actionThresholds: { deployment: 1, keyManagement: 1 }
}

1. Set faucet's weight to 2

Signed by: account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707
Deploy hash: 4c73ff2ef17e35144ce60b3e054217d352eafd67d4c8c0844060e39e5b286344
Deploy result:
{
  deploy: {
    hash: '4c73ff2ef17e35144ce60b3e054217d352eafd67d4c8c0844060e39e5b286344',
    header: {
      account: '0202da26a3d30a9a7e83302fad9f91226cea31dd149184bfc9888eb447d03c45a8e1',
      timestamp: '2021-09-17T10:51:46.651Z',
      ttl: '30m',
      gas_price: 1,
      body_hash: 'a820402c5f1fc9f5c2b57610004070ef1fa3930383a802b519d25972be42da1b',
      dependencies: [],
      chain_name: 'casper-net-1'
    },
    payment: { ModuleBytes: [Object] },
    session: { StoredContractByName: [Object] },
    approvals: [ [Object] ]
  }
}

[x] Current state of the account:
{
  _accountHash: 'account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707',
  namedKeys: [
    {
      name: 'keys_manager',
      key: 'hash-ba63cf13afe16e4ee4d271e3f7ffa83953b472557a1574a15a100951f7f65886'
    },
    {
      name: 'keys_manager_hash',
      key: 'uref-fcde0b9d3eef40813ad0e3170dc2152ebfa1264537fac03cacfcc328de9de158-007'
    }
  ],
  mainPurse: 'uref-501b02dd61770c7fcced03532f775cf74b5d673aa18a39ebf82745cde3ace147-007',
  associatedKeys: [
    {
      accountHash: 'account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707',
      weight: 2
    }
  ],
  actionThresholds: { deployment: 1, keyManagement: 1 }
}

2. Set Keys Management Threshold to 2

Signed by: account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707
Deploy hash: dc33722c18f3555cbea310ecd536835823af7f97c0827249bfeff0661954ab73
Deploy result:

{
  deploy: {
    hash: 'dc33722c18f3555cbea310ecd536835823af7f97c0827249bfeff0661954ab73',
    header: {
      account: '0202da26a3d30a9a7e83302fad9f91226cea31dd149184bfc9888eb447d03c45a8e1',
      timestamp: '2021-09-17T10:52:51.915Z',
      ttl: '30m',
      gas_price: 1,
      body_hash: '9357475174b44041d5a89a9091cded242fedc567af82c7fa920d5ec13d5c7f74',
      dependencies: [],
      chain_name: 'casper-net-1'
    },
    payment: { ModuleBytes: [Object] },
    session: { StoredContractByName: [Object] },
    approvals: [ [Object] ]
  }
}

[x] Current state of the account:
{
  _accountHash: 'account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707',
  namedKeys: [
    {
      name: 'keys_manager',
      key: 'hash-ba63cf13afe16e4ee4d271e3f7ffa83953b472557a1574a15a100951f7f65886'
    },
    {
      name: 'keys_manager_hash',
      key: 'uref-fcde0b9d3eef40813ad0e3170dc2152ebfa1264537fac03cacfcc328de9de158-007'
    }
  ],
  mainPurse: 'uref-501b02dd61770c7fcced03532f775cf74b5d673aa18a39ebf82745cde3ace147-007',
  associatedKeys: [
    {
      accountHash: 'account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707',
      weight: 2
    }
  ],
  actionThresholds: { deployment: 1, keyManagement: 2 }
}

3. Set Deploy Threshold to 1.

Signed by: account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707
Deploy hash: 82d1c939dea187eaa849781b501a4ed6c9394c0c6c39527aaff6b8a9b02a2b3e
Deploy result:
{
  deploy: {
    hash: '82d1c939dea187eaa849781b501a4ed6c9394c0c6c39527aaff6b8a9b02a2b3e',
    header: {
      account: '0202da26a3d30a9a7e83302fad9f91226cea31dd149184bfc9888eb447d03c45a8e1',
      timestamp: '2021-09-17T10:53:58.185Z',
      ttl: '30m',
      gas_price: 1,
      body_hash: '4807b024a8e1e7c7d1da5a9101a21f38303d4689905d88d4585eec852fd7216b',
      dependencies: [],
      chain_name: 'casper-net-1'
    },
    payment: { ModuleBytes: [Object] },
    session: { StoredContractByName: [Object] },
    approvals: [ [Object] ]
  }
}

[x] Current state of the account:
{
  _accountHash: 'account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707',
  namedKeys: [
    {
      name: 'keys_manager',
      key: 'hash-ba63cf13afe16e4ee4d271e3f7ffa83953b472557a1574a15a100951f7f65886'
    },
    {
      name: 'keys_manager_hash',
      key: 'uref-fcde0b9d3eef40813ad0e3170dc2152ebfa1264537fac03cacfcc328de9de158-007'
    }
  ],
  mainPurse: 'uref-501b02dd61770c7fcced03532f775cf74b5d673aa18a39ebf82745cde3ace147-007',
  associatedKeys: [
    {
      accountHash: 'account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707',
      weight: 2
    }
  ],
  actionThresholds: { deployment: 1, keyManagement: 2 }
}

4. Add secondary key with weight 1.

Signed by: account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707
Deploy hash: 452c8666f381aa47697c55cbffe2d4d5f14d42ad9bb0f0150661c4fae36a7316
Deploy result:
{
  deploy: {
    hash: '452c8666f381aa47697c55cbffe2d4d5f14d42ad9bb0f0150661c4fae36a7316',
    header: {
      account: '0202da26a3d30a9a7e83302fad9f91226cea31dd149184bfc9888eb447d03c45a8e1',
      timestamp: '2021-09-17T10:55:03.440Z',
      ttl: '30m',
      gas_price: 1,
      body_hash: '6de2568e9e969d47b41aaaf6c78763b5f17966935966853f1efaf8dc9a80728a',
      dependencies: [],
      chain_name: 'casper-net-1'
    },
    payment: { ModuleBytes: [Object] },
    session: { StoredContractByName: [Object] },
    approvals: [ [Object] ]
  }
}

[x] Current state of the account:
{
  _accountHash: 'account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707',
  namedKeys: [
    {
      name: 'keys_manager',
      key: 'hash-ba63cf13afe16e4ee4d271e3f7ffa83953b472557a1574a15a100951f7f65886'
    },
    {
      name: 'keys_manager_hash',
      key: 'uref-fcde0b9d3eef40813ad0e3170dc2152ebfa1264537fac03cacfcc328de9de158-007'
    }
  ],
  mainPurse: 'uref-501b02dd61770c7fcced03532f775cf74b5d673aa18a39ebf82745cde3ace147-007',
  associatedKeys: [
    {
      accountHash: 'account-hash-65a72d9fe4a001e197bfab736877a8a0cd571369aa1e2d6bc1f7aef2b2b4b7a9',
      weight: 1
    },
    {
      accountHash: 'account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707',
      weight: 2
    }
  ],
  actionThresholds: { deployment: 1, keyManagement: 2 }
}

6. Make a transfer from faucet using the secondary account.

Signed by: account-hash-65a72d9fe4a001e197bfab736877a8a0cd571369aa1e2d6bc1f7aef2b2b4b7a9
Deploy hash: dc9db790b3d9ff982046eb9fc63a9cee2d55b6f9902835537a6cd876f1d22bf3
Deploy result:
{
  deploy: {
    hash: 'dc9db790b3d9ff982046eb9fc63a9cee2d55b6f9902835537a6cd876f1d22bf3',
    header: {
      account: '0202da26a3d30a9a7e83302fad9f91226cea31dd149184bfc9888eb447d03c45a8e1',
      timestamp: '2021-09-17T10:56:08.699Z',
      ttl: '30m',
      gas_price: 1,
      body_hash: '4fc99ce6388c2a27e12b75357a413b95fcc01d6bc25857ae63695e9f6309b7bf',
      dependencies: [],
      chain_name: 'casper-net-1'
    },
    payment: { ModuleBytes: [Object] },
    session: { Transfer: [Object] },
    approvals: [ [Object] ]
  }
}

[x] Current state of the account:
{
  _accountHash: 'account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707',
  namedKeys: [
    {
      name: 'keys_manager',
      key: 'hash-ba63cf13afe16e4ee4d271e3f7ffa83953b472557a1574a15a100951f7f65886'
    },
    {
      name: 'keys_manager_hash',
      key: 'uref-fcde0b9d3eef40813ad0e3170dc2152ebfa1264537fac03cacfcc328de9de158-007'
    }
  ],
  mainPurse: 'uref-501b02dd61770c7fcced03532f775cf74b5d673aa18a39ebf82745cde3ace147-007',
  associatedKeys: [
    {
      accountHash: 'account-hash-65a72d9fe4a001e197bfab736877a8a0cd571369aa1e2d6bc1f7aef2b2b4b7a9',
      weight: 1
    },
    {
      accountHash: 'account-hash-866c0904563222d7f6fc02dd6114011df04b7e52543d10d96759cbc475966707',
      weight: 2
    }
  ],
  actionThresholds: { deployment: 1, keyManagement: 2 }
}

7. Add first new key with weight 1 using the secondary account. Fail is Expected...

Signed by: account-hash-65a72d9fe4a001e197bfab736877a8a0cd571369aa1e2d6bc1f7aef2b2b4b7a9
Deploy hash: b85db19337e30773741dcee43477db95f7a8cdb00f50e18bc07343405ec2283e
Deploy result:
(node:156898) UnhandledPromiseRejectionWarning: Error: Contract execution: User error: 2
    at getDeploy (/home/nhaga/dev/blockchain/casper/keys-manager/client/src/key-manager.js:48:23)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (internal/process/task_queues.js:95:5)
    at async printDeploy (/home/nhaga/dev/blockchain/casper/keys-manager/client/src/key-manager.js:91:41)
    at async Object.sendDeploy (/home/nhaga/dev/blockchain/casper/keys-manager/client/src/key-manager.js:78:5)
    at async /home/nhaga/dev/blockchain/casper/keys-manager/client/src/scenario-two.js:57:5
(Use `node --trace-warnings ...` to show where the warning was created)
(node:156898) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:156898) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
```


 
## Learn to transfer tokens to an account on the Casper Testnet. 

### Using https://testnet.cspr.live/

- Fund account with faucet
![](https://i.imgur.com/mgvu86d.png)

- Transfer
![](https://i.imgur.com/OD3cVjo.png)
![](https://i.imgur.com/gP7BhDd.png)
![](https://i.imgur.com/W4YvSR4.png)
![](https://i.imgur.com/nx08vxK.png)
![](https://i.imgur.com/0mNcCRv.png)
![](https://i.imgur.com/CsqasrF.png)

- Explorer link:
    https://testnet.cspr.live/account/020243a99f6724a35ec6cc6216e2f11d7548f1c6947875619bfe08e332f6f83f3578

### Using cli

- Transfer
![](https://i.imgur.com/EVnNAu2.png)

![](https://i.imgur.com/FXhqaw2.png)

- Explorer link:
https://testnet.cspr.live/deploy/b68a370bfb689b2929c1b04643c7aa55aaff7e9d57e006632e869217ebdfe956

 
## Learn to Delegate and Undelegate on the Casper Testnet

### Using https://testnet.cspr.live/

- Delegating 500 CSPR on Casper Testnet
![](https://i.imgur.com/a3Vy1lY.png)
![](https://i.imgur.com/5N4FH36.png)
![](https://i.imgur.com/Cs9i9GC.png)
![](https://i.imgur.com/B7NCmWE.png)
![](https://i.imgur.com/ZFAC9Ax.png)

Explorer link: 
https://testnet.cspr.live/deploy/f735ebf550b9311ebbfac41382dc50fe75cf4f7c5ff84dc38f4e8bb16cf387ca

- Account after hours of delegating

![](https://i.imgur.com/iZxxyNY.png)


- Undelegate 100 CSPR
![](https://i.imgur.com/Md0Mjgl.png)
![](https://i.imgur.com/hg8dPV0.png)
![](https://i.imgur.com/EXYWQGj.png)
![](https://i.imgur.com/h6VV4f5.png)
![](https://i.imgur.com/1CJqEQS.png)







### Using cli

- Delegating 100 CSPR on Casper Testnet with cli

![](https://i.imgur.com/OIPKpWe.png)

![](https://i.imgur.com/wQoU4C7.png)

