|
@@ -1,10 +1,10 @@
|
|
|
-import { sendAndFollowSudoNamedTx, sendAndFollowNamedTx } from './api'
|
|
|
+import { sendAndFollowSudoNamedTx, sendAndFollowNamedTx, getEvent } from './api'
|
|
|
import { getAlicePair } from './accounts'
|
|
|
import { KeyringPair } from '@polkadot/keyring/types'
|
|
|
-import { CodecArg } from '@polkadot/types/types'
|
|
|
import { ApiPromise } from '@polkadot/api'
|
|
|
import { BagId, DynamicBagType } from '@joystream/types/storage'
|
|
|
import logger from '../../services/logger'
|
|
|
+import BN from 'bn.js'
|
|
|
|
|
|
/**
|
|
|
* Creates storage bucket.
|
|
@@ -19,7 +19,7 @@ import logger from '../../services/logger'
|
|
|
* @param allowedNewBags - bucket allows new bag assignments
|
|
|
* @param sizeLimit - size limit in bytes for the new bucket (default 0)
|
|
|
* @param objectsLimit - object number limit for the new bucket (default 0)
|
|
|
- * @returns promise with a success flag.
|
|
|
+ * @returns promise with a success flag and the bucket id (on success).
|
|
|
*/
|
|
|
export async function createStorageBucket(
|
|
|
api: ApiPromise,
|
|
@@ -28,18 +28,21 @@ export async function createStorageBucket(
|
|
|
allowedNewBags = true,
|
|
|
sizeLimit = 0,
|
|
|
objectsLimit = 0
|
|
|
-): Promise<boolean> {
|
|
|
- return await extrinsicWrapper(() => {
|
|
|
+): Promise<[boolean, number | void]> {
|
|
|
+ let bucketId: number | void = 0
|
|
|
+ const success = await extrinsicWrapper(async () => {
|
|
|
const invitedWorkerValue = api.createType('Option<WorkerId>', invitedWorker)
|
|
|
|
|
|
- return sendAndFollowNamedTx(
|
|
|
- api,
|
|
|
- account,
|
|
|
- 'storage',
|
|
|
- 'createStorageBucket',
|
|
|
- [invitedWorkerValue, allowedNewBags, sizeLimit, objectsLimit]
|
|
|
- )
|
|
|
+ const tx = api.tx.storage.createStorageBucket(invitedWorkerValue, allowedNewBags, sizeLimit, objectsLimit)
|
|
|
+ bucketId = await sendAndFollowNamedTx(api, account, tx, false, (result) => {
|
|
|
+ const event = getEvent(result, 'storage', 'StorageBucketCreated')
|
|
|
+ const bucketId = event?.data[0] as BN
|
|
|
+
|
|
|
+ return bucketId.toNumber()
|
|
|
+ })
|
|
|
})
|
|
|
+
|
|
|
+ return [success, bucketId]
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -60,15 +63,11 @@ export async function acceptStorageBucketInvitation(
|
|
|
workerId: number,
|
|
|
storageBucketId: number
|
|
|
): Promise<boolean> {
|
|
|
- return await extrinsicWrapper(() =>
|
|
|
- sendAndFollowNamedTx(
|
|
|
- api,
|
|
|
- account,
|
|
|
- 'storage',
|
|
|
- 'acceptStorageBucketInvitation',
|
|
|
- [workerId, storageBucketId]
|
|
|
- )
|
|
|
- )
|
|
|
+ return await extrinsicWrapper(() => {
|
|
|
+ const tx = api.tx.storage.acceptStorageBucketInvitation(workerId, storageBucketId)
|
|
|
+
|
|
|
+ return sendAndFollowNamedTx(api, account, tx)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -80,35 +79,24 @@ export async function acceptStorageBucketInvitation(
|
|
|
* @param api - runtime API promise
|
|
|
* @param bagId - BagId instance
|
|
|
* @param account - KeyringPair instance
|
|
|
- * @param bucketId - runtime storage bucket ID
|
|
|
- * @param removeBucket - defines whether to remove bucket. If set to false
|
|
|
- * the bucket will be added instead.
|
|
|
+ * @param add - runtime storage bucket IDs to add
|
|
|
+ * @param remove - runtime storage bucket IDs to remove
|
|
|
* @returns promise with a success flag.
|
|
|
*/
|
|
|
export async function updateStorageBucketsForBag(
|
|
|
api: ApiPromise,
|
|
|
bagId: BagId,
|
|
|
account: KeyringPair,
|
|
|
- bucketId: number,
|
|
|
- removeBucket: boolean
|
|
|
+ add: number[],
|
|
|
+ remove: number[]
|
|
|
): Promise<boolean> {
|
|
|
return await extrinsicWrapper(() => {
|
|
|
- let addBuckets: CodecArg
|
|
|
- let removeBuckets: CodecArg
|
|
|
+ const removeBuckets = api.createType('StorageBucketIdSet', remove)
|
|
|
+ const addBuckets = api.createType('StorageBucketIdSet', add)
|
|
|
|
|
|
- if (removeBucket) {
|
|
|
- removeBuckets = api.createType('StorageBucketIdSet', [bucketId])
|
|
|
- } else {
|
|
|
- addBuckets = api.createType('StorageBucketIdSet', [bucketId])
|
|
|
- }
|
|
|
+ const tx = api.tx.storage.updateStorageBucketsForBag(bagId, addBuckets, removeBuckets)
|
|
|
|
|
|
- return sendAndFollowNamedTx(
|
|
|
- api,
|
|
|
- account,
|
|
|
- 'storage',
|
|
|
- 'updateStorageBucketsForBag',
|
|
|
- [bagId, addBuckets, removeBuckets]
|
|
|
- )
|
|
|
+ return sendAndFollowNamedTx(api, account, tx)
|
|
|
})
|
|
|
}
|
|
|
|
|
@@ -145,13 +133,9 @@ export async function uploadDataObjects(
|
|
|
expectedDataSizeFee: dataFee,
|
|
|
})
|
|
|
|
|
|
- return sendAndFollowSudoNamedTx(
|
|
|
- api,
|
|
|
- alice,
|
|
|
- 'storage',
|
|
|
- 'sudoUploadDataObjects',
|
|
|
- [data]
|
|
|
- )
|
|
|
+ const tx = api.tx.storage.sudoUploadDataObjects(data)
|
|
|
+
|
|
|
+ return sendAndFollowSudoNamedTx(api, alice, tx)
|
|
|
})
|
|
|
}
|
|
|
|
|
@@ -178,18 +162,11 @@ export async function acceptPendingDataObjects(
|
|
|
dataObjects: number[]
|
|
|
): Promise<boolean> {
|
|
|
return await extrinsicWrapper(() => {
|
|
|
- const dataObjectSet: CodecArg = api.createType(
|
|
|
- 'DataObjectIdSet',
|
|
|
- dataObjects
|
|
|
- )
|
|
|
-
|
|
|
- return sendAndFollowNamedTx(
|
|
|
- api,
|
|
|
- account,
|
|
|
- 'storage',
|
|
|
- 'acceptPendingDataObjects',
|
|
|
- [workerId, storageBucketId, bagId, dataObjectSet]
|
|
|
- )
|
|
|
+ const dataObjectSet = api.createType('DataObjectIdSet', dataObjects)
|
|
|
+
|
|
|
+ const tx = api.tx.storage.acceptPendingDataObjects(workerId, storageBucketId, bagId, dataObjectSet)
|
|
|
+
|
|
|
+ return sendAndFollowNamedTx(api, account, tx)
|
|
|
}, true)
|
|
|
}
|
|
|
|
|
@@ -209,15 +186,11 @@ export async function updateStorageBucketsPerBagLimit(
|
|
|
account: KeyringPair,
|
|
|
newLimit: number
|
|
|
): Promise<boolean> {
|
|
|
- return extrinsicWrapper(() =>
|
|
|
- sendAndFollowNamedTx(
|
|
|
- api,
|
|
|
- account,
|
|
|
- 'storage',
|
|
|
- 'updateStorageBucketsPerBagLimit',
|
|
|
- [newLimit]
|
|
|
- )
|
|
|
- )
|
|
|
+ return await extrinsicWrapper(() => {
|
|
|
+ const tx = api.tx.storage.updateStorageBucketsPerBagLimit(newLimit)
|
|
|
+
|
|
|
+ return sendAndFollowNamedTx(api, account, tx)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -238,15 +211,11 @@ export async function updateStorageBucketsVoucherMaxLimits(
|
|
|
newSizeLimit: number,
|
|
|
newObjectLimit: number
|
|
|
): Promise<boolean> {
|
|
|
- return extrinsicWrapper(() =>
|
|
|
- sendAndFollowNamedTx(
|
|
|
- api,
|
|
|
- account,
|
|
|
- 'storage',
|
|
|
- 'updateStorageBucketsVoucherMaxLimits',
|
|
|
- [newSizeLimit, newObjectLimit]
|
|
|
- )
|
|
|
- )
|
|
|
+ return await extrinsicWrapper(() => {
|
|
|
+ const tx = api.tx.storage.updateStorageBucketsVoucherMaxLimits(newSizeLimit, newObjectLimit)
|
|
|
+
|
|
|
+ return sendAndFollowNamedTx(api, account, tx)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -260,16 +229,12 @@ export async function updateStorageBucketsVoucherMaxLimits(
|
|
|
* @param bucketId - runtime storage bucket ID
|
|
|
* @returns promise with a success flag.
|
|
|
*/
|
|
|
-export async function deleteStorageBucket(
|
|
|
- api: ApiPromise,
|
|
|
- account: KeyringPair,
|
|
|
- bucketId: number
|
|
|
-): Promise<boolean> {
|
|
|
- return extrinsicWrapper(() =>
|
|
|
- sendAndFollowNamedTx(api, account, 'storage', 'deleteStorageBucket', [
|
|
|
- bucketId,
|
|
|
- ])
|
|
|
- )
|
|
|
+export async function deleteStorageBucket(api: ApiPromise, account: KeyringPair, bucketId: number): Promise<boolean> {
|
|
|
+ return await extrinsicWrapper(() => {
|
|
|
+ const tx = api.tx.storage.deleteStorageBucket(bucketId)
|
|
|
+
|
|
|
+ return sendAndFollowNamedTx(api, account, tx)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -290,15 +255,11 @@ export async function inviteStorageBucketOperator(
|
|
|
bucketId: number,
|
|
|
operatorId: number
|
|
|
): Promise<boolean> {
|
|
|
- return extrinsicWrapper(() =>
|
|
|
- sendAndFollowNamedTx(
|
|
|
- api,
|
|
|
- account,
|
|
|
- 'storage',
|
|
|
- 'inviteStorageBucketOperator',
|
|
|
- [bucketId, operatorId]
|
|
|
- )
|
|
|
- )
|
|
|
+ return await extrinsicWrapper(() => {
|
|
|
+ const tx = api.tx.storage.inviteStorageBucketOperator(bucketId, operatorId)
|
|
|
+
|
|
|
+ return sendAndFollowNamedTx(api, account, tx)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -309,10 +270,7 @@ export async function inviteStorageBucketOperator(
|
|
|
* after logging.
|
|
|
* @returns promise with a success flag.
|
|
|
*/
|
|
|
-async function extrinsicWrapper(
|
|
|
- extrinsic: () => Promise<void>,
|
|
|
- throwErr = false
|
|
|
-): Promise<boolean> {
|
|
|
+async function extrinsicWrapper(extrinsic: () => Promise<void>, throwErr = false): Promise<boolean> {
|
|
|
try {
|
|
|
await extrinsic()
|
|
|
} catch (err) {
|
|
@@ -343,15 +301,11 @@ export async function cancelStorageBucketOperatorInvite(
|
|
|
account: KeyringPair,
|
|
|
bucketId: number
|
|
|
): Promise<boolean> {
|
|
|
- return extrinsicWrapper(() =>
|
|
|
- sendAndFollowNamedTx(
|
|
|
- api,
|
|
|
- account,
|
|
|
- 'storage',
|
|
|
- 'cancelStorageBucketOperatorInvite',
|
|
|
- [bucketId]
|
|
|
- )
|
|
|
- )
|
|
|
+ return await extrinsicWrapper(() => {
|
|
|
+ const tx = api.tx.storage.cancelStorageBucketOperatorInvite(bucketId)
|
|
|
+
|
|
|
+ return sendAndFollowNamedTx(api, account, tx)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -370,15 +324,11 @@ export async function removeStorageBucketOperator(
|
|
|
account: KeyringPair,
|
|
|
bucketId: number
|
|
|
): Promise<boolean> {
|
|
|
- return extrinsicWrapper(() =>
|
|
|
- sendAndFollowNamedTx(
|
|
|
- api,
|
|
|
- account,
|
|
|
- 'storage',
|
|
|
- 'removeStorageBucketOperator',
|
|
|
- [bucketId]
|
|
|
- )
|
|
|
- )
|
|
|
+ return await extrinsicWrapper(() => {
|
|
|
+ const tx = api.tx.storage.removeStorageBucketOperator(bucketId)
|
|
|
+
|
|
|
+ return sendAndFollowNamedTx(api, account, tx)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -392,14 +342,12 @@ export async function removeStorageBucketOperator(
|
|
|
* @param fee - new fee
|
|
|
* @returns promise with a success flag.
|
|
|
*/
|
|
|
-export async function updateDataSizeFee(
|
|
|
- api: ApiPromise,
|
|
|
- account: KeyringPair,
|
|
|
- fee: number
|
|
|
-): Promise<boolean> {
|
|
|
- return extrinsicWrapper(() =>
|
|
|
- sendAndFollowNamedTx(api, account, 'storage', 'updateDataSizeFee', [fee])
|
|
|
- )
|
|
|
+export async function updateDataSizeFee(api: ApiPromise, account: KeyringPair, fee: number): Promise<boolean> {
|
|
|
+ return await extrinsicWrapper(() => {
|
|
|
+ const tx = api.tx.storage.updateDataSizeFee(fee)
|
|
|
+
|
|
|
+ return sendAndFollowNamedTx(api, account, tx)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -422,15 +370,11 @@ export async function setStorageOperatorMetadata(
|
|
|
bucketId: number,
|
|
|
metadata: string
|
|
|
): Promise<boolean> {
|
|
|
- return extrinsicWrapper(() =>
|
|
|
- sendAndFollowNamedTx(
|
|
|
- api,
|
|
|
- account,
|
|
|
- 'storage',
|
|
|
- 'setStorageOperatorMetadata',
|
|
|
- [operatorId, bucketId, metadata]
|
|
|
- )
|
|
|
- )
|
|
|
+ return await extrinsicWrapper(() => {
|
|
|
+ const tx = api.tx.storage.setStorageOperatorMetadata(operatorId, bucketId, metadata)
|
|
|
+
|
|
|
+ return sendAndFollowNamedTx(api, account, tx)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -449,15 +393,11 @@ export async function updateUploadingBlockedStatus(
|
|
|
account: KeyringPair,
|
|
|
newStatus: boolean
|
|
|
): Promise<boolean> {
|
|
|
- return extrinsicWrapper(() =>
|
|
|
- sendAndFollowNamedTx(
|
|
|
- api,
|
|
|
- account,
|
|
|
- 'storage',
|
|
|
- 'updateUploadingBlockedStatus',
|
|
|
- [newStatus]
|
|
|
- )
|
|
|
- )
|
|
|
+ return await extrinsicWrapper(() => {
|
|
|
+ const tx = api.tx.storage.updateUploadingBlockedStatus(newStatus)
|
|
|
+
|
|
|
+ return sendAndFollowNamedTx(api, account, tx)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -478,12 +418,11 @@ export async function updateStorageBucketStatus(
|
|
|
storageBucketId: number,
|
|
|
newStatus: boolean
|
|
|
): Promise<boolean> {
|
|
|
- return await extrinsicWrapper(() =>
|
|
|
- sendAndFollowNamedTx(api, account, 'storage', 'updateStorageBucketStatus', [
|
|
|
- storageBucketId,
|
|
|
- newStatus,
|
|
|
- ])
|
|
|
- )
|
|
|
+ return await extrinsicWrapper(() => {
|
|
|
+ const tx = api.tx.storage.updateStorageBucketStatus(storageBucketId, newStatus)
|
|
|
+
|
|
|
+ return sendAndFollowNamedTx(api, account, tx)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -507,15 +446,11 @@ export async function setStorageBucketVoucherLimits(
|
|
|
newSizeLimit: number,
|
|
|
newObjectLimit: number
|
|
|
): Promise<boolean> {
|
|
|
- return await extrinsicWrapper(() =>
|
|
|
- sendAndFollowNamedTx(
|
|
|
- api,
|
|
|
- account,
|
|
|
- 'storage',
|
|
|
- 'setStorageBucketVoucherLimits',
|
|
|
- [storageBucketId, newSizeLimit, newObjectLimit]
|
|
|
- )
|
|
|
- )
|
|
|
+ return await extrinsicWrapper(() => {
|
|
|
+ const tx = api.tx.storage.setStorageBucketVoucherLimits(storageBucketId, newSizeLimit, newObjectLimit)
|
|
|
+
|
|
|
+ return sendAndFollowNamedTx(api, account, tx)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -536,15 +471,11 @@ export async function updateNumberOfStorageBucketsInDynamicBagCreationPolicy(
|
|
|
dynamicBagType: DynamicBagType,
|
|
|
newNumber: number
|
|
|
): Promise<boolean> {
|
|
|
- return await extrinsicWrapper(() =>
|
|
|
- sendAndFollowNamedTx(
|
|
|
- api,
|
|
|
- account,
|
|
|
- 'storage',
|
|
|
- 'updateNumberOfStorageBucketsInDynamicBagCreationPolicy',
|
|
|
- [dynamicBagType, newNumber]
|
|
|
- )
|
|
|
- )
|
|
|
+ return await extrinsicWrapper(() => {
|
|
|
+ const tx = api.tx.storage.updateNumberOfStorageBucketsInDynamicBagCreationPolicy(dynamicBagType, newNumber)
|
|
|
+
|
|
|
+ return sendAndFollowNamedTx(api, account, tx)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -555,30 +486,22 @@ export async function updateNumberOfStorageBucketsInDynamicBagCreationPolicy(
|
|
|
*
|
|
|
* @param api - runtime API promise
|
|
|
* @param account - KeyringPair instance
|
|
|
- * @param cid - content ID (multihash)
|
|
|
- * @param removeCid - defines whether the cid should be removed from the
|
|
|
- * blacklist, cid is added when 'false'
|
|
|
+ * @param add - content IDs (multihash) to add
|
|
|
+ * @param remove - content IDs (multihash) to add
|
|
|
* @returns promise with a success flag.
|
|
|
*/
|
|
|
export async function updateBlacklist(
|
|
|
api: ApiPromise,
|
|
|
account: KeyringPair,
|
|
|
- cid: string,
|
|
|
- removeCid: boolean
|
|
|
+ add: string[],
|
|
|
+ remove: string[]
|
|
|
): Promise<boolean> {
|
|
|
return await extrinsicWrapper(() => {
|
|
|
- let addHashes: CodecArg
|
|
|
- let removeHashes: CodecArg
|
|
|
+ const removeHashes = api.createType('ContentIdSet', remove)
|
|
|
+ const addHashes = api.createType('ContentIdSet', add)
|
|
|
|
|
|
- if (removeCid) {
|
|
|
- removeHashes = api.createType('ContentIdSet', [cid])
|
|
|
- } else {
|
|
|
- addHashes = api.createType('ContentIdSet', [cid])
|
|
|
- }
|
|
|
+ const tx = api.tx.storage.updateBlacklist(removeHashes, addHashes)
|
|
|
|
|
|
- return sendAndFollowNamedTx(api, account, 'storage', 'updateBlacklist', [
|
|
|
- removeHashes,
|
|
|
- addHashes,
|
|
|
- ])
|
|
|
+ return sendAndFollowNamedTx(api, account, tx)
|
|
|
})
|
|
|
}
|