Lack of vaccine monitoring bodies can hamper purchase, delivery, monitoring, and transparency in the VSC. Supply chains around the globe are confronting significant interruption, and the lack of correspondence between supply chain members can impede a proper production and distribution of the COVID-19 vaccine.
By managing the supply chain, companies can cut excess costs and deliver products to the consumer faster.
Since 1990's thanks to the use of enterprise resource planning (ERP) systems considerable advancement in supply chain information sharing has taken place in last 3 decades. However, visibility remains a challenge in large supply chains involving complex transactions.
Let us consider a scenario, a simple transaction involving a manufacturer that sources a product to a supplier, and a vendor that sources the product from supplier and later sell it to customers. However in the flow from manufacturer to supplier to vendor the financial institutions which are key to financing are in a blind spot. The transaction involves information flows, inventory flows, and financial flows. The state-of-the-art ERP systems, manual audits, and inspections can’t reliably connect all the flows, which makes it hard to eliminate execution errors, improve decision-making, and resolve supply chain conflicts. The below diagram depicts the difference between conventional record keeping in supply chain management against blockchain. Read more
- Users Role: Manufacturer, Suppliers, Vendors & Customers
- Smart Contract consisting of all the rules and protocols required for Supply chain Management. We have created 2 contacts for Users and Products, and inherited those contract within main supply-chain contract.
- Blockchain Network to deploy the Contract. We have used Rinkeby for our contract.
- Website for user Interface where Users according to their role can access informfation. We have created webpage with React & Native Base.
- One Manufacturer. Here we took Pfizer reference for the critical Life Saving drugs Manufacturer.
- Only Manufacturer can add the products to Inventory.
- Manufacturer can only add Supplier to the database and sell the products to Suppliers.
- Supplier can only add Vendors to the database and sell the products to Vendors.
- Vendors can only add Customers to the database and sell the products to Customers.
- All the user roles should have mandatory metamask address on the network except Customers. Customers may or may not have meta mask address.
- Product details and supply chain lifecycle should be public to all the users.
- The User who deploy the contract to the main net will be considered as Manufacturer.
// Users
enum UserRole {
Manufacturer,
Supplier,
Vendor,
Customer
}
struct UserDetails {
UserRole role;
address id_;
string name;
string email;
}
// Products
enum ProductType {
BCG,
RNA,
MRNA,
MMR,
NasalFlu
}
struct Product {
string name;
address manufacturer;
uint256 manDateEpoch;
uint256 expDateEpoch;
bool isInBatch; // few products will be packed & sold in batches
uint256 batchCount; // QTY that were packed in single batch
string barcodeId;
string productImage;
ProductType productType;
string scientificName;
string usage;
string[] composition;
string[] sideEffects;
}
// Products History
struct UserHistory {
address id_; // account Id of the user
uint256 date; // Added, Purchased date in epoch in UTC timezone
}
struct ProductHistory {
UserHistory manufacturer;
UserHistory supplier;
UserHistory vendor;
UserHistory[] customers;
}
Function Name | Input Params | Return value | Description |
---|---|---|---|
getMyDetails() | - | UserDetails | To get the details of the current logged-in user |
getMyUsersList() | - | UserDetails[] | To get all the users that current logged-in user has added |
getUserDetails() | metamask address of user |
UserDetails | To get the details of the current logged-in user |
addParty() | UserDetails | - | To add vendors, Suppliers & customer's prior |
getAllProducts() | - | Product[] | To get all the products list |
getSingleProduct() | barcodeId | Product, ProductHistory |
To get the details of the single product along with the history of the product |
getMyProducts() | - | Product[] | To get all the products that were linked to current logged-in user |
addProduct() | Product,currentTime in epoch |
- | To add a new product to the system. Only manufacturer can add the products |
sellProduct() | party metamask address ,barcodeId, currentTime in epoch |
- | To trasnfer the ownership to next level (By the selling-buying concept) |
Event Name | Params | Description |
---|---|---|
NewUser | namerole 's index |
When a new user is added, it gets triggered with the public details |
LostUser | namerole 's index |
When a user is removed from the system, this gets triggered |
NewProduct | manufacturerName, scientificName, barcodeId, manDateEpoch, expDateEpoch |
Triggers when a new product is added to system by the manufacturer |
ProductOwnershipTransfer | manufacturerName, scientificName, barcodeId, buyerName, buyerEmail |
When the product is sold to next level in the cycle then this gets triggered |
Compiler: solc: 0.8.12+commit.f00d7308
Truffle: v5.5.5
Node: v14.17.0
-
cd into project repro
cd sample-supply-chain-ethereum cd blockchain
-
download truffle dependencies
npm install
-
Download/Start ganache
https://truffleframework.com/ganache
-
Compiling contracts
truffle compile
-
Migrating to ganache
Note depending on ganache cli/ui you my need to change truffle.js port settings Current listing on port : 7545
truffle migrate --network development --reset --all
-
Testing on ganache
truffle test
-
Switch to FrontEnd & Testing
Note Change settings to your Contract address to point to local
cd ..
cd front-end
npm install
npm start
- Migrating to Rinkeby
Note Change truffle settings to your Contract Creator address within the "from" rinkeby configuration
truffle migrate --network rinkeby --reset --all
- Start FrontEnd on Rinkeby
Note Revert back all your local configurations & configure it to point to rinkeby
npm start