/
bid_asset_ons.go
79 lines (64 loc) · 1.71 KB
/
bid_asset_ons.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package bid_data
import (
"github.com/Oneledger/protocol/action"
"github.com/Oneledger/protocol/data/ons"
)
var _ BidAsset = &DomainAsset{}
type DomainAsset struct {
domainName ons.Name
}
func (da *DomainAsset) ToString() string {
return string(da.domainName)
}
func (da *DomainAsset) ValidateAsset(ctx *action.Context, owner action.Address) (bool, error) {
// check if domain is valid
if !da.domainName.IsValid() || da.domainName.IsSub() {
return false, ErrInvalidDomain
}
// check domain existence
if !ctx.Domains.Exists(da.domainName) {
return false, ErrDomainNotExists
}
domain, err := ctx.Domains.Get(da.domainName)
if err != nil {
return false, ErrGettingDomain
}
// if domain is on sale
if domain.OnSaleFlag {
return false, ErrDomainOnSale
}
// if domain is belong to the owner
if !domain.Owner.Equal(owner) {
return false, ErrDomainOwnerUnmatch
}
// if domain is expired
if ctx.State.Version() >= domain.ExpireHeight {
return false, ErrDomainExpired
}
return true, nil
}
func (da *DomainAsset) ExchangeAsset(ctx *action.Context, bidder action.Address, preOwner action.Address) (bool, error) {
// change domain ownership
domain, err := ctx.Domains.Get(da.domainName)
if err != nil {
return false, ErrGettingDomain
}
if !domain.IsChangeable(ctx.Header.Height) {
return false, ErrDomainNotChangeable
}
domain.ResetAfterSale(bidder, bidder, 0, ctx.State.Version())
err = ctx.Domains.DeleteAllSubdomains(domain.Name)
if err != nil {
return false, err
}
err = ctx.Domains.Set(domain)
if err != nil {
return false, err
}
return true, nil
}
func (da *DomainAsset) NewAssetWithName(name string) BidAsset {
asset := *da
asset.domainName = ons.GetNameFromString(name)
return &asset
}