Smart Contract
TaxiRide
A.b576a3926d239682.TaxiRide
1import FlowToken from 0x1654653399040a61
2import FungibleToken from 0xf233dcee88fe0abe
3
4access(all) contract TaxiRide {
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 TaxiRide.totalDrivers = TaxiRide.totalDrivers + 1
28 var data = DriverData()
29 for index, key in keys {
30 data.set(key: key, value: values[index])
31 }
32 self.driverData[TaxiRide.totalDrivers] = data
33 return TaxiRide.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 = TaxiRide.info.setDriver(id: driverId, keys: keys, values: values)
90 if (flow_vault_receiver != nil) {
91 TaxiRide.DriverFlowTokenVault[_driverId] = flow_vault_receiver
92 }
93 }
94
95 // 間違えて0(driverId)に入金先をセットしてしまったので解消するためのコード(orz)。1回しか使えない。nilはDriverFlowTokenVaultにセットできないので。
96 access(all) fun fixBug(driverId: UInt) {
97 pre {
98 TaxiRide.DriverFlowTokenVault[0] != nil: "nil can't be set to DriverFlowTokenVault."
99 }
100 TaxiRide.DriverFlowTokenVault[driverId] = TaxiRide.DriverFlowTokenVault[0]
101 TaxiRide.DriverFlowTokenVault[0] = nil
102 }
103
104 // PUT
105 access(all) fun newOrder(payment: @FlowToken.Vault, execTime: UFix64, driverId: UInt, start: String, goal: String) {
106 self.info.setOrder(execTime: execTime, driverId: driverId, start: start, goal: goal, wage: payment.balance * 0.97)
107 self.FlowTokenVault.borrow()!.deposit(from: <- payment)
108 }
109
110 access(all) resource Admin {
111 // ORDER COMPLETE
112 access(all) fun payWage(driverId: UInt, wage: UFix64) {
113 pre {
114 TaxiRide.DriverFlowTokenVault[driverId] != nil: "Deposit destination is nil, so we can't send wage."
115 }
116 // Pay the wage.
117 let wage <- TaxiRide.account.storage.borrow<auth(FungibleToken.Withdraw) &{FungibleToken.Provider}>(from: /storage/flowTokenVault)!.withdraw(amount: wage) as! @FlowToken.Vault
118 TaxiRide.DriverFlowTokenVault[driverId]!.borrow()!.deposit(from: <- wage)
119 }
120 }
121
122 init() {
123 self.info = Info()
124 self.FlowTokenVault = self.account.capabilities.get<&{FungibleToken.Receiver}>(/public/flowTokenReceiver)
125 self.DriverFlowTokenVault = {}
126 self.totalDrivers = 0
127 self.account.storage.save( <- create Admin(), to: /storage/TaxiRideAdmin)
128 }
129}
130