Smart Contract
RideShare
A.b576a3926d239682.RideShare
1import FlowToken from 0x1654653399040a61
2import FungibleToken from 0xf233dcee88fe0abe
3
4access(all) contract RideShare {
5
6 access(self) let FlowTokenVault: Capability<&{FungibleToken.Receiver}>
7 access(self) let DriverFlowTokenVault: {UInt: Capability<&{FungibleToken.Receiver}>}
8 access(self) let info: Info
9 access(self) var totalDrivers: UInt // Driver ID
10
11 /* 構造体 */
12 access(all) struct Info {
13
14 access(contract) var driverData: {UInt: DriverData}
15 access(contract) var orderQueue: [Order]
16
17 /* setter */
18 access(contract) fun setDriver(id: UInt, keys: [String], values: [String]): UInt {
19 if let saved = self.driverData[id] {
20 for index, key in keys {
21 saved.set(key: key, value: values[index])
22 }
23 self.driverData[id] = saved // 更新
24 return id
25 } else {
26 // 新規登録
27 RideShare.totalDrivers = RideShare.totalDrivers + 1
28 var data = DriverData()
29 for index, key in keys {
30 data.set(key: key, value: values[index])
31 }
32 self.driverData[RideShare.totalDrivers] = data
33 return RideShare.totalDrivers
34 }
35 }
36
37 access(contract) fun setOrder(execTime: UFix64, driverId: UInt, start: String, goal: String, wage: UFix64) {
38 var order = Order(execTime: execTime, driverId: driverId, start: start, goal: goal, wage: wage)
39 self.orderQueue.append(order)
40
41 }
42
43 init() {
44 self.driverData = {}
45 self.orderQueue = []
46 }
47 }
48
49
50 /* Info内の構造体 */
51 access(all) struct DriverData {
52
53 access(contract) var data: {String: String}
54
55 /* setter */
56 access(contract) fun set(key: String, value: String) {
57 self.data[key] = value
58 }
59
60 init() {
61 self.data = {}
62 }
63 }
64
65 /* Info内の構造体 */
66 access(all) struct Order {
67
68 access(all) let execTime: UFix64
69 access(all) let driverId: UInt
70 access(all) let start: String
71 access(all) let goal: String
72 access(all) let wage: UFix64
73
74 init(execTime: UFix64, driverId: UInt, start: String, goal: String, wage: UFix64) {
75 self.execTime = execTime
76 self.driverId = driverId
77 self.start = start
78 self.goal = goal
79 self.wage = wage
80 }
81 }
82
83 // GET
84 access(all) fun getInfo(): Info {
85 return self.info
86 }
87 // PUT
88 access(all) fun setDriverInfo(driverId: UInt, keys: [String], values: [String], flow_vault_receiver: Capability<&{FungibleToken.Receiver}>?) {
89 let _driverId = RideShare.info.setDriver(id: driverId, keys: keys, values: values)
90 if (flow_vault_receiver != nil) {
91 RideShare.DriverFlowTokenVault[_driverId] = flow_vault_receiver
92 }
93 }
94
95 // PUT
96 access(all) fun newOrder(payment: @FlowToken.Vault, execTime: UFix64, driverId: UInt, start: String, goal: String) {
97 self.info.setOrder(execTime: execTime, driverId: driverId, start: start, goal: goal, wage: payment.balance * 0.97)
98 self.FlowTokenVault.borrow()!.deposit(from: <- payment)
99 }
100
101 access(all) resource Admin {
102 // ORDER COMPLETE
103 access(all) fun payWage(driverId: UInt, wage: UFix64) {
104 pre {
105 RideShare.DriverFlowTokenVault[driverId] != nil: "Deposit destination is nil, so we can't send wage."
106 }
107 // Pay the wage.
108 let wage <- RideShare.account.storage.borrow<auth(FungibleToken.Withdraw) &{FungibleToken.Provider}>(from: /storage/flowTokenVault)!.withdraw(amount: wage) as! @FlowToken.Vault
109 RideShare.DriverFlowTokenVault[driverId]!.borrow()!.deposit(from: <- wage)
110 }
111 }
112
113 init() {
114 self.info = Info()
115 self.FlowTokenVault = self.account.capabilities.get<&{FungibleToken.Receiver}>(/public/flowTokenReceiver)
116 self.DriverFlowTokenVault = {}
117 self.totalDrivers = 0
118 self.account.storage.save( <- create Admin(), to: /storage/RideShareAdmin)
119 }
120}
121