一个简单的互助保险合约

type Storage= {
    participant: Array<string>,
    amount: int,
    owner: string
}

var M: Contract<Storage> = {}

function M:init()
    self.storage.participant=[]
    self.storage.amount=0
    self.storage.owner=caller_address --记录创建者
    pprint("contract init")
    emit event("contract init")
end

function M:on_deposit(amount: int)
    local in_flag: bool = false  --判断是否已经参与过合约
    for k,v in pairs(self.storage.participant) do
        if caller_address == v then
            in_flag = true
            break
        end
    end

    if in_flag == false then
        self.storage.participant[#self.storage.participant+1] = caller_address  --记录参与者
    end

    self.storage.amount = tointeger(self.storage.amount+amount)              --记录金额
    local deposit_info:string = tostring(caller_address).." transfered in,amount "..tostring(amount)..",sum "..tostring(get_contract_balance_amount()+amount)
    pprint("deposit info: ", deposit_info) 
    emit event(deposit_info)
end

function M:handle(address:string)
    if self.storage.owner ~= caller_address then --只允许创建者进行理赔
        pprint("caller_address is not the contract owner")
        pprint("caller_address: " , caller_address, " contract_owner_address: ", self.storage.owner)
        return
    end

    local in_flag: bool = false
    for k,v in pairs(self.storage.participant) do  --遍历参与者列表,只对在参与者列表中的地址进行理赔
        if address == v then
            in_flag = true
            local amount:int = math.floor(self.storage.amount/2)
            if amount > 10000000 then   --最高赔付100HSR
                amount = 10000000
            end
            local res=transfer_from_contract_to_address(address,"HSR",amount)
            self.storage.amount =self.storage.amount-amount
            pprint("amount: ", amount)             
            local pay_info = "pay to "..address..""..tostring(amount)
            pprint("pay info: ", pay_info)
            emit event("pay to "..address..""..tostring(amount))
        end
    end

    if in_flag == false then
        pprint("caller ", caller_address, " did not take part in this contract")
    end
end

function M:get_balance()
    pprint("contract balance: ", self.storage.amount)
end

function M:get_participator()
    pprint("contract participator:")
    for k,v in pairs(self.storage.participant) do
        pprint(v) 
    end
end

return M